IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 写 Python 脚本,一定要加上这个 -> 正文阅读

[Python知识库]写 Python 脚本,一定要加上这个

使用 Python 的人,平时经常会写一些脚本,不管是为了提升工作效率,还是为了满足一些特定的需求,Python 脚本都是一个常见又有用的东西。

但是,我最近发现了一个以前不曾察觉的问题,就是脚本里面是否添加?if __name__ == "__main__":?这个语句,对脚本的使用其实是有很大影响的,并且这里面还有很大的学问。

常见误区

很多朋友在写脚本时比较随意,简单的脚本直接一溜写下来,没有函数,顺序执行。复杂点的脚本,可能会加函数。这种写法可读性比较差,经常让人一眼找不到程序运行的入口和顺序。

而 Python 社区比较推荐的写法是在写脚本时,加上下面这个语句:

def?main():
????#?do?something
????print("do?something.")

if?__name__?==?"__main__":
????main()

大多数人看到这里,会不会说,这有什么,加不加这个没那么重要吧!

先不要忙着不屑,让我们一起来仔细掰扯掰扯!

有什么用

在具体说明?if __name__ == '__main__'?的作用前,先从一个简单的实例直观上感受一下。

#?const.py
?
PI?=?3.14
?
def?train():
????print("PI:",?PI)
?
train()
#?area.py
?
from?const?import?PI
?
def?calc_round_area(radius):
????return?PI?*?(radius?**?2)
?
def?calculate():
????print("round?area:?",?calc_round_area(2))
?
calculate()

我们看下 area.py 的运行结果:

PI:?3.14
round?area:??12.56

的 PI 变量,在运行的时候,const.py 中函数?train()?中的打印也带过来了,而我们只是引用变量,并没有引用函数,所以这是我们不愿意看到的。

解决这个问题的方法也很简单,我们只需在 const.py 中加上一句:

PI?=?3.14

def?train():
???print("PI:",?PI)

if?__name__?==?"__main__":
???train()

再次运行 area.py ,输出结果如下:

round?area:??12.56

这是我们预期的结果。

程序运行入口

丛上述实例可以发现,如果没有?if __name__=="__main__":?,作为 area.py 导入文件时 const.py 中的所有代码都被执行了,而加上之后就只运行导入的部分代码。

这就是?if __name__=="__main__":?显而易见的作用,实际上?if __name__=="__main__":?就相当于是 Python 模拟的程序入口。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个,选中哪个入口程序取决于?__name__?的值。

我们再来看一个小程序:

#?test.py

print("look?here")
print(__name__)
?
if?__name__?==?'__main__':
????print("I'm?test.py")

程序的运行结果如下:

look?here
__main__
I'm?test.py

可以发现,此时变量?__name__?的值为?__main__,所以打印 “I'm test.py”。如果运行其他文件,通过运行的文件调用本文件,则不会打印该语句,因为程序入口不对,该语句不执行。

代码规范

有了?if __name__=="__main__":?相当于 Python 程序也有了一个入口函数,我们可以清晰的知道程序的逻辑开始于何处,当然还需要我们自觉的把程序的开始逻辑都放在这里。其实,这也是 PyCharm 推荐的作法。

为什么很多优秀的编程语言,比如 C、Java、Golang、C++ 都有一个 main 入口函数呢?我想很重要的一个原因就是就是程序入口统一,容易阅读。

多进程场景大作用

如果你用多进程来做并行计算,类似这样的代码:

import?multiprocessing?as?mp

def?useful_function(x):
????return?x?*?x

print("processing?in?parallel")
with?mp.Pool()?as?p:
????results?=?p.map(useful_function,?[1,?2,?3,?4])
????print(results)

运行这段代码,控制台会一直打印:

processing?in?parallel
processing?in?parallel
processing?in?parallel
processing?in?parallel
processing?in?parallel
processing?in?parallel
processing?in?parallel
processing?in?parallel
processing?in?parallel

并且程序会不停的报错 RuntimeError。

如果你加上了?if __name__=="__main__":?,程序就会按照预期的进行:

import?multiprocessing?as?mp

def?useful_function(x):
????return?x?*?x

if?__name__?==?'__main__':
????print("processing?in?parallel")
????with?mp.Pool()?as?p:
????????results?=?p.map(useful_function,?[1,?2,?3,?4])
????????print(results)

Python 的多程序就是启动了多个 Python 解器器,每个 Python 解释器都会导入你这个脚本,复制一份全局变量和函数给子进程用,如果有了?if __name__=="__main__":,那它后面的代码就不会被 import,也就不会被重复执行。否则,这个创建多进程的代码就会被 import,就会被执行,从而无限递归的去创建子进程

总结

if __name__=="__main__":?虽然不是强制的,但是我强列推荐你写脚本时按照这个规范来做,它是 Python 社区的约定,对应Python 之禅:明确优于隐晦。

【python学习】
学Python的伙伴,欢迎加入新的交流【君羊】:1020465983
一起探讨编程知识,成为大神,群里还有软件安装包,实战案例、学习资料

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-06-08 19:00:59  更:2022-06-08 19:03:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 14:08:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码