python 关于main函数以及if __name__=='__main__'的理解

1.main函数:

在C/C++/Java中,main是程序执行的起点,Python中,也有类似的运行机制,但方式却截然不同:Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数

每个文件(模块)都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分主执行文件还是被调用的文件,Python引入了一个变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为'__main__'。这个特性,为测试驱动开发提供了极好的支持,我们可以在每个模块中写上测试代码,这些测试代码仅当模块被Python直接执行时才会运行,代码和测试完美的结合在一起。

典型的Python文件结构:

转载自:https://blog.csdn.net/DreamD1987/article/details/9446715

 import sys
 2 def Fuc():
 3     print 'hello'
 4     
 5 if __name__ == '__main__':
 6     if len(sys.argv) != 3:
 7         print 'Usage: python input_name output_name'
 8         exit(1)
 9     f_input = sys.argv[1]
10     f_output = sys.argv[2]
11     Fuc()
  • 5行“ if __name__ == '__main__':”含义:python文件后缀为".py"。 其中分两类:一类是直接执行, 另一类是作为模块被调用(import ***.py).
  •       __name__ 作为模块的内置属性,即".py"文件的调用方式。如果等于“__main__"就直接执行本文件, 如果是别的就是作为模块被调用
  • 6行:sys.argv 用来获取命令行参数。对于“python  code.py  input_name  output_name ”,共三个参数:code.py为sys.argv[0], input_name 为sys.argv[1], output_name为sys.argv[2] 。 同时注意引入模块sys

初次接触Python的人会很不习惯Python没有main主函数。 以下面的程序为例:

  1. #hello.py   
    def foo():   
        str="function"   
        print(str);   
    if __name__=="__main__":   
        print("main")   
        foo()   

其中if __name__=="__main__":这个程序块类似与Java和C语言的中main(主)函数 
在Cmd中运行结果 
C:\work\python\divepy>python hello.py 
main 
function 

在Python Shell中运行结果 
>>> import hello 
>>> hello.foo() 
function 
>>> hello.__name__ 
'hello' 
>>> 
可以发现这个内置属性__name__自动的发生了变化。

这是由于:

当你以单个文件运行时,__name__便是__main__ 
当你以模块导入使用时(import ***.py),这个属性便是这个模块的名字。

2.关于if __name__=='__main__'

if __name__=='__main__'说白了就是判断__name__变量是不是等于__main__

  • 当执行文件本身时候__name__变量等于main,此时判断成立并执行判断语句中的代码,
  • 当调用该模块的时候__name__并不等于__main__条件不成立,不执行判断下面的语句,可以认为为了调试模块,因为在模块导入的时候并不执行if下面的语句
  1. 对于编程语言来说,程序都必须要有一个入口,比如java和c#必须要有一个包含main方法的主类来作为程序的入口,而python则不同,它属于脚本语言,它是从脚本的第一行开始执行,没有统一的入口。
  2. 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。
  3. if __name__ == '__main__' 就相当于是 Python 模拟的程序入口,由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。
  4. __name__ 是内置变量,用于表示当前模块的名字,如果一个模块被直接运行,其 __name__ 值为 __main__。
  5. if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。

转载自:https://blog.csdn.net/u010159842/article/details/52804058

              https://www.cnblogs.com/zwgblog/p/7494482.html

猜你喜欢

转载自blog.csdn.net/xiachong27/article/details/88634921