引子
要搞清楚这个问题, 可以先听一个故事~~~
像我们做事一样, 都需要一个起始点, 终点存在与否无关紧要. 编程也是一样, 任何程序都有一个入口, 在所谓的静态编译语言中, 如 Java 的入口是一个名字叫做 Main 的类, 所有的程序都必须从这里开始运行, 因此读别人的 Java 代码很方便, 直接找入口就可以了. 而 Python 这种动态解释型的语言不一样, 他的入口就是程序的第一行, 从代码开始书写的地方一直读到程序末尾, 这就很有意思了, 为了让程序员读别人的代码更方便, 也为了让程序输出更为简洁, 约定俗成了一种规范, 即模仿 Java, 使用 if __name__ == '__main__'给程序设定一个入口.
if __name__ == '__main__'是为了使 Python 更优雅而约定俗成的一个程序入口.
但是, 这个程序入口和 Java 略有不同:
Java 强制程序所有的输入输出, 流程控制等都在 Main 类里面;
Python 只是使用
if __name__ == '__main__'
保证不是同一个模块的输入输出, 流程控制等不相互影响.
分步骤详细举例说明
什么是__name__?
新建一个 Python 程序, a.py
- # a.py
- print('a.py':__name__)
输出:
a.py:__main__
再新建一个 Python 程序, b.py
- # b.py
- import a
- # 当前程序包的名字
- print('b.py':__name__)
- # b.py 程序的名字
- print('a.py':a.__name__)
运行 b.py, 输出:
- b.py:__main__
- a.py:a
小结
__name__是程序的名称, 当前运行程序的__name__是__main__, 非当前运行程序的名称为程序的模块名称, 即自定义值.
如果程序里面含有程序入口, 那么程序如何执行呢?
即 Python 只是使用 if __name__ == '__main__'保证不是同一个模块的输入输出, 流程控制等不相互影响. 如何解释呢?
- # a.py
- print('01: 首先执行这一行代码')
- if __name__ == '__main__':
- print('02: 然后执行这一行代码')
运行 a.py, 输出:
01: 首先执行这一行代码
02: 然后执行这一行代码
以上说明, python 是顺序执行的, 这个所谓的程序入口并不能改变执行顺序.
如果程序长这样呢?
- # a.py
- print('a-01: 这是 a 程序的输出')
- --------------------------
- # b.py
- import a
- if __name__ == '__main__':
- print('b-01: 这是 b 程序的输出')
运行 b.py, 输出:
a-01: 这是 a 程序的输出
b-01: 这是 b 程序的输出
可见, 又一次证明程序是顺序执行的, 而且程序入口并没有起作用.
那么, 这个程序入口的作用是什么呢?
- # a.py
- if __name__ == '__main__':
- print('a-01: 这是 a 程序的输出')
- --------------------------
- # b.py
- import a
- if __name__ == '__main__':
- print('b-01: 这是 b 程序的输出')
运行 b.py, 输出:
b-01: 这是 b 程序的输出
这次成功阻止了 a.py 程序的输出, 可以轻松理解: Python 只是使用 if __name__ == '__main__'保证不是同一个模块的输入输出, 流程控制等不相互影响.
小结
为了更简洁优雅的使用 Pyhton 十分建议将每个模块的执行逻辑和输入输出都放在程序入口里面, 这样在调用时不会污染程序上下文执行环境.
来源: https://www.cnblogs.com/W-Wang/p/12817433.html