当前位置: 首页 > 科技观察

写Python脚本,一定要加上这个!

时间:2023-03-16 22:01:18 科技观察

使用Python的人经常会写一些脚本。无论是为了提高工作效率,还是为了满足一些特定的需求,Python脚本都是一个常见而有用的东西。不过最近发现了一个之前没有注意到的问题,就是是否在脚本中加入if__name__=="__main__":这个语句其实对脚本的使用影响还是很大的,还有很多知识在里面。常见误区很多朋友在写脚本的时候比较随意。简单的脚本直接写下来,没有函数,按顺序执行。对于复杂的脚本,可以添加函数。这种写法可读性较差,人们往往无法一眼就找到程序运行的入口和顺序。Python社区比较推荐的写法是在写脚本的时候加入如下语句:defmain():#dosomethingprint("dosomething.")if__name__=="__main__":main()大多数人看到这时候,你会不会说,怎么了,加不加没那么重要!忙不过来不屑,我们来仔细分解一下!在if__name__=='__main__'的功能之前指定有什么用,让我们通过一个简单的例子来直观感受一下。#const.pyPI=3.14deftrain():print("PI:",PI)train()#area.pyfromconstimportPIdefcalc_round_area(radius):returnPI*(radius**2)def计算():print("roundarea:",calc_round_area(2))calculate()看area.py的运行结果:PI:3.14roundarea:12.56PI变量,运行时,函数train在const.py中printin()也带过来了,我们只引用变量,不引用函数,所以这是我们不想看到的。这个问题的解决方法也很简单,我们只需要在const.py中加入一句:PI=3.14deftrain():print("PI:",PI)if__name__=="__main__":train()再次运行area.py,输出如下:roundarea:12.56这是我们预期的结果。从上面程序运行入口的例子可以发现,如果没有if__name__=="__main__":,文件导入为area.py时执行const.py中的所有代码,添加后它,只会运行代码的导入部分。这就是if__name__==”__main__”的明显作用:其实if__name__==”__main__”:相当于Python模拟的程序入口。由于模块之间相互引用,不同的模块可能有这样的定义,但入口程序只能有一个,选择哪个入口程序取决于__name__的值。再看一个小程序:print("lookhere")print(__name__)if__name__=='__main__':print("I'mtest.py")程序运行结果如下:lookhere__main__I'mtest.py可以发现此时变量__name__的值为__main__,所以打印“I'mtest.py”。如果运行其他文件,通过运行文件调用这个文件,语句不会打印出来,因为程序入口错误,语句不会执行。代码规范中有if__name__=="__main__":相当于Python程序也有一个入口函数,我们可以清楚的知道程序的逻辑从哪里开始,当然我们需要有意识的把开始的逻辑放在在这里编程。其实这个也是PyCharm推荐的。为什么很多优秀的编程语言,比如C、Java、Golang、C++,都有一个main入口函数?我认为最重要的原因之一是程序入口统一且易于阅读。多进程场景非常有用。如果你使用多个进程进行并行计算,代码如下:[1,2,3,4])print(results)运行这段代码,控制台会一直打印:processinginparallelprocessinginparallelprocessinginparallelprocessinginparallelprocessinginparallelprocessinginparallelprocessinginparallelprocessinginparallel程序会一直报RuntimeError。如果添加if__name__=="__main__":,程序将按预期工作:()asp:results=p.map(useful_function,[1,2,3,4])print(results)Python的多程序就是启动多个Python解释器,每个Python解释器都会导入你的脚本,复制一份供子进程使用的全局变量和函数,如果有if__name__=="__main__":,则后面的代码不会被导入,也不会重复执行。否则,创建多个进程的代码会被导入执行,从而无限递归创建子进程。总结if__name__=="__main__":虽然不是强制性的,但我强烈建议您遵循此规范。