在Python中定义Main函数

news2024/9/27 8:12:03

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

许多编程语言都有一个特殊的函数,当操作系统开始运行程序时会自动执行该函数。

这个函数通常被命名为main(),并且依据语言标准具有特定的返回类型和参数。

另一方面,Python解释器从文件顶部开始执行脚本,并且没有自动执行的特殊函数。

尽管如此,为程序的执行定义一个起始点有助于理解程序是如何运行的。Python程序员提出了几种方式对此进行实现。

本文结束时,您将了解以下内容:

  1. 什么是特殊的__name__变量以及Python中如何定义它

  2. 为什么要在Python中使用main()函数

  3. 在Python中定义main()函数有哪些约定

  4. main()函数中应该包含哪些代码的最佳实践

Python中的基本main()函数

一些Python脚本中,包含一个函数定义和一个条件语句,如下所示:

此代码中,包含一个main()函数,在程序执行时打印Hello World!。

此外,还包含一个条件(或if)语句,用于检查__name__的值并将其与字符串"main"进行比较。

当if语句为True时,Python解释器将执行main()函数。

更多关于Python条件语句的信息可以由此获得。

这种代码模式在Python文件中非常常见,它将作为脚本执行并导入另一个模块。

为了帮助理解这段代码的执行方式,首先需要了解Python解释器如何根据代码的执行方式设置__name__。

python资料、源码、教程\福利皆: 点击此处跳转文末名片获取

Python中的执行模式

Python解释器执行代码有两种方式:

通过命令行方式执行Python脚本。

将代码从一个文件导入另一个文件或者解释器。

更多内容可参考如何运行Python脚本。

无论采用哪种方式,Python都会定义一个名为__name__的特殊变量,该变量包含一个字符串,其值取决于代码的使用方式。

本文将如下示例文件保存为execution_methods.py,以探索代码如何根据上下文改变行为:

在此文件中,定义了三个对print()函数的调用。前两个打印一些介绍性短语。

第三个print()会先打印短语The value name is,之后将使用Python内置的repr()函数打印出__name__变量。

在Python中,repr()函数将对象转化为供解释器读取的形式。

上述示例通过使用repr()函数来强调__name__的值为字符串。

( 更多关于repr()的内容可参考Python文档。)

在本文中,您将随处可见文件(file),模块(module)和脚本(script)这三个字眼。

实际上,三者之间并无太大的差别。不过,在强调代码目的时,还是存在细微的差异:

  • 文件:通常,Python文件是包含代码的任何文件。大多数Python文件的扩展名为.py。

  • 脚本:Python脚本是基于命令行执行以完成某项任务的一类文件。

  • 模块:Python模块是从另一个模块、脚本或解释器中导入的文件。更多关于Python模块的内容可参考Python文档。

“如何运行Python脚本”一文也讨论了三者的差别。

基于命令行执行

在这类方法中,Python脚本将通过命令行来执行。

执行脚本时,无法与Python解释器正在执行的代码交互。

关于如何通过命令行执行代码的详细信息对本文而言并不重要,但您可以通过展开下框有关Windows,Linux和macOS之间命令行差异的内容。

命令行环境

不同的操作系统在使用命令行执行代码时存在细微的差异。

在Linux和macOS中,通常使用如下命令:

美元符号($)之前的内容可能有所不同,具体取决于您的用户名和计算机名称。

您键入的命令位于$之后。在Linux或macOS上,Python3的可执行文件名为python3,因此可以通过输入python3 script_name.py来运行python脚本。

在Windows上,命令提示符通常如下所示:

根据您的用户名,>之前的内容可能会有所不同,您输入的命令位于>之后。

在Windows上,Python3的可执行文件通常为python。

因此可以通过输入python script_name.py来运行python脚本。

无论哪种操作系统,本文的Python脚本的输出结果都是相同的。因此本文以Linux和macOS为例。

使用命令行执行execution_methods.py,如下所示:

