引子

要搞清楚这个问题,可以先听一个故事~~~

像我们做事一样,都需要一个起始点,终点存在与否无关紧要。编程也是一样,任何程序都有一个入口,在所谓的静态编译语言中,如Java的入口是一个名字叫做Main的类,所有的程序都必须从这里开始运行,因此读别人的Java代码很方便,直接找入口就可以了。而Python这种动态解释型的语言不一样,他的入口就是程序的第一行,从代码开始书写的地方一直读到程序末尾,这就很有意思了,为了让程序员读别人的代码更方便,也为了让程序输出更为简洁,约定俗成了一种规范,即模仿Java,使用if __name__ == '__main__'给程序设定一个入口。

if __name__ == '__main__'是为了使Python更优雅而约定俗成的一个程序入口

但是,这个程序入口和Java略有不同:

  • Java强制程序所有的输入输出、流程控制等都在Main类里面;
  • Python只是使用if __name__ == '__main__'保证不是同一个模块的输入输出、流程控制等不相互影响。

分步骤详细举例说明

什么是__name__

新建一个Python程序,a.py

# a.py

print('a.py':__name__)

输出:

a.py:__main__

再新建一个Python程序,b.py

# b.py
import a # 当前程序包的名字
print('b.py':__name__)
# b.py程序的名字
print('a.py':a.__name__)

运行b.py,输出:

b.py:__main__
a.py:a

小结

__name__是程序的名称,当前运行程序的__name____main__,非当前运行程序的名称为程序的模块名称,即自定义值。

如果程序里面含有程序入口,那么程序如何执行呢?

Python只是使用if __name__ == '__main__'保证不是同一个模块的输入输出、流程控制等不相互影响。如何解释呢?

# a.py

print('01:首先执行这一行代码')

if __name__ == '__main__':
print('02:然后执行这一行代码')

运行a.py,输出:

01:首先执行这一行代码
02:然后执行这一行代码

以上说明,python是顺序执行的,这个所谓的程序入口不能改变执行顺序

如果程序长这样呢?

# a.py

print('a-01:这是a程序的输出')

--------------------------

# b.py
import a if __name__ == '__main__':
print('b-01:这是b程序的输出')

运行b.py,输出:

a-01:这是a程序的输出
b-01:这是b程序的输出

可见,又一次证明程序是顺序执行的,而且程序入口并没有起作用。

那么,这个程序入口的作用是什么呢?

# a.py

if __name__ == '__main__':
print('a-01:这是a程序的输出') -------------------------- # b.py
import a if __name__ == '__main__':
print('b-01:这是b程序的输出')

运行b.py,输出:

b-01:这是b程序的输出

这次成功阻止了a.py程序的输出,可以轻松理解:Python只是使用if __name__ == '__main__'保证不是同一个模块的输入输出、流程控制等不相互影响。

小结

为了更简洁优雅的使用Pyhton十分建议将每个模块的执行逻辑和输入输出都放在程序入口里面,这样在调用时不会污染程序上下文执行环境

if __name__ == '__main__'到底是什么?的更多相关文章

  1. if __name__ == '__main__' 到底是何方神圣(转)

    想必很多初次接触python都会见到这样一个语句,if __name__ == "__main__": 那么这个语句到底是做什么用的呢?在解释之前,首先要声明的是,不管你是多么小白 ...

  2. if __name__== "__main__" 的意思(作用)python代码复用

    if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog  http://www.dabu.info/if-__-name__ ...

  3. 浅析python 中__name__ = '__main__' 的作用

    引用http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...

  4. 【转】浅析python 中__name__ = '__main__' 的作用

    原文链接:http://www.jb51.net/article/51892.htm 举例说明解释的非常清楚,应该是看到的类似博文里面最简单的一篇: 这篇文章主要介绍了python 中__name__ ...

  5. python中if __name__ == '__main__'

    python 中__name__ = '__main__' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: “Make a script both importable and execut ...

  6. 从python run 和python unittest两种eclipse运行方式深入理解if __name__ == "__main__"

    在写一个简单的python测试程序的时候,发现eclipse中Run as "Python run 和 Python unittest”结果不一样?为什么会不一样? 先贴一下代码段: # - ...

  7. 【转载】__name__ == "__main__": 你认识我么?

    <笨方法学Python>的习题50中,脚本ex50.py最后一行代码就是 if __name__ == "__main__": 那么,这句代码到底有什么用呢? 莫急莫急 ...

  8. 【Python中if __name__ == '__main__': 的解析】

    在很多Python代码中,在代码的最下方会看到  if __name__ == '__main__':,这段代码到底有什么用呢? 在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.p ...

  9. 如何简单地理解Python中的if __name__ == '__main__'

    https://blog.csdn.net/yjk13703623757/article/details/77918633 1. 摘要 通俗的理解__name__ == '__main__':假如你叫 ...

随机推荐

  1. 泛型--->Result返回结果封装

    controller的返回结果一般有两种:     1.Rest API JSON 输出     2.页面 目的:编写优雅的代码 实现:通过泛型对返回结果进行封装 代码如下: 一.控制层 /** * ...

  2. Vue点击当前元素添加class 去掉兄弟的class

    <div id="app"> <ul> <li v-for="(todo, index) in todos" v-on:click ...

  3. 普通企业的规划类项目中,OptaPlanner更适合作为APS的规划优化引擎

    在企业的规划.优化场景中,均需要开发规划类的项目,实现从从种可能方案中找出相对最优方案.如排班.生产计划(包括高层次的供应链优化,到细粒度的车间甚至机台作业指令).车辆调度等.因为这类场景需要解决的问 ...

  4. 分享一下,PHP实现第四方QQ微信扫码登陆,不接入qq互联以及微信开发者平台就可以实现用户对接鹅厂,phpQQ微信扫码登陆

    自己抓的QQ包以及整合了网上一些已经封装好了的代码具体如下:QQ: <?php class QQ extends Curl_Api { //获取登录验证码 public function QRc ...

  5. Java调用ARM模板执行Azure Rest建立VM过程

    Azure Resource Manager 提供一致的管理层,用于管理通过 Azure PowerShell.Azure CLI.Azure 门户.REST API 和开发工具执行的任务,所有工具使 ...

  6. 从一个慢查询到MySQL字符集编码

    从一个慢查询到MySQL字符集编码 目录 从一个慢查询到MySQL字符集编码 1. 问题起源 2. MySQL字符集和字符集排序规则 2.1 字符集相关概念 2.2 MySQL中的字符集和字符集排序规 ...

  7. SignalR新手系列教程详解总结(转)

    SignalR新手系列教程详解总结 GlobalHost.ConnectionManager.GetHubContext<TodoListHub>() .Clients.Clients(l ...

  8. Java第二十五天,多线程之等待唤醒机制

    当线程被创建并且被启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,而是具有以下多种状态: 这六种状态之间的转换关系如下: 1.等待唤醒机制 注意: (1)两个线程之间必须用同步代码块 ...

  9. 使用nginx转换HTTPS流量

    背景 公司卖了一个产品给甲方,甲方要求部署后,要以https来访问.甲方提供了证书信息和私钥,记录一下部署过程. 实现 1.思路 在我们产品服务器上部署一个nginx.证书信息也放在这个服务器上.外界 ...

  10. spring-cloud feign的多参数传递方案

    查看原文 一.GET请求多参数URL 1.方法一(推荐) @FeignClient(“microservice-provider-user”) public interface UserFeignCl ...