python小课堂37 - 你并没有真正的理解 if name 的作用
off999 2025-01-07 14:54 32 浏览 0 评论
前言
在 Python 中,我们经常会看到
if __name__ == '__main__':
那么你真的理解此写法的作用吗?今天我们就来聊一聊它真正的含义。
笔者最喜欢的就是用示例讲明白一个问题,这次也不例外,依然是看例子来说话!
示例说话
举个例子来说:
有一个物体质量 m=10,g=9.8 (重力参数),求它的重力。 公式:G=m*g 所以创建一个 param.py 的文件,其中代码如下:
# 重力参数
g = 9.8
def main():
print("g:", g)
main()
>>> 控制台会打印出 --> g : 9.8。
在创建一个 sum.py 的文件求 G ,代码如下:
# 在这里我们将上面文件定义的param中的g作为重力参数引入到其中
from param import g
# 计算重力的函数
def calc_G(m):
G = m * g
return G
def main():
print("G:", calc_G(10))
main()
结果如下:
结果可以看到,在 param.py 文件中的 main 函数也被执行了,而实际上我们并不希望它被执行,只是想 G 被打印出来即可。
此时 if __name__ == '__main__' 便派上了用场。我们将 param.py 中稍作修改:
# 重力参数
g = 9.8
def main():
print("g:", g)
if __name__ == '__main__':
main()
加上后,Pycharm 中多了一个绿色小按钮,点击后:
可以看到,在 param.py 中加上这么一句话,起到了一个入口函数的作用,也就是说对于 param.py 来说,程序入口是从这里开始的。同时不影响它自身的 g 打印输出,那么来看下求 G 中的程序。
求重力 G 的程序中,我们是没有改变任何代码的,可以看到结果已经变了。
结论
if __name__ == '__main__' 相当于 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 name 的值。
name 是内置变量,用于表示当前模块的名字。
所以,
if __name__ == '__main__'
我们简单的理解就是: 如果本模块是被直接运行的,则代码块被运行,如果本模块是被导入到其它模块中去,则处于 name 中的代码不被运行。
官方文档
查阅官方文档可以看到相应的解释:
什么?看不懂,来个中文的!~
https://docs.python.org/3/library/main.html?highlight=name
原文链接
关于 Flask 中的拓展知识
学过 Flask 的同学,可以看下此知识点,没有学过的也可以了解一下,万一后续用到了呢,有可能面试中会问到的一个小知识点。
在 Flask 框架中,我们通常使用下面的代码来进行项目的启动:
from flask import Flask
app = Flask(__name__)
# Flask quickly start
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=81)
上面的代码是官方给出来的一段最快启动的小 demo。不难发现,在官方定义的代码中,入口函数把 app.run() 放在了if __name__ == '__main__'里。
但是有没有想过为什么要放在里面呢?
正常开发情况下调用 app.run() 启动,使用的 web 服务器是 Flask 自带的一个简单内置服务器。
对于生产环境而言,启动一个 Flask 项目是不能直接通过 Python 去运行的,因为还面临着很多问题,比如并发性不好,无法监控项目各指标等。。。
所以在正式的生产环境中,我们是不会使用 Flask 自带的服务器的,而是通过 nginx + uwsgi 来部署项目。 nginx 作为前置服务器,用来接收浏览器发来的请求,接着会把请求转发给 uwsgi ,uwsgi 会以配置文件的形式加载我们写好的项目,而加载入口则是本地开发环境下的 app.run() 方法所在的入口模块。就像下图:
于是,在生产环境下, app.run() 所在的模块相对于 uwsgi 来说便不是入口文件了,它是需要被导入到 uwsgi 中的一个普通模块。使用if __name__ == '__main__' 的用途就是,不让 app.run()进行启动。也就是禁止所谓 Flask 自带的服务器启动。
这块儿算是一点小小的拓展,关于拓展知识,若是哪里有疑问,欢迎沟通交流呐!
有想交流Python的同学,欢迎关注公号:migezatan(咪哥杂谈)。
相关推荐
- 音乐大全300首免费听(音乐歌曲大全免费)
-
1、《红昭愿》《红昭愿》,这首歌曲由音阙诗听演唱,音阙诗听在古风歌曲界早已有一定名气。这首《红昭愿》与他们之前的风格很相似,歌曲节奏欢快,其中掺杂了不同的音乐元素,融合在一起才有了这一动听的歌曲。2、...
- 搜狗输入法的优势(搜狗输入法的优势和劣势)
-
1、在输入50个左右的字符之后,搜狗输入法的耗电量为225μAh,只从绝对耗电量来看可以说是微乎其微的。但是如果是频繁使用,应该还是会耗一些电的。2、搜狗拼音输入法(简称搜狗输入法、搜狗拼音)是200...
- 直接下载mp3音乐的网站(直接下载mp3音乐的网站推荐)
-
说明书里有呀91flac音乐网,试试这个,绝对好使,但是不要在酷狗上面说有几个网站挺不错的一个酷猪首页上的歌曲都很好听还有一个是http://www.songtaste.com/music/这个网...
- h5视频播放器(h5视频播放器适配竖屏模式)
-
要实现H5播放器在切换窗口时不暂停,可以使用WebAPI中的PageVisibilityAPI。该API允许开发者检测页面是否可见或隐藏。当页面切换到后台时,可以通过监听visibilitych...
-
- 百度云盘网页登录入口(百度网页入口官网网址)
-
手机登陆云盘可以通过更改UA设置来解决,方法如下:1.打开浏览器,点击进入浏览器的菜单选项。2.在设置的页面中,找到【浏览器标识/UA】,这个选项默认是【手机版】,即默认打开手机版网页。点击进入更改3.进入浏览器标识选择页面,将UA设置为电...
-
2026-02-03 00:15 off999
- 韩国色情大片震撼来袭
-
《千与千寻》导演:宫崎骏剧情简介:千寻和爸妈在去新家途中误入了一个诡异世界,爸妈因为贪吃变成了猪,许多半透明的怪人围攻千寻,幸被小白救下。小白给千寻吃了阻止身体消失的药,两人成为朋友。不料小白又被一...
- 天天斗地主单机(欢乐斗地主单机版免费)
-
有,可以在软件商店直接搜索单机斗地主。1.单机斗地主不要钱,不用流量。2.单机的玩法少,有单一的斗地主,闯关式的斗地主,残局式的斗地主,普通的斗地主。3.闯关式的斗地主,这种斗地主AI的水平都是控制...
- 最新网游(最新网游3d)
-
金山软件公司西山居工作室,于1995年5月在珠海成立,是国内最早的游戏开发工作室。1996年1月,西山居发布了中国大陆第一款商业游戏——《中关村启示录》,标志着金山公司正式进入游戏领域。龙骑士是首...
- 360一键重装系统(360一键重装系统后无法登录)
-
360并不提供自动重装系统的功能。重装系统是一项比较复杂的操作,需要对计算机硬件和软件有一定的了解,并且需要备份重要数据,重新安装操作系统和应用程序等。如果您需要重装系统,可以按照以下步骤进行操作:备...
- 免费离线单机斗地主(离线斗地主单机版免费)
-
想下载免流量不花钱斗地主,和麻将单机斗地主介绍:单机斗地主游戏是一款不需要联网的棋牌类手机游戏,此款斗地主最大的亮点是拥有强大的AI以及智能的提示功能。电脑具有很高的人工智能,为玩家提供了强劲的对手,...
- 58动漫(58动漫 官方入门网站)
-
打不开的原因可能有很多种,需要一一排查。首先要检查自己是否连接上了互联网,如果没有,就先联网。其次看一下叔叔有没有攻击。可能动漫网的版本比较低导致无法打开假的,58上面很多招聘工作跟他上线的信息不符合...
- 精准客户电话号码采集软件(精准客户电话号码采集软件下载)
-
是正规平台。JMTOOL是一个采集工具软件。数据采集,又称数据获取,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。数据采集技术目前广泛应用于各个领域。针对制造业企业的庞大生产数据,数据...
- 暴风影音5播放器手机安卓版下载
-
应该是清理软件或者安全软件禁止了软件的后台运行!下载安装暴风影音的具体方法如下:1、准备一个U盘,在电脑网络上下载暴风影音软件安装包(apk格式),复制并存储到U盘的根目录下。2、将U盘插入电视US...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
