如果你刚刚接触python,相信会在看别人的程序的时候会遇到if __name__ == '__main__'酱紫的语法,如果当时没看懂现在也一知半解的话,看下去,本文可以帮你解决这个问题。
大家都知道:Python的一大优点就是里面的模块非常多——包括内置的模块与自定义模块。我们可以直接利用别人写好的模块去实现自己的需求,酱紫大大的提高了自己的开发效率。也就是说,有时候你可能只需要一些文献阅读的能力与基本的编码能力也可以实现很强大的功能!~~这也许就是Python在各行各业各处开花的原因吧/叹气/叹气/叹气。

一个故事带你理解if name == 'main'

某年某月某日,你正坐在工位的电脑前发呆,此时,你的老板从你背后亲切的拍了拍你的肩膀:“小A呀,公司有一个新的产品要开发,里面有一个模块需要实现登陆请求功能,这个功能你来写吧,巴拉巴拉巴拉(告诉你具体的需求)”。此时的你血脉喷张、血压暴涨。内心里一千万个草泥马奔腾而过:“我靠!好难!”
过了一个小时,你旁边工位的老死机王先生又亲切的拍了拍你的肩膀:“小A呀,别担心呀,公司上一个产品不是也有一个登陆请求的功能模块吗?直接拿来用就好了呀。”
“对呀!我不是学过引用么!那可是Ctr-C/V升级的技能呀!别人写的模块我直接拿来用就OK好了啊!”
于是,你以加班的名义于当天半夜悄悄打开了别人的电脑......
第二天,熬了一晚的你终于发现了登录模块~~~一个名为main.py的文件,里面的代码如下:
# main.py

def check():
print('我正在check...') def register():
print('我正在注册...') def login():
print('我正在登陆...') check()
register()
login()
此时的你突然精神百倍、容光焕发!“我靠,真是穿破了铁鞋找呀找没找到,你竟然如此简单的就被我找到啦,啊哈哈哈哈哈!”
于是你趁热打铁,赶紧在同一个目录下建了一个名为start.py的文件,用了python程序员专属的进阶复制粘贴功能————模块导入
# start.py

from main import login

login()

“万事俱备,只欠东风!接下来运行一下start.py我就可以跟老板要求升值加薪了,哇卡卡卡卡卡!”于是你点击运行了start.py......
而此时看到结果的你又开始血脉喷张、血压上升~“我靠!运行的结果为啥子会是酱紫的啊!”
我正在check...
我正在注册...
我正在登陆...
我正在登陆...
于是你赶紧检查代码:发现main.py文件里面除了login函数还有两个函数check与register,而且这个文件也运行了里面的三个函数,而运行的结果竟然跑到了你的start.py文件运行的结果中来了!
“这不科学呀!我只在我的文件里导入了login,没有导入其他的两个函数呀!而且我只运行了我自己的login呀!为啥main文件里的函数也会执行呢!!!”
此时的你感觉彻底陷入了绝境~想想早上看到老板那微微一笑的表情,心理不禁打了个冷颤~
“这该如何是好呀!”
而此时看到面有窘迫的你的老王再一次的来到了你的面前:“小A呀,在愁什么呢?”于是你把你的代码给老王看了看。
看完过后,老王露出了一丝意味深长的关心的微笑:“小A呀,你知道吗,当我们import一个模块的时候,Python解释器其实帮我们在后台执行了这个文件中的内容的,也就是说,由于你在start.py文件中import了main.py文件的函数,Python解释器会先执行main中的内容,然后再执行你自己的start文件中的代码的。而main文件中调用了它自己的三个函数,所以你执行的结果会包含main文件中执行的结果的。”
听完了老王的解释,你突然明白了,“嗖得寺内!那我直接把main文件中的函数粘贴进来不就可以了?哎呀,王叔,酱紫是可以,不过作为一个Python程序员,酱紫不是显得太Low了吗?而且如果以后别人的代码需要修改的话,我还得复制粘贴,酱紫太麻烦了,呜呜呜呜呜呜”
老王看着委屈的你,露出了关切的笑容:“小A呀,我没告诉你复制粘贴呀”随后,他亲切的摸了摸你的头说道:“来,叔叔帮你解决”,于是,老王帮你把main.py中的内容修改如下:
# main.py

def check():
print('我正在check...') def register():
print('我正在注册...') def login():
print('我正在登陆...') if __name__ == '__main__':
check()
register()
login()
你自己的start.py文件的内容不变,随后,他运行了一下你的start文件,奇迹发生了:
我正在登陆...
结果只显示了一行!而且正是你要的结果!
“其实,if __name__ == '__main__':是在告诉Python编译器:下面的代码只有在运行我这个文件的时候才执行,当作为模块导入到别的模块的时候,编译器只编译它前面的内容,我们把函数的执行放在了if __name__ == '__main__':的后面,这样可以有效的避免在不需要的时候错误的调用了本模块的方法”
听完了老王的解释后,你顿时容光焕发!调试了几遍无误并感谢了老王后,兴冲冲地跑到了老板的办公室......
而此时,老王看着你开心的背影,脸上露出了父亲般的亲切的笑容......
未完待续.........

