学过C、C++、Java等编译型语言的应该都清楚,不管你的代码怎么写的,都需要写一个main函数,用来指示程序的入口,或说程序最开始应该从哪里开始执行。例如如下的C++代码:
# include <iostream>using namespace std;int main(){ cout << "Hello, World!" << endl;}上面的代码指示计算机,从int main()这里开始执行,输出内容“Hello, World!”。而Python显然没那么啰嗦,因为你大概率是这样实现输出内容的:
print("Hello, World!")没有大括号、没有明确main入口、一行代码完事,怎一个简单粗暴了得。
但随着使用Python的过程不断深入,迟早会在别人的源码中看到一个类似main.py的文件,好像是在指示这是一个main入口,而里面也赫然写了一行熟悉又陌生的代码,仿佛这就是整个Python程序的入口:
if __name__ == '__main__':
先跳出Python,不管是C还是Java,它们要求程序都必须有一个明确的入口。因为电脑脑子是一根筋,你不告诉它从哪开始跑代码,它就不知道干什么。所以语言设计者们就规定:main函数是程序唯一的、固定的启动键。
于是执行程序的流程变为:
发出程序运行指令 → 找main的位置 → 进入main并顺序执行其中的代码 → 程序结束。
但是!Python偏不按套路出牌。Python的逻辑很直白:
打开文件 → 从上读到下 → 读到哪执行代码到哪。
这也是很多解释性语言的代码运行特点,例如Shell、Lua等语言。
可自由过头,总会有出bug的时候,这时候,if __name__ == '__main__'就出现了,弥补Python没有main入口的缺陷。
我们把Python代码文件抽象成你的作业,它有两种用处:
自己用来上交: 你写的很认真,解题思维清晰,逻辑缜密;
借别人抄: 班上总有同学借你作业抄,他们只想抄你解题过程的关键部分,不想抄的一模一样被老师发现。
而 if __name__ == '__main__',就是作业下的一行免责声明:
「此部分是我作业的专属写法,你照抄必背发现!!!」
是不是一下子就明白了?说白了就是:区分文件是自己运行,还是被别人借用。
def do_homework():print("Step-1: because A + B = C")print("Step-2: and A * B = D")print("Step-3: so, E = m * c^2")# 免责声明if __name__ == '__main__':print("Name: Zhang-3, Class: SSR")# 做作业总是美言老师一句,而其他同学不屑于这么干print("My teacher, you're so beautiful today!") do_homework()运行代码,你的输出是:
Name: Zhang-3, Class: SSRMy teacher, you're so beautiful today!Step-1: because A + B = CStep-2: and A * B = DStep-3: so, E = m * c^2这个时候,文件执行者是主角本人,判断条件成立,if里面的代码全部执行。
import copy_homeworkprint("I've copied homework, yeah!")运行代码,输出:
I've copied homework, yeah!这时,你会发现那些原本的个人信息、拍马屁发言全都不会出现。
这就是这行if代码的核心作用:被别人导入调用时,隐藏内部测试代码,只保留关键的函数、类等内容。
如果没有这行if,按照Python的逻辑,需要先执行完homework.py中的所有代码,那么你抄作业必露馅。
对于初学者、或者只写小脚本,完全可以不写。
但如果你想做项目、写工具、封装代码,那么这行代码是必然的:
往期回顾:
Python学习笔记——从入门到报废(二十八、面向对象编程(四))