首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python中的 if __name__ == '__main__' 是干嘛的?

如果你写过Java,就一定知道 public static void main 这个如绕口令一般的程序入口函数,即使写一个hello world也不可避免:

相比之下 Python 就简单多了,0帧起手,直接 print:

print('Hello World!')

但如果你的Python练习时长超过2周半,就一定见过这样的写法:

不管是教程里的示例、Github上别人的项目、还是AI生成的代码,都可能出现这行判断语句。

看起来很像Java或C++等语言里程序入口的main函数。

可既然Python不需要入口函数,为何还要多此一举加上这一句?

而且,print一下这个 __name__ 变量就会发现,不管放在程序的哪个位置,它的值都是 字符串 '__main__',那么这个 if 条件判断岂不是毫无意义?

先别着急,在搞清楚这行代码前,我先问你个问题:

一个py代码文件,可以怎样执行?

青铜选手都知道,点击IDE里的运行按钮就可以执行一个py文件。

白银选手会告诉你,也可以在控制台下通过python命令执行代码。

假如你达到了黄金以上,肯定还知道,一个py文件也是一个模块,可以像其他库一样被import导入到另一个py文件中。而被导入的同时,文件中的代码也会被执行。

现在,在被导入的代码中输出这个 __name__ 变量,有趣的事情发生了

输出的结果不再是 __main__,而成了 hello

看到这里,你明白了吗?

双下划线name这个变量:

如果所在代码是直接被运行,不管是通过IDE,还是命令行,它的值都是字符串 __main__

如果所在代码是被别的代码调用执行,比如作为模块导入,它的值就是所在文件的文件名

所以,if __name__ == '__main__': 这个判断,不是用来指定程序的入口,而是判断当前的文件是否是被直接运行

那它有什么用呢?

对于一些既需要直接运行,又可能作为模块被其他代码复用的文件,就可以通过这个判断,来控制在不同情况下执行不同的代码。

另外,也有很多模块,会把调用的示例或者测试的代码放在这个条件判断里,既方便,又不影响使用。

如果只是写一些自己用的小脚本,不会被import,比如课程作业,那就没有这么写的必要了。

不过钻石选手要说了:程序被调用执行的情况并不只有import导入这一种。

比如这个采用进程池创建多进程的代码,如果直接这么运行,你的IDE就会卡到爆炸。

import multiprocessing

def task(n): print('Processing', n) return n * n

with multiprocessing.Pool() as pool: tasks = range(5) results = pool.map(task, tasks)print(results)

因为每个进程都会重新执行整个脚本,再次创建一堆新的进程,直到榨干你的电脑。

这时候同样可以通过对 __name__ 的判断,让子进程不要执行创建进程的代码:

总结一下:

python代码中 __name__ 这个变量的值,在直接运行时是字符串 "__main__"。

代码在被导入或者创建子进程执行时, __name__ 的值就是所在的文件名。

可以通过 if __name__ == '__main__': 条件判断来区分不同的执行方式,增强了代码的灵活性和可维护性。

在初学编程时,可以不去用它,或者简单地照葫芦画瓢。

出于一名程序员的自我修养,应该知其然更知其所以然,并在合适的场景下使用它,让你的代码更加鲁棒和优雅。

Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】

Crossin的其他书籍:

感谢转发点赞的各位~

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OUgl6cw4_orCWFx8Pmo4eCzA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券