一个故事带你理解if __name__ == '__main__'的更多相关文章

  1. (转)Python中如何理解if __name__ == '__main__'

    摘要 通俗的理解 __name__ == '__main__' :假如你叫李凯.py,在朋友眼中,你是李凯( __name__ == '李凯' ):在你自己眼中,你是你自己( __name__ == ...

  2. 理解if __name__ == '__main__':

    一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段 第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容 import time ...

  3. python中如何理解if __name__ == '__main__'

    __name__ 是当前模块名,当模块被直接运行时模块名为 __main__ .这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行.我们通过一个简单的例子来理解 ...

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

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

  5. 理解 if __name__ == '__main__'

    简单地理解Python中的if __name__ == '__main__' if __name__ == '__main__'的意思是: 当.py文件被直接运行时,if __name__ == '_ ...

  6. 如何理解 if __name__ == "__main__"

    小明.py 朋友眼中你是小明(__name__ == '小明'), 你自己眼中你是你自己(__name__ == '__main__'), 你编程很好, 朋友调你去帮他写程序(import 小明, 这 ...

  7. 爸爸和儿子的故事带你理解java线程

    今天回想线程方面的知识,发现一个非常有意思的小程序.是用来说明多线程的以下贴出来分享下,对刚開始学习的人理解线程有非常大的帮助 爸爸和儿子的故事 <span style="font-f ...

  8. 一篇漫画故事带你理解透HTTPS(下)

    上下集知识点总结: 前情提要: 蝙蝠纪元,疫情之下.二丫欲访问京东购物,不料弹出安全提示,遂找二毛一探究竟.二毛一顿排查后,开始用通俗易懂的语言深入浅出的向二丫解释 HTTP作用及优缺点.HTTPS的 ...

  9. 一篇漫画故事带你理解透HTTPS(上)

    2020年蝙蝠纪元,二毛一如往常的呆在家中,不敢外出去浪. 为排解心中之闷,二毛抽了一口老烟,熟练的打开了全球最大的同性交友网站,准备假装了解下最近流行的项目... 只听啪的一声回车键,哪知浏览器蹦出 ...

随机推荐

  1. JavaScript Node节点笔记

    1. 节点及其类型: 1). 元素节点 2). 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 3). 文本节点: 是元素节点的子节点, 其内容为文本. 2. 在 html 文档的什么位置编 ...

  2. Qt坑点汇总

    1.场景:假如我们想在layout中的qlabel中设置一个图片 1.1 如果简单地使用border-image,我们可以做到,并且拖动界面时,label可以随布局正常变化,这里需要注意的是,修改ui ...

  3. cocoapod podpackage 自动根据podfile生成framework实现二进制化,原创脚本,转载请注明出处

    #!/bin/bash # created by lichanghong ; mail: lichanghong@soyoung.com # XXX.sh  AFNetworking 3.0.0 se ...

  4. Datediff的使用(统计本日,昨日,本周,本月)

    //统计本日,昨日,本周,本月添加的产品总数 //日期            DateTime DT = DateTime.Now;            string day=DT.Date.ToS ...

  5. cocoa-charts 导入其依赖库TABlib 报UIKit Foundation找不到的问题

    对于应用到项目中的一些第三方类库,尤其是C/C++ 写的,里面的大部分类文件的后缀都是 .C. 解决办法: 在 build setting 里按照如图所示,进行设置: 这说明以后只要是第三方类库中使用 ...

  6. 前端axios下载excel(二进制)

    需求:通过后端接口下载excel文件,后端没有文件地址,返回二进制流文件 实现:axios(ajax类似) 主要代码: axios:设置返回数据格式为blob或者arraybuffer 如: var ...

  7. 开始Python学习

    主要结合ArcGIS进行空间数据处理 Python最讨厌的就是版本问题了 ArcGIS 10.5安装的时候已经安装了python2.7.13,但后来又安装了python3.6.1. 环境变量的设置: ...

  8. 如何查看jar包的版本号?(转)

    转自 : http://www.cnblogs.com/wych/p/4072913.html jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文 ...

  9. 12集合(2)-----Set

    一.总体分类 Collection(包括方法add,remove,contains,clear,size) List(接口) LinkedList ArrayList Vector---Stack 2 ...

  10. for循环比较

    在实际的开发过程中,一般都会用到for循环,都可以用来遍历,但是这几个之间又存在细微的差别! 一,传统的for循环: var arr = ['good', 'good', 'study']; for ...