python小课堂37 - 你并没有真正的理解 if name 的作用
off999 2025-01-07 14:54 26 浏览 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(咪哥杂谈)。
相关推荐
-
- 电子邮箱地址是什么(遂宁的电子邮箱地址是什么)
-
邮箱被赋予的一个唯一的序号,就像我们居住的地址,用意确定收件人。Internet中每个用户的电子邮箱地址都具有惟一性,这样可使邮件的收发更加方便、准确。通常电子邮件地址的格式为:user@mail.server.name,其中user...
-
2025-12-10 23:03 off999
- win10下载到u盘要多久(win10下到u盘多少g)
-
Win10下载到U盘所需的时间取决于多种因素,包括您的网络速度、计算机性能和U盘的读写速度。如果您的网络速度较快,下载Windows10的时间应该不会太长。从下载到将Windows10安装到U盘上...
- c盘100g剩多少才合适(c盘100g还剩30g够用吗)
-
够用。但前提是我们只能把C盘当做系统盘,一般系统(win10)只占30到个40g,加上一些系统运行缓存文件,C盘剩下的空间大概在40到50个g。所以说你的其他软件千万不能安装在C盘了,安装在D盘或者F...
- 腾讯电脑管家官网网址(腾讯电脑管家介绍)
-
就是正常的输入你路由器的账户密码,如果你的默认密码没有修改。那你可以看看你路由器底下,底下一般会有路由器的初始账号密码。首先需要使用数据线链接,手机完成匹配之后,使用WIFI链接,会随机刷出验证码。一...
- 免费下载qq2025新版本手机(下载qq2020最新版)
-
1/4找到QQ注册的官网进入官网2/4填写信息申请页面中需要填写昵称,密码,验证码及其他信息,然后点击确定即可。3/4登录QQ完成上一步之后,页面上会显示申请的QQ号码,和登录QQ按钮,点击登录QQ。...
- win10模拟器电脑版下载(win10模拟器正版)
-
在Windows10模拟器上下载应用程序,可以按照以下步骤进行操作:1.打开Windows10模拟器:在电脑上打开Windows10模拟器软件,如MicrosoftVisualStudio...
- 微星主板开机自动进入bios(微星主板开机自动进入bios怎么关闭)
-
原因:一是硬盘的问题,二是bios设置错误。1、现在新型的主板都有快速启动模式,需要硬盘的支持,而且他会装入特定主板驱动,以达到开机几秒,让客户觉得这电脑很牛叉。缺点就是,一旦驱动程序出问题,或者系统...
- 深度技术windows下载(深度技术系统官网win10)
-
要下载原神,您可以按照以下步骤进行操作。首先,打开您的手机应用商店(如AppStore或GooglePlay),在搜索栏中输入“原神”。然后,找到原神游戏应用,并点击“下载”按钮。等待下载完成后,...
- 鼠标指针图案可爱(鼠标指针图片素材)
-
鼠标箭头使用什么颜色好?让我们在使用鼠标的时候,我们发现鼠标进到的同城是个白色,如果你想设置的话,你可以根据你的界面来,如果你的界面底色是白色,那么你就可以使用显眼的黑色和红色都可以,然后你自己喜欢什...
- 企业级tplink初始账号和密码
-
tplink管理员初始密码是admin。需要注意的是只有老款的tplink路由器才有默认的初始密码,可以在tplink路由器的铭牌标签上查看到,而新款的tp-link路由器没有默认的初始密码了,登录密...
- 台式电脑无internet访问(电脑无法连接网络无internet访问)
-
检查本机,方法:ping本机ip或127.0.0.1,若ping同通,则本机网络正常。若ping不通,则考虑重新安装tcp/ip网络协议。检查网络,方法:ping网关,若ping通,则网络正常。若p...
- 华为平板电脑系统怎么重装(华为平板电脑重装系统步骤)
-
1、当平板电量耗尽,刚插上充电器时可能无法立即开机,请持续充电一段时间,再开机使用。2、可能是系统故障,可以使用华为系统恢复(eRecovery)恢复平板系统版本。具体步骤:a、通过USB数据线将...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
- 最近发表
- 标签列表
-
- 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)