在这个示例中,__name__具有值’main’,其中引号(')表明该值为字符串类型。

请记住,在Python中,使用单引号(')和双引号(")定义的字符串没有区别。

更多关于字符串的内容请参考Python的基本数据类型。

如果在脚本中包含"shebang行"并直接执行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,将会获取相同的结果。

您还可以通过向命令行添加-m参数的方法实现以模块的方式执行。

通常情况下,推荐如下方式pip: python3 -m pip install package_name。

添加-m参数将会运行包中__main__.py的代码。更多关于__main__.py文件的内容可参考如何将开源Python包发布到PyPI中。

在三种情况中,__name__都具有相同的值:字符串’main’。

技术细节:

Python文档中具体定义了__name__何时取值为’main’。

当通过标准输入,脚本或者交互提示中读取数据时,模块的__name__将取值为’main’。(来源)

name__与__doc,__package__和其他属性一起存储在模块的全局命名空间。更多关于属性的信息可参考Python数据模型文档,特别是关于模块和包的信息,请参阅Python Import文档。

导入模块或解释器

接下来是Python解释器执行代码的第二种方式:导入。

在开发模块或脚本时,可以使用import关键字导入他人已经构建的模块。

在导入过程中,Python执行指定模块中定义的语句(但仅在第一次导入模块时)。

要演示导入execution_methods.py文件的结果,需要启动Python解释器,然后导入execution_methods.py文件:

在此代码输出中,Python解释器执行了三次print()函数调用。

前两行由于没有变量,在输出方面与在命令行上作为脚本执行时完全相同。但是第三个输出存在差异。

当Python解释器导入代码时,__name__的值与要导入的模块的名称相同。

您可以通过第三行的输出了解这一点。__name__的值为’execution_methods’,是Python导入的.py文件。

注意如果您在没有退出Python时再次导入模块,将不会有输出。

注意:更多关于导入在Python中如何工作的内容请参考官方文档和Python中的绝对和相对导入。

英文原文:https://realpython.com/python-main-function/

Python学习交流群:926207505

译者:我是昵称耶~

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DC-7靶机

DC-7靶机地址 同样的,把靶机跟kali放在同一网段,(NAT模式) 主机发现 arp-scan -l端口扫描 nmap -A -T4 -p- 192.168.80.13922端口开始,80端口开启 浏览器先访问一下靶机的80端口 熟悉的Drupal站点 先爆破一下目录…

【Linux】详解进程状态之僵尸进程——孤儿进程

目录 🌞专栏导读 🌛什么是进程 ⭐什么是PCB? 🌛查看进程 🌛如何通过系统调用查看进程PID 🌛fork 🌞认识进程状态 🌛查看进程状态 🌛R状态 ⭐例如&#xff1a…

C 语言的 ctype.h 头文件

C 语言的 ctype.h 头文件包含了很多字符函数的函数原型, 可以专门用来处理一个字符, 这些函数都以一个字符作为实参. ctype.h 中的字符测试函数如表所示: 这些测试函数返回 0 或 1, 即 false 或 true. ctype.h 中的字符映射函数如表所示: 字符测试函数不会修改原始实参, 只会…

YOLOV5改进:更换为MPDIOU,实现有效涨点!

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:更换为MPDIOU,实现有效涨点! 目录…

C++代码生成静态LIB链接库及其调用方法

1、在进行C代码移植时可将CPP文件封装为静态lib链接库,本文章讲述了如何将cpp文件封装为lib文件。 2、假设有文件a.cpp、a.h、b.cpp、b.h以及main.cpp,假设main调用了b,b调用了a。现在需要将a.cpp以及b.cpp封装为a.lib以及b.lib。 3、在VS2…

Java8中forEach()里使用return的效果

先总结:使用forEach()处理集合时不能使用break和continue这两个方法,可以使用无返回值的return跳出此次循环,效果同标准for循环的continue。 首先,forEach()先对入参判空,然后使用增强for循环调用action.accept(t)&am…

VGG16模型详解

VGG16模型详解 0、VGG16介绍 VGG16是一种深度卷积神经网络,由牛津大学的研究团队于2014年开发。 VGG16在2014年的ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 竞赛中取得了显著的成绩。它在图像分类任务中获得了当年的第二名,其准确…

【Java可执行命令】(二十一)线程快照生成工具 jstack:帮助开发人员分析和排查线程相关问题(死锁、死循环、线程阻塞...)

Java可执行命令之jstack 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 使用步骤及技巧3.3 使用案例 4️⃣ 应用场景🌾 总结 1️⃣ 概念 jstack 命令是 Java Development Kit(JDK)中提供的一项诊断工具,用于生成Java虚拟…

震坤行工业超市旗下震坤行智能制造(苏州)有限公司开工奠基仪式圆满成功

震坤行工业超市旗下震坤行智能制造(苏州)有限公司开工奠基仪式圆满成功 2023年7月3日,震坤行工业超市于太仓港经济技术开发区举行了震坤行智能制造(苏州)有限公司项目奠基动工仪式。震坤行董事长兼CEO陈龙&#xff0c…

基于OFDM通信系统的低复杂度的资源分配算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................%子载波分配[~,po…

Grafana技术文档-概念-《十分钟扫盲》

Grafana官网链接 Grafana: The open observability platform | Grafana Labs 基本概念 Grafana是一个开源的度量分析和可视化套件,常用于对大量数据进行实时分析和可视化。以下是Grafana的基本概念: 数据源(Data Source)&#…

idea+gradle阅读spring5.2.9源码之源码构建报错解决方案

注意 1、先确保gradle版本和spring、jdk版本对应 本文:gradle:5.6.4/spring 5.2.9/jdk1.8(gradle和jdk都要先安装好,gradle还要配置好本地资源文件路径) 2、原来项目乱了的话,先重新导入下载的源码项目 3、进入源码所在根目录&…

【iOS】autoreleasepool

来说一下最近在了解的autoreleasepool吧&#xff0c;我们可能平时书写过许多脑残代码&#xff0c;其有很多的缺陷但是我们可能当时学的比较浅就也不太了解&#xff0c;就像下面这样的&#xff1a; for (int i 0; i < 1000000; i) {NSNumber *num [NSNumber numberWithInt…

【前端 | CSS】aligin-items与aligin-content的区别

align-items 描述 CSS align-items 属性将所有直接子节点上的 align-self 值设置为一个组。align-self 属性设置项目在其包含块中在交叉轴方向上的对齐方式 align-items是针对每一个子项起作用&#xff0c;它的基本单位是每一个子项&#xff0c;在所有情况下都有效果&…

【uniapp】原生子窗体subNvue的使用与踩坑

需求 最近接到个需求, 需要在video组件上弹出弹窗, 也就是覆盖video这个原生组件 未播放时, 弹窗可以覆盖, 但是当video播放时, 写的弹窗就覆盖不了了 因为video是原生组件, 层级非常高, 普通标签是覆盖不了的, map标签同理 覆盖原生组件, 官方给出解决办法一. 使用cover-view…

文件传输软件常见问题解决办法大全

文件传输软件是我们工作中不可缺少的一种工具&#xff0c;它可以帮助我们快速、安全、稳定地传输各种文件&#xff0c;如文档、图片、视频等。但是在使用文件传输软件的过程中&#xff0c;我们也可能会遇到一些问题&#xff0c;影响我们的工作效率和传输质量。那么&#xff0c;…

【陈老板赠书活动 - 10期】- 【Python之光:Python编程入门与实战】

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。讲一些我刚进公司的学…

【ARM Cache 系列文章 9 番外篇 -- ARMv9 系列 Core 介绍】

文章目录 ARMv9 系列CoreARM Cortex-A510 介绍ARM Cortex-A715ARM Cortex-A720 ARMv9 系列Core 2021年5月Arm公布了其最新3款CPU和3款GPU核心设计&#xff0c;三款新CPU分别是旗舰核心Cortex-X2、高性能核心Cortex-A710、高能效核心Cortex-A510 CPU&#xff0c;三款新GPU核心则…

【Linux】深入探索Linux信号

目录 写在前面的话 什么是信号 生活中的信号 Linux下的信号 Linux常见信号 Core核心转储 信号如何产生 键盘组合键 1.如何理解信号被进程保存 2.如何理解信号发送的本质 通过系统调用向进程发送信号 kill() 手动实现kill指令 raise() abort()[非系统调用…

Django ORM 框架中的表关系,你真的弄懂了吗?

Django ORM 框架中的表关系 为了说清楚问题&#xff0c;我们设计一个 crm 系统&#xff0c;包含五张表&#xff1a; 1.tb_student 学生表 2.tb_student_detail 学生详情表 3.tb_salesman 课程顾问表 4.tb_course 课程表 5.tb_entry 报名表 表关系和字段如下图&#xff1a…