一个故事带你理解if __name__ == '__main__'
如果你刚刚接触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__'的更多相关文章
- (转)Python中如何理解if __name__ == '__main__'
摘要 通俗的理解 __name__ == '__main__' :假如你叫李凯.py,在朋友眼中,你是李凯( __name__ == '李凯' ):在你自己眼中,你是你自己( __name__ == ...
- 理解if __name__ == '__main__':
一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段 第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容 import time ...
- python中如何理解if __name__ == '__main__'
__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ .这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行.我们通过一个简单的例子来理解 ...
- 从python run 和python unittest两种eclipse运行方式深入理解if __name__ == "__main__"
在写一个简单的python测试程序的时候,发现eclipse中Run as "Python run 和 Python unittest”结果不一样?为什么会不一样? 先贴一下代码段: # - ...
- 理解 if __name__ == '__main__'
简单地理解Python中的if __name__ == '__main__' if __name__ == '__main__'的意思是: 当.py文件被直接运行时,if __name__ == '_ ...
- 如何理解 if __name__ == "__main__"
小明.py 朋友眼中你是小明(__name__ == '小明'), 你自己眼中你是你自己(__name__ == '__main__'), 你编程很好, 朋友调你去帮他写程序(import 小明, 这 ...
- 爸爸和儿子的故事带你理解java线程
今天回想线程方面的知识,发现一个非常有意思的小程序.是用来说明多线程的以下贴出来分享下,对刚開始学习的人理解线程有非常大的帮助 爸爸和儿子的故事 <span style="font-f ...
- 一篇漫画故事带你理解透HTTPS(下)
上下集知识点总结: 前情提要: 蝙蝠纪元,疫情之下.二丫欲访问京东购物,不料弹出安全提示,遂找二毛一探究竟.二毛一顿排查后,开始用通俗易懂的语言深入浅出的向二丫解释 HTTP作用及优缺点.HTTPS的 ...
- 一篇漫画故事带你理解透HTTPS(上)
2020年蝙蝠纪元,二毛一如往常的呆在家中,不敢外出去浪. 为排解心中之闷,二毛抽了一口老烟,熟练的打开了全球最大的同性交友网站,准备假装了解下最近流行的项目... 只听啪的一声回车键,哪知浏览器蹦出 ...
随机推荐
- select默认显示
select默认显示第一个option,但大部分需求都是显示一个请选择,点击后在显示option的内容. 就像上图一样 但如果正常写的话会是像下面这样显示 请选择也会显示在下拉款里面,这样就很不友好 ...
- NSArray NSMutableArray
NSArray 或者 NSMUtableArray 去除重复的数据: 原来集合操作可以通过valueForKeyPath来实现的,去重可以一行代码实现: [array valueForKeyPath: ...
- iOS TabelViewCell 删除 编辑 插入
/** TableView 进入或退出编辑状态(TableView 方法). */ - (void)setEditing:(BOOL)editing animated:(BOOL)animate{ / ...
- TCP/UDP 网络工具
1. 统计连接状态 netstat -n | awk '/^tcp/ {++State[$NF]} END {for(s in State) print s, State[s]}' CLOSE_WAI ...
- DPDK- program_guide 2
Data Plane Development Kit(DPDK) RTE_SDK and RTE_TARGET must be configured. ~EAL ~librte_mempool ~li ...
- DateGridView控件与mysql交互
private void dgv() { //Ip+端口+数据库名+用户名+密码 string connectStr = "server=127.0.0.1;port=3306;databa ...
- 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?
这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...
- PyCharm提交代码到git
- poj 3641 快速幂
Description Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a ...
- redis初步了解
redis是什么 redis是一个开源的内存数据库,拥有非常优秀的性能 如何安装redis 在linux下安装软件有几种方式:二进制文件安装和源码安装,由于redis不依赖任何外部库,所以源码安装非常 ...