能否讲解一下关于程序入口

来源:5-4 字符串格式化的常用格式符

qq_夏日青枫_0

2020-07-17 01:37:06

之前在课程视频中可以看到有 if __name__ == '__main__':   这一句代码,现在课程中不怎么经常见了。最近通过关注一些python公众号,在公众号里看到一篇关于这句入口代码的内容,文章中指出不建议编写这句,那能否请老师详细解答一下这句代码的具体含义?以及具体作用?谢谢

写回答

6回答

hackerdream0810

2020-07-28

首先,绝大部分的模块代码创建的目的是为了被别人import,而不是作为独立执行的脚本。而主程序代码无论模块是被导入import,还是被直接执行都会运行。所以我们必须要知道模块如何决定运行方向。举个例子,比如你只想访问使用那些位于其他程序中的代码,而不是想运行那个整体程序,那么就需要这个main函数。如果模块是被导入import的,__name__的值为模块的名字。如果模块是被直接执行的,__name__的值就是__main__。然后最后多说一句,通常只有主程序中有大量的顶级可执行代码,所有其他被导入的模块只应该有很少的顶级执行代码,所有的功能代码都应该封闭在函数或者类当中。

1
hackerdream0810
h 封装在函数或者类当中。打错个字。
h020-07-28
共1条回复

杨仔_小月

2020-10-07

对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。C,C++都需要有一个main函数作为程序的入口,也就是程序的运行会从main函数开始。同样,Java,C#必须要有一个包含Main方法的主类,作为程序入口。

而Python则不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。

由于经常会在文件中调用其他的文件作为模块引入,所以这相当于是用于区分当前文件是作为调用其他文件、模块的文件,还是被其他文件所调用的文件。这个__name__是一个属性,是属于这个文件的属性,这个属性值会随着该文件的状态发生改变。这个状态指的是该文件是主文件还是被当作模块引入其他的文件中。所以当__name__值为‘__main__’时,表示当前文件是作为主文件的,那么使用if __name__ == ‘__main__’就会执行其中的语句。而如果当前文件是被其他文件所调用时,__name__的值是该文件名,所以此if语句块则不会被执行。

所以利用这个__name__属性,可以很好地实现,该文件本身能运行,也能被当作模块引入其他文件中,并且不发生冲突矛盾。

其实这也反映了OOP的思想,一切事物皆为对象。所以文件也是对象。作为对象必然具有相应的属性、方法...所以实际上if __name__ == ‘__main__’:这个程序入口就是再利用文件这个对象具有的属性来完成想要的功能。


0

Discovery0

2020-09-28

这个入口给你自己测试而已

0

rtzonly

2020-07-25

if __name__ == '__main__' :   写在上面的可作为变量,方法,函数

if __name__ == '__main__' :   写在下面的作为想执行的步骤和想获取的东西

0

好帮手慕燕燕

2020-07-17

同学可以尝试着按老师的示例创建两个python文件操作一遍,看能否理解,实现过程中有问题可继续提问,加油,祝学习愉快~~~~

0

好帮手慕燕燕

2020-07-17

同学你好,__name__是模块的名称,当.py文件被直接运行时,if __name__ == '__main__'之后的代码块将被运行;当.py文件以模块形式被导入时,if _name_ == '__main__'之后的代码块不被运行。

例如:我们有一个 test.py 文件,内容如下:

PI = 3.14
def main():
   print("PI:", PI)
main()
# 程序运行结果 :PI: 3.14

我们还有一个 area.py 文件,用于计算圆的面积,该文件里边需要用到 test.py 文件中的 PI 变量,那么我们从 test.py 中把 PI 变量导入到 area.py 中

from test import PI
def calc_round_area(radius):
   return PI * (radius ** 2)

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

main()
# 程序运行结果:
# PI: 3.14
# round area:  12.56

可以看到,test中的 main 函数也被运行了,实际上我们是不希望它被运行。这时,if __name__ == '__main__' 就派上了用场。把 test.py 改一下:

PI = 3.14
def main():
   print("PI:", PI)
   
if __name__ == "__main__":
  main()
# 程序运行结果 :PI: 3.14

然后再运行 area.py,输出如下:round area:  12.56

if __name__ == '__main__' 就相当于是 Python 模拟的程序入口。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。

加油,祝学习愉快~~~~

0
hq_夏日青枫_0
h 繁琐,没看懂。不如公众号文章中写的通俗易懂
h020-07-17
共1条回复

0 学习 · 2433 问题

查看课程