if __name__=='__main__': 有什么用
if __name__=='__main__':
每个python模块(Python文件)都包含一个内置的变量__name__,里面存储着当前模块名。
当模块被直接在shell中执行时,当前模块名为:"__main__"
当模块被导入到其他Python文件时,当前模块名为:当前文件名称(.py)
即,当文件被导入时,不执行if里面的语句。
if __name__=='test':
print('谢谢你导入了test')
如果模块(.py)文件中有上面的代码,则表示当该模块被导入程序中时被执行的代码。
而该文件直接运行时,不会执行该代码。
在程序第一次导入指定文件时,会执行三个步骤:
1,找到模块文件。
注意:1,导入时不需要加上文件的路径
2,导入时不需要加上文件的后缀名
2,编译成字节码
(在内存中构建module类的实例,模块对象,对象名称为全局变量test)
(模块变量名(文件名)不能是python中的关键字和内置函数名)
(并非所有的py文件都会生成编译得到的pyc文件,对于那些只执行一次的程序文件,会将内存中的编译结果在执行完成后直接丢弃)
(比如使用compileall模块可以强制编译成pyc文件)
(另外,运行字节码pyc文件并不会比直接运行py文件更快,执行它也一样是一行行地解释、执行,唯一快的地方在于导入装载的时候无需重新编译而已。)
3,执行模块的代码
(执行模块文件(已完成编译)的时候,按照一般的执行流程执行:一行一行地、以代码块为单元执行。一般地,模块文件中只用来声明变量、函数等属性,以便提供给导入它的模块使用,而不应该有其他任何操作性的行为,比如print()操作不应该出现在模块文件中,但这并非强制。)
(执行完模块文件后,这个模块文件将有一个自己的全局名称空间,在此模块文件中定义的变量、函数等属性,都会记录在此名称空间中。)
import使用一个变量名引用整个模块对象,
from将模块中的变量名复制到程序中
导入只发生一次,当第二次导入时,不会执行上面三个步骤