Python中的if name “main” 是什么意思?
本文解释了Python代码表达式 if __name__ == '__main__' 的含义。
Python程序使用条件if __name__ == '__main__'仅在Python解释器直接运行程序时运行if语句中的代码。当文件的代码作为模块导入时,if语句中的代码不会被执行。
更多Python相关文章,请阅读:Python 教程
main是什么?
在Python中,__name__表示唯一的变量。
Python有许多以双下划线开头和结尾的特殊变量。它们被称为dunder以简化书写(即Double Underscores)。在这种情况下,__name__发音为“dunder name”。
让我们使用Python shell确定__main__的值 –
>>> __name__
'__main__'
因此,__name__的值是__main__。
让我们尝试导入Python模块,以查看分配给模块的__name__变量的值 –
>>> import random
>>> random.__name__
'random'
因此,在导入random模块后,我们可以看到__name__的值是“random”,这基本上是它的名称。
Python name变量值
创建以下代码并将其放入文件__name__ main.py中 –
print(" __name__ value is {}".format(__name__))
一个单独的打印命令,使用字符串格式化方法输出__name__的值。
当我们通过引用Python文件直接运行代码时,__name__的值为__main__ –
$ python __name__main.py
The value of __name__ is __main__
相反,如果我们通过Python shell导入模块,__name__的值就是__name__ main –
>>> import _name_main
__name__ value is __name__main
因此,name的值取决于我们的Python代码如何执行。
__name__的示例
要在Python中使用条件if __name__==“__main__”,可以创建如下所示的Python程序,通过它调用三个不同的函数 –
def step1():
print("执行第一步...")
def step2():
print("执行第二步...")
def step3():
print("执行第三步...")
step1()
step2()
step3()
输出结果
以下是以上代码的输出结果 –
执行第一步...
执行第二步...
执行第三步...
现在假设另一个Python应用程序需要使用step1函数()。我们需要导入文件作为模块来实现。
当我们这样做时会发生以下情况 –
>>> import _name_main
执行第一步...
执行第二步...
执行第三步...
>>> _name_main.step1()
执行第一步...
在导入模块之后,可以调用step1()函数。问题在于,导入模块时会自动执行以下三行代码 −
step1()
step2()
step3()
那么问题是,如何防止这种情况的发生?
当模块被导入时检查__name__是否等于__main__
我们可以验证__name__的值是否等于__main__来避免前一节中所看到的行为。
这样,仅在直接调用该Python文件时才运行if条件中的代码,而不是在导入为模块时运行。
示例
现在,程序如下 −
def step1():
print("执行第一步...")
def step2():
print("执行第二步...")
def step3():
print("执行第三步...")
if __name__ == "__main__":
step1()
step2()
step3()
输出
让我们检查直接调用Python程序是否仍会调用三个函数
执行第一步...
执行第二步...
执行第三步...
此外,当我们将其导入为模块时,不会执行这三个函数 7minus;
>>> import _name_main
>>> _name_main.step1()
执行第一步...
这次要好得多!
考虑到_name_main模块具有数百个函数,而并非您要导入的所有函数。
如何简单地导入step1()函数?
应使用以下语法 −
>>> from _name_main import step1
>>> step1()
执行step1...
>>> step2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'step2' is not defined
如您所见,在此示例中,我们只导入了函数step1的成功版本。
尝试运行step2()时将出现NameError: name’step2′ is not defined。
Python中的主要方法
在Java或C等语言中,主要方法的概念非常普遍,并指定程序执行的起始点。
main() 函数在if语句内执行并验证__name__变量的值。
为了获得特定结果,会在 main() 函数中调用多个函数。在我们的情况下,main函数会调用三个子函数 − 示例
现在,程序如下 −
def step1():
print("执行第一步...")
def step2():
print("执行第二步...")
def step3():
print("执行第三步...")
def main():
step1()
step2()
step3()
if __name__ == "__main__":
main()
输出
我们现在调用该程序 −
执行第一步...
执行第二步...
执行第三步...
在上述代码中,main()函数是程序的主要逻辑,并且在if语句中被执行。在该例中,我们仍然具有与上面例子中相同的模块名,但我们通过添加main()函数来实现分离”真正”代码和模块导入时执行的代码。
def step1():
print("执行第一步...")
def step2():
print("执行第二步...")
def step3():
print("执行第三步...")
def main():
step1()
step2()
step3()
if __name__ == "__main__":
main()
输出
执行第一步...
执行第二步...
执行第三步...
由于main的概念也被其他开发人员广泛知晓,将函数命名为main()只是一种标准命名约定,以提高程序的可读性。
实际上,我们可以把main函数改名为其他名字。
在继续本文之前,请验证我们修改后的代码在以下两种情况下都能正常工作:
- 代码的直接执行
- 模块的导入
Python中的 name、main和参数
我们可以在判定变量__name__是否等于 __main__的if条件语句中直接处理传递给Python程序的任何参数。
我们可以使用 sys模块 来处理传递给程序的参数。
- 导入sys模块。
-
创建一个名为main()的函数,该函数只接受一个参数。这个参数由一个包含程序运行时提供的参数的字符串列表组成。
-
在if语句中将sys.argv提供给main()函数。
例子
import sys
def main(args):
print(args)
if __name__ == "__main__":
main(sys.argv)
输出
以上执行程序的输出如下:
['main.py']
如你所见,Python程序的第一个参数是.py文件的名称本身。
让我们修改main方法,使其打印args变量的类型。
def main(args):
print(type(args))
print(args)
这证明args是一个列表 –
$ python arguments.py arg1 arg2
<class 'list'>
['arguments.py', 'arg1', 'arg2']
除了提供参数,我们还可以解包我们的程序需要的参数,将程序名称排除在外 –
导入 sys
定义 main(c, d):
返回 int(c) * int(d)
如果 __name__ == "__main__":
arg1, arg2 = sys.argv[1:3]
print(main(arg1, arg2))
这是执行程序和接收到的结果的步骤−
$ python product.py 4 5
20
命令行中给出的两个数字由此代码使用切片运算符获取。 然后,仍然以字符串格式将这两个数字提供给main()方法。
将两个数字转换为整数的结果由main函数返回。
极客教程