【小白笔记】Python 的__name__ 属性
·
在这个教学里,我们会学到如何利用 Python (程序) 的一个特殊记号(叫做 __name__ 属性)来让同一个程序在不同的情况下,执行不同的动作。
解释 :
- Python (派森): 一种高级编程语言,就像给电脑下指令的一种语言。
__name__(双下划线 name 双下划线) 属性 (attribute):- 解释: 这是 Python 语言中的一个特殊变量(或者说“记号”)。每个 Python 文件在被运行时,都会自动拥有这个变量。
- 如果这个文件是直接运行的(比如你双击它或在命令行里运行它),那么它的
__name__的值就会被设置为'__main__'(主程序)。 - 如果这个文件是被别的程序当作一个模块导入(import)来使用的,那么它的
__name__的值就会被设置为它自己的文件名。
- 如果这个文件是直接运行的(比如你双击它或在命令行里运行它),那么它的
- 功能: 程序员就可以利用这个特性,写出像下面这样的代码:
if __name__ == "__main__": # 如果是直接运行,就执行这里的代码(比如:运行一个测试、启动应用) run_application() else: # 如果是被当作模块导入,就不执行这里的代码 pass - 词源来历 (etymology):
__name__这种前后加双下划线__的命名方式,在 Python 中称为 “Dunder” 名称。- Dunder 是 “Double Underscore”(双下划线)的缩写。这种命名规范起源于早期的编程语言约定,在 Python 中,它被用来表示系统级别的、有特殊意义的属性或方法,通常是语言内部使用的“魔术”名称(Magic Methods,也叫 Dunder Methods)。
__name__就是其中最常见的一个。
- 解释: 这是 Python 语言中的一个特殊变量(或者说“记号”)。每个 Python 文件在被运行时,都会自动拥有这个变量。
- 不同的上下文 (different contexts) / 动态运行 (dynamically run):
- 解释: 在这里指的是上面提到的两种情况:
- 情况一:程序文件作为主程序(
__main__)被直接执行。 - 情况二:程序文件作为工具箱/库被其他文件调用(导入)。
- 情况一:程序文件作为主程序(
- 动态运行(
dynamically run):指的是程序不是从头到尾都执行一套固定的指令,而是根据当时程序处于哪种“上下文”(是被自己运行还是被别人调用),来临时决定要不要执行某些特定的代码块。
- 解释: 在这里指的是上面提到的两种情况:
总结一下,意思就是:
写代码,让你的 Python 程序知道自己现在是主角(自己被运行),还是配角(被别人调用),然后根据这个身份的不同,自动去执行不同的任务。
为什么有的代码不需要 if __name__ == "__main__":?
主要原因在于这段代码的结构和用途。
-
代码结构简单且执行目的单一:
- 代码定义了一个名为
min_bikes()的函数 (function)(举例说明),里面封装了所有的逻辑(读取输入、计算最少自行车数)。 - 紧接着,代码只有一行主执行语句:
print(min_bikes()),它直接调用了前面定义的函数,并打印结果。 - 这段代码的唯一目的就是:当文件被运行时,读取数据,运行
min_bikes函数,然后输出结果。
- 代码定义了一个名为
-
无需区分“导入”和“直接运行”:
if __name__ == "__main__":语句的核心作用是:区分这个文件是被当作主程序直接运行,还是被其他文件当作一个工具箱(模块)导入。- 代码就是一个完整的、独立的脚本,用来解决一个特定的算法问题。它设计出来就是为了被直接运行,然后立即得到结果。
- 程序员不期望这段代码会被其他文件导入(import)后,在导入时自动执行
print(min_bikes())并读取输入。因此,不需要用if __name__ == "__main__":来保护主执行语句。
-
函数定义是安全的:
- 即使这段代码被其他文件
import了,被导入的也只是def min_bikes():这个函数定义。 - 但是,函数体外的
print(min_bikes())这一行是没有被if __name__ == "__main__":保护起来的。 - 所以,如果另一个文件导入了它,那另一个文件在导入时就会自动执行
print(min_bikes()),并提示用户输入数据。
- 即使这段代码被其他文件
总结
代码之所以没有 if __name__ == "__main__":,是因为它是一个面向直接运行、目的单一的脚本。
- 有
if __name__ == "__main__"::更严谨、模块化的写法。适用于那些既可能被直接运行,又可能被其他程序导入作为工具库的 Python 文件。 - 没有
if __name__ == "__main__"::是一种简洁、快速的写法。适用于那些只打算作为独立脚本,被直接执行来完成特定任务(如数据处理、算法练习、测试等)的文件。
在算法竞赛或简单的练习代码中,这种省略 if __name__ == "__main__": 的写法是非常常见的。
更多推荐
所有评论(0)