如何理解python中的if __name__ == "__main__":

如何理解python中的if name == “main”:

前言

使用别人的工具的时候,不知道哪里出了错,于是仔细看代码,在可能出现的模块之前加上了print(“test”),但是就是不能显示输出信息。于是溯源,最后追溯到最前面的

if __name__ == "__main__":
	main()

然后发现自己不懂,由于对python的模块(module)不是很清楚,决定好好把这个知识点理清。

问题

  • __name__是什么
  • __main__又是什么,为什么要加双引号

__name__和__main__都是python的内置函数模块(模块是指以.py结尾写好的函数的汇总)。

  • 这段代码放在程序最后作用又是什么

两个作用:一是入口点作用;二是防止在import的时候执行可执行的程序。

知识点

  • 模块(module)

一个模块被另一个程序第一次引入时,这个模块下可以被解释器直接执行的函数将运行。

# const.py
PI = 3.14

def test():
    print("PI:", PI)

test()
print("haha")
# 运行结果:PI: 3.14
# 运行结果:haha

如果在命令行执行

py -c "import const"

其输出将和运行const.py的结果是相同的。

类似地,当在const.py这个模块被另一个程序(如area[.]py)第一次引入时,test()和print(“haha”)将会运行。

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print("round area: ", calc_round_area(2))

main()

#输出结果
#PI: 3.14
#haha
#round area:  12.56

理清思路

现在我们在运行程序area.py,调用了const.py里的PI常量。
但是现在我们不想让const.py中的函数test()和print()执行。

谁来拯救你?

这个时候我们的标题中的主角要登场了,他/她就是

if __name__ == "__main__":

通过在const.py中加入这句话,我们可以防止const.py里的test()在被导入的时候执行。
完整的代码如下

# const.py
PI = 3.14

def test():
    print("PI:", PI)

if __name__ == "__main__":
	test()
	print("haha")

# 运行结果:
# PI: 3.14
# haha
# area.py
from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main1():
    print("round area: ", calc_round_area(2))

main1()

结语

看到网上很多都是在后面加一个main()函数,这里的名称只是约定俗成,我在代码中特意改成test, main1,都可以运行。
至于为什么是main,这是因为从其他编程语言沿袭过来的程序入口点概念。C,C++, Java都以main函数为主函数入口点,而python没有硬性规定这个概念,所以在用这样的方式来实现入口点的作用。
也就是说,写的函数可以全部是用def定义,然后再定义一个main,指向其中一个def定义的函数。
总的来说,关键点是import的时候会执行模块中的函数,掌握了这个知识点对模块也就理解更深了。

参考

菜鸟教程——Python3模块
Python 中的 if name == ‘main’ 该如何理解
W3CSchool_Python Modules

补充

最后凭借这些知识点,终于找到为什么print无输出,因为加了

sys.stdout = sys.stdout.reconfigure(encoding='utf-8')

似乎终端不兼容格式,所以不输出显示。

猜你喜欢

转载自blog.csdn.net/shenpanzhimao/article/details/83959785