在 Python 里,def main(): 并不会被优先执行。下面详细解释其中的原因:
Python 代码执行顺序
Python 是一种解释型语言,代码按照从上到下的顺序逐行执行。当你定义一个函数,像 def main(): 这样,仅仅是创建了一个函数对象,函数内部的代码并不会立刻执行,只有在调用该函数时,其内部代码才会被执行。
以下代码展示了函数定义和执行的顺序:
print("这是代码开头")
def main():
print("main 函数被调用")
print("main 函数定义之后,调用之前")
main() # 调用 main 函数
print("main 函数调用之后")
运行结果:
这是代码开头
main 函数定义之后,调用之前
main 函数被调用
main 函数调用之后
在 Python 里,常使用以下结构来模拟 main 函数优先执行:
def main():
print("main 函数被调用")
main()
print("main 函数调用之前")
print("main 函数调用之后")
但是,main必须先定义,否则出错:
main()
print("main 函数调用之前")
print("main 函数调用之后")
def main():
print("main 函数被调用")
运行结果:
Traceback (most recent call last):
File "d:\DataUP\py\test.py", line 2, in <module>
main()
^^^^
NameError: name 'main' is not defined. Did you mean: 'min'?
--------------------------------------------------------
我没写现在来看下:
if __name__ == "__main__"
的意思。
代码示例对比
第一段代码:
def main():
print("main 函数被调用")
if __name__ == "__main__":
main()
print("main 函数调用之前")
print("main 函数调用之后")
第二段代码:
def main():
print("main 函数被调用")
main()
print("main 函数调用之前")
print("main 函数调用之后")
区别分析
1. 作为脚本直接运行时
当把这两段代码保存为 .py 文件并直接在命令行中运行,二者的执行效果是一样的。因为在直接运行脚本时,__name__ 的值为 "__main__",所以第一段代码中的 if __name__ == "__main__": 条件满足,会执行 main() 调用 main 函数;第二段代码直接调用 main() 也会执行 main 函数。
2. 作为模块被导入时
当这两段代码作为模块被其他 Python 脚本导入时,区别就显现出来了。
第一段代码:当作为模块被导入时,__name__ 的值不再是 "__main__",而是模块的名称,所以 if __name__ == "__main__": 条件不满足,main() 不会被执行。这样就可以避免在导入模块时执行不必要的代码,仅在直接运行该脚本时才执行 main 函数。
示例,假设上述第一段代码保存为 test1.py,另一个脚本 import_test.py 如下:
import test1
运行 import_test.py 时,不会输出 "main 函数被调用",只会在直接运行 test1.py 时才会执行 main 函数。
第二段代码:当作为模块被导入时,main() 会直接被执行,因为没有 if __name__ == "__main__": 这样的判断条件来控制。
示例,假设上述第二段代码保存为 test2.py,import_test.py 如下:
import test2
运行 import_test.py 时,会输出 "main 函数被调用",因为在导入 test2 模块时,模块中的 main() 会直接被执行。
综上所述,第一段代码更适合将脚本既作为可执行脚本又作为模块来使用,而第二段代码在作为模块导入时会直接执行 main 函数,可能会带来一些不必要的执行。