[每日一题]19、简单理解Python中的__name__ == '__main__'

点击上方Python3X”,选择“置顶或者星标

第一时间收到精彩推送!


Python Every Day, 第 19 天



大家在刚开始学习Python的时候,肯定都见过这样一段代码   __name__ == '__main__' 。 


对于很多编程语言来说,无论是Java、C、C++ 都会有一个main函数作为程序的入口。就是程序最开始执行的地方。对于Python来说,可以假装把__name__ == '__main__ 也当成程序的入口。


为什么要说假装呢?实际上Python作为一种脚本语言,py文件既可以作为模块进行导入,也可以直接运行。运行的时候是从第一行开始逐步往下执行,Python本身并没有这样的规定。

理解__name__ == '__main__' 之前有必要解释一下 __name__
__name__


__name__ 是Python中的一个内置属性(前后都是双_, 表示系统定义的属性),用于获取py文件的名称。
如下:
 
 
# 导入child_temp模块import child_temp# 如果模块被导入,则输出导入模块的名称,即child_temoprint(child_temp.__name__)# 如果直接运行则 输出__main__print(__name__)
import child_temp

# 如果模块被导入,则输出导入模块的名称,即child_temo
print(child_temp.__name__)

# 如果直接运行则 输出__main__
print(__name__)


__name__ == '__main__'的作用


多说无益,通过两段简单的代码去解释一下他们的作用。


创建child_temp.py
 
 
# child_temp.pyname = 'Tom'def get_name():    print(f'my name is {name}')get_name()print('当前模块名 __name__ 为 :', __name__)

name = 'Tom'

def get_name():
    print(f'my name is {name}')

get_name()
print('当前模块名 __name__ 为 :', __name__)


输出结果为:
 
 
my name is Tom当前模块名 __name__ 为 : __main__
当前模块名 __name__ 为 : __main__



然后将child_temp 作为模块导入到 temp.py文件中


 
 
# temp.py# 导入child_temp模块from child_temp import name# 打印child_temp.py文件中的name 即 Tomprint(name)

# 导入child_temp模块
from child_temp import name

# 打印child_temp.py文件中的name 即 Tom
print(name)


输出结果为:

 
 
my name is Tom当前模块名 __name__ 为 : child_tempTom
当前模块名 __name__ 为 : child_temp
Tom


问题就出现在这里了,我只想打印Tom这个名字,但是却把child_temp.py中的两个print也打印出来了。


值得注意的是,在执行temp.py的时候 当前模块名__name__  从__main__ 变成了child_temp。


于是,我们改进child_temp.py的代码,加上 if __name__ = '__main__'。
 
 
# child_temp.pyname = 'Tom'def get_name():    print(f'my name is {name}')if __name__ == '__main__':    get_name()    print('当前模块名 __name__ 为 :', __name__)

name = 'Tom'

def get_name():
    print(f'my name is {name}')

if __name__ == '__main__':
    get_name()
    print('当前模块名 __name__ 为 :', __name__)



再次执行temp.py。 发现只输出了Tom。
总结:


简单一句话来概括就是,通过__name__ = '__main__' 来限制代码块的执行。如果py直接被运行则,则代码块执行,如果py文件以模块的方式引入,则代码块不执行!

可以避免代码的重复运行,提高代码的健壮性。


往期Python Every Day

[每日一题]18、Python中迭代器、生成器、yield

[每日一题]17、用Python将字符串进行特殊的转换

[每日一题]16、用Python算出100万内的雷劈数

[每日一题]15、用Python输出杨辉三角

[每日一题]14、Python中is和== 的区别

[每日一题]13、任意数组,实现一个特定的排序

[每日一题]12、Python中的多线程

[每日一题]11、用Python打印乘法口诀表

[每日一题]10、一道关于九宫格的面试题

[每日一题]9、Python中文件的读取

[每日一题]8、Python中的深拷贝和浅拷贝

[每日一题]7、Python中的super()函数

 [每日一题]6、Python中的可变参数

[每日一题]5、Python中的lambda表达式

[每日一题]4、Python中的迭代器

[每日一题]3、Python实现删除list中重复元素的几种方式

[每日一题]2、Python中的类的定义和装饰器@classmethod与@staticmethod

[每日一题] 1、Python中的可变对象与不可变对象


640?



感谢您的阅读


640?wx_fmt=gif


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值