在这个教学里,我们会学到如何利用 Python (程序) 的一个特殊记号(叫做 __name__ 属性)来让同一个程序在不同的情况下,执行不同的动作。


解释 :

  1. Python (派森): 一种高级编程语言,就像给电脑下指令的一种语言。
  2. __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__ 就是其中最常见的一个。
  3. 不同的上下文 (different contexts) / 动态运行 (dynamically run):
    • 解释: 在这里指的是上面提到的两种情况:
      • 情况一:程序文件作为主程序__main__)被直接执行。
      • 情况二:程序文件作为工具箱/库被其他文件调用(导入)。
    • 动态运行dynamically run):指的是程序不是从头到尾都执行一套固定的指令,而是根据当时程序处于哪种“上下文”(是被自己运行还是被别人调用),来临时决定要不要执行某些特定的代码块。

总结一下,意思就是:

写代码,让你的 Python 程序知道自己现在是主角(自己被运行),还是配角(被别人调用),然后根据这个身份的不同,自动去执行不同的任务。

为什么有的代码不需要 if __name__ == "__main__":

主要原因在于这段代码的结构和用途

  1. 代码结构简单且执行目的单一:

    • 代码定义了一个名为 min_bikes()函数 (function)(举例说明),里面封装了所有的逻辑(读取输入、计算最少自行车数)。
    • 紧接着,代码只有一行主执行语句print(min_bikes()),它直接调用了前面定义的函数,并打印结果。
    • 这段代码的唯一目的就是:当文件被运行时,读取数据,运行 min_bikes 函数,然后输出结果。
  2. 无需区分“导入”和“直接运行”:

    • if __name__ == "__main__": 语句的核心作用是:区分这个文件是被当作主程序直接运行,还是被其他文件当作一个工具箱(模块)导入
    • 代码就是一个完整的、独立的脚本,用来解决一个特定的算法问题。它设计出来就是为了被直接运行,然后立即得到结果。
    • 程序员不期望这段代码会被其他文件导入(import)后,在导入时自动执行 print(min_bikes()) 并读取输入。因此,不需要用 if __name__ == "__main__": 来保护主执行语句。
  3. 函数定义是安全的:

    • 即使这段代码被其他文件 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__": 的写法是非常常见的。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