zoukankan      html  css  js  c++  java
  • Python:if __name__ == '__main__'

    简介:

    __name__是当前模块名,当模块被直接运行时模块名为_main_,也就是当前的模块,当模块被导入时,模块名就不是__main__,即代码将不会执行。

    关于代码if __name__ == '__main__': 下面举几个例子解释下:

    先编写一个测试模块add1.py

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    ' a test module '
    
    def addFunc(a,b):  
        return a+b  
    
    print('add1计算结果:',addFunc(1,1))

    再编写一个模块add2.py来调用上面的模块:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    ' a test module '
    
    import add1
    
    print('调用add1模块执行的结果是:',add1.addFunc(12,23))

    在刚才两个模块的路径(我的路径为:“C:work”)中打开cmd,用命令行运行add1.py:

    C:work>python add1.py
    add1计算结果: 2

    在刚才两个模块的路径中打开,用命令行运行add2.py:

    C:work>python add2.py
    add2计算结果: 2
    调用add1模块执行的结果是:35
    
    #显然,当我运行add2.py后第一句并不是调用者所需要的,为了解决这一问题,Python提供了一个系统变量:__name__ #注:name两边各有2个下划线__name__有2个取值:当模块是被调用执行的,取值为模块的名字;当模块是直接执行的,则该变量取值为:__main__

    于是乎,被调用模块的测试代码就可以写在if语句里了,如下:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    ' a test module '
    
    def addFunc(a,b):  
        return a+b  
    
    if __name__ == '__main__':  
        print('add1计算结果:',addFunc(1,1))

    当再次运行add1.py:

    C:work>python add1.py
    add1计算结果: 2
    
    #结果并没有改变,因为调用add1.py时,__name__取值为__main__,if判断为真,所以就输出上面的结果

    当再次运行add2.py:

    C:work>python add2.py
    调用test模块执行的结果是: 35
    #此时我们就得到了预期结果,不输出多余的结果。能实现这一点的主要原因在于当调用一个module时,此时的__name__取值为模块的名字,所以if判断为假,不执行后续代码。

    所以代码iif __name__ == '__main__': 实现的功能就是Make a script both importable and executable,也就是说可以让模块既可以导入到别的模块中用,另外该模块自己也可执行。

           学过c语言的话,可以知道C语言定义主程序入口就是main()函数,main代表了程序主入口,即和系统的接口(说白了就是命令行直接调用)。if name == 'main': 这句话的核心无非就是在判断该程序文件是否作为主程序入口罢了。 如果在命令行直接调用该程序文件,该文件作为主程序入口,name == 'main'理所当然啊。 如果在命令行调用其他程序文件,主程序入口name == 'main'自然不成立,因为main等于那个你在命令行输入的程序名。 这个东西的好处就是,别人调用时(你并非是主程序入口)后面的东西不运行,自己命令行执行时(你是主程序入口)后面的东西运行。故可以作为测试用。

  • 相关阅读:
    用Visual Studio2010 编译 C++文件"hello world”
    hdu 1010 Tempter of the Bone(dfs+奇偶剪枝)
    最长子串(动态规划)
    C++中,访问字符串的三种方法
    POJ3260:The Fewest Coins(混合背包)
    如何做好基层技术管理工作?
    UVa10651(记忆化搜索)
    <Win32_5>深入浅出Win32的计时器
    【转载】一步一步写算法(之hash表)
    C可变参数函数 实现
  • 原文地址:https://www.cnblogs.com/kumata/p/8963199.html
Copyright © 2011-2022 走看看