关于Python中的if __name__ == __main__详情
作者:钱魏Way 发布时间:2022-05-04 10:16:28
目录
1.程序入口
2.__name__是什么?
场景1:直接运行脚本
场景2:从其他脚本导入
3.__name__可以显示包路径
5.测试模块里函数
关于在学习Python的过程中,遇到的这类似的代码:
if __name__ == "__main__":
print("Hello World!")
1.程序入口
对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,
以及完全面向对象的编程语言 Java
,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main
函数来作为程序的入口,也就是程序的运行会从 main
函数开始。同样,Java
和 C#
必须要有一个包含 Main 方法的主类来作为程序入口。
而 Python
则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。
if __name__ == “__main__”:
本质就是一个if判断,但它又不是一个简单的if判断。即当.py文件运行时,__name__
是'__main__
' 时运行下面if下的代码,则否不运行。当然你也可以把代码写成这样:
if __name__ == "__main__":
print("Hello World!")
else:
print("Hello Mars!")
2.__name__是什么?
__name__
是Python
内置的变量,它是每个 Python
模块必备的属性,但它的值取决于你是如何执行这段代码的。
当你直接执行一段脚本的时候,这段脚本的 __name__
变量等于 ‘__main__
'
当这段脚本被导入其他程序的时候,__name__
变量等于脚本本身的名字
场景1:直接运行脚本
假设我们有一个nameScript.py,
代码如下:
def myFunction():
print('The value of __name__ is ' + __name__)
def main():
myFunction()
if __name__ == '__main__':
main()
直接执行这个文件后流程为:
在所有其他代码执行之前,__name__
变量就被设置为 ‘__main__
' 了。在此之后,通过执行 def 语句,函数 main() 和 myFunction()
的本体被载入。接着,因为这个 if 语句后面的表达式为真 true,函数 main() 就被调用了。而 main()
函数又调用了myFunction(),
打印出变量的值'__main__
'。
场景2:从其他脚本导入
如果你需要在其他脚本里重用这个 myFunction()
函数,比如在 importingScript.py
里,我们可以将 nameScript.py
作为一个模组导入。
importingScript.py 的内容如下:
import nameScript as ns
ns.myFunction()
这时,我们就有了两个不同的作用域:一个是 importingScript
的,一个是 nameScript
的:
在 importingScript.py
里,__name__
变量就被设置为 ‘__main__
'。当导入 nameScript
的时候,Python
就在本地和环境变量 PATH 指向的路径中寻找对应名称的 .py 文件,找到之后,将会运行导入的文件中的代码。
但这一次,在导入的时候,它自身的 __name__
变量就被设置为了 ‘nameScript'
,接下来还是一样,函数 main()
和 myFunction()
的本体被载入。然而,这一次 if 语句后面的表达式结果为假 false,所以 main()
函数没有被调用。
导入完毕之后,回到 importingScript.py
中。现在 nameScript
模块中的函数定义已经被导入到当前的作用域中,于是我们通过 ns.myFunction()
的方式调用模块中的函数,这个函数返回的是模块内的变量的值 ‘nameScript
'。
如果你试着在 importingScript
中打印 __name__
变量的值,那当你直接执行 importingScript
的时候,它也会输出 ‘__main__'
。原因在于,这个变量是在 importingScript
的作用域中的。
3.__name__可以显示包路径
我们建立这样一个目录结构:
a
├── b
│ ├── c.py
│ └── __init__.py
└── __init__.py
d.py
c.py文件中的代码:
print(__name__)
d.py文件中的代码:
from a.b import c
运行d.py文件,结果为:
a.b.c
此时a.py文件的__name__
属性变成了a.b.c,完完全全反映了它所在的包路径。
5.测试模块里函数
由于一个脚本被引入时,自身的代码会被执行,因此我们在每个脚本里都写上一段if __name__ == ‘__main__': 如果你希望一些代码只有在脚本被直接执行时才执行,那么就把这些代码放入到if 语句块中,最常见的情形就是测试代码:
def safe_division(a, b):
if b == 0:
return None
return a/b
if __name__ == '__main__':
print(safe_division(10, 5) == 2)
print(safe_division(10, 0) == None)
我们写完一个函数后,不免要写一些测试的代码,而这些测试的代码我们不希望他们在引入时执行,只有当我们主动执行进行测试才执行这些测试代码。
来源:https://www.tuicool.com/articles/meEnMnr


猜你喜欢
- 在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat 、 matrix 以
- 前几天写了一个ajax的,总感觉代码比较多,今天晚上又得写了一下,感觉代码还是比较多,但还好的是,比较通用。谁有办法优化一下当然好。&nbs
- 类是面向对象程序设计的一部分。面向对象程序设计或者简称为 OOP 致力于创建可重用代码块称之为类。当你想在你的程序中使用类时,你会从类中创建
- 环境搭建python 安装:建议使用python3.7pycharm安装requests安装 :pip3 install requestsr
- 引言“深入认识Python内建类型”这部分的内容会从源码角度为大家介绍Python中各种常用的内建类
- 一 时间元组1. 时间元组和时间戳的互化import time,datetime# 获取当前时间的时间元组t = time.localtim
- Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。Djan
- 快照复制是在数据库之间对数据以及数据库对象进行复制并进行同步,以确保多个数据库之间一致性的一个法宝。简单的说,快照复制就是实现把一个数据库服
- 最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下。python的标准库里的日志系统从Python2.3开始支持。只要
- 本文实例讲述了Python自定义scrapy中间模块避免重复采集的方法。分享给大家供大家参考。具体如下:from scrapy import
- 上个月安装的pycharm,由于当时急需要使用,就直接使用的pycharm试用版,没成想,今天早上一打开,直接给我来了个下马威,不能进入了,
- 写在前面机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后
- 在DreamWeaver中编写CSS,这种编写习惯并不提倡,不过由于"可视化"和操作简便,使用的朋友依然很多,今天罗列一
- 先安装第三方库:pip install requestsdef isConnected(): import requ
- 使用Keras如果要使用大规模数据集对网络进行训练,就没办法先加载进内存再从内存直接传到显存了,除了使用Sequence类以外,还可以使用迭
- 本文实例讲述了Python基于贪心算法解决背包问题。分享给大家供大家参考,具体如下:贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在
- ES Module导出仅导出named exports: 命名导出,每次可以导出一个或者多个。default exports: 默认导出,每
- 一、AIML是什么AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创
- Python SMTP发送邮件SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址
- 本文实例为大家分享了python使用插值法画出平滑曲线的具体代码,供大家参考,具体内容如下实现所需的库numpy、scipy、matplot