查看: 11  |  回复: 0
  py 中def main():会得到优先执行吗?还有 if __name__ == __main__ 是啥意思
楼主
发表于 2025年4月22日 13:31

在 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 函数,可能会带来一些不必要的执行。


您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2025 MaNongKu.com