一文弄懂 if __name__ == “__main__“:(洒洒水啦!)

news2024/11/26 2:53:21

        本篇文章是博主在AI、无人机、强化学习等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习

       AI学习笔记(2)---《一文弄懂 if __name__ == "__main__":(洒洒水啦!)》

一文弄懂 if __name__ == "__main__":(洒洒水啦!)

目录

1 举例看看:

小刚视角,即gang.py   

小红视角,即hong.py

2 深入看看:

3 再往前走走:


        大部分初学者在阅读python代码的时候,可能会看到 if __name__ == "__main__": 这行代码,对于这行代码可能不太了解,特别是对于从C、C++、 Java、C# 等编程语言学习转到Python学习的时候(哈哈,我就是其中的一位)。

        先不解释这行代码所代表的含义,咱们先举个实例。

1 举例看看:

        小刚的好朋友小红约小刚明天去吃螺蛳粉,小刚喜欢小红,一时口顺答应了,but小刚其实是不太想去吃的。

        把小刚和小红都作为一个.py文件。现在小红和小刚都要执行了明天去吃螺蛳粉的事件,我们用print打印出来。

小刚

gang.py

#小刚
print("小刚明天去吃螺蛳粉")

小红

hong.py 

#小红
print("小红明天去吃螺蛳粉")

小刚视角,即gang.py   

        由于小刚不想去吃螺蛳粉,小刚又不想让小红知道,小刚就只能心里想想。

        心里想的话就放在  if __name__ == '__main__': 后面

        在gang.py加上

        if __name__ == '__main__':

        后面执行他所想的事情

#小刚
print("小刚明天去吃螺蛳粉")

if __name__ == '__main__':
    print('小刚心里想:不想吃螺蛳粉')

 运行结果:

我们可以看到这里执行了 if __name__ == '__main__': 后面的 print,打印出了

小刚心里想:不想吃螺蛳粉


小红视角,即hong.py

小红邀请了小刚吃螺蛳粉,将这个动作认为使用 import 导入了 gang.py

#小红
import gang
print("小红明天去吃螺蛳粉")

 运行结果:

可以看到,小红只知道小刚和自己要去吃螺蛳粉,而不知道小刚的真实想法。

        小刚心里想:不想吃螺蛳粉。

        从代码层面上来说,hong.py使用 import 调用gang.py时。

        if __name__ == '__main__':之前的语句被执行,之后的没有被执行。


2 深入看看:

我们在gang.py脚本的if __name__=="__main__":之前使用 print 将 __name__ 打印出来,

#小刚
print("小刚明天去吃螺蛳粉")
print(__name__)
if __name__ == '__main__':
    print('小刚心里想:不想吃螺蛳粉')

运行结果如下:

再执行 hong.py 呢?运行结果如下:

可以观察到:

  • gang.py执行后变量__name__的值为"__main__"
  • hong.py执行后变量__name__的值为"gang"。回归到 if 条件判断本身,因为不满足__name__=="__main__"的条件,因此,无法执行其后的代码。

原理如下:

        由于每个Python文件都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py)。

        如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。

        “__main__”等于当前执行文件的名称(包含了后缀.py)。(“__main__” = 文件名.py

        所以当模块被直接执行时,__name__ == '__main__' 结果为真;而当模块被import到其他模块中时,__name__ == '__main__'结果为假,就是不调用对应的方法。

        简而言之就是:__name__ 是当前模块名,当模块被直接运行时,用 __main__ 代表模块名,if 判断满足,后面代码将被运行。

        当模块是被导入时,if 判断不满足代码不被运行。


3 再往前走走:

        涉及到了一个程序入口的概念

        对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++, Java,C# 等。

        其中C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样的,Java 和 C# 则必须要有一个包含 Main 方法的主类来作为程序入口。

        但和C,C++、Java 以及 C# 等有所不同的是,Python属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,python是动态的逐行解释运行,也就是从脚本第一行开始运行,没有统一的入口。

另外,python文件有两种使用方法:

  1. 第一种:直接作为脚本执行
  2. 第二种:import到其他的python脚本中被调用(模块重用)执行,也就是作为模块(库)被导入执行

       但是,不管是直接运行还是导入,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。但实际使用过程中,python文件作为模块被其它python脚本调用执行的时候,有的代码我们是不希望被运行的。

        而if __name__ == '__main__' 的作用就是定义这两种情况执行代码的执行方式,在该语句下的代码只有在文件作为脚本直接执行情况下才会被执行,而import到其他脚本中是不会被执行的。


那么弄懂了吗?朋友们

本文部分内容抄录和借鉴下面两篇文章,大家可以看看:

Python编程中的if __name__ == 'main' 的作用和原理

if __name__ == ‘__main__‘的详细讲解

     文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者关注VX公众号:Rain21321,联系作者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#练习题-构造函数

文章目录 前言题目习题1运行示例 习题2运行示例 参考答案习题1习题2 其他文章 前言 本篇文章的题目为C#的基础练习题,构造函数部分。做这些习题之前,你需要确保已经学习了构造函数的知识。 本篇文章可以用来在学完构造函数后加深印象,也可以…

在JavaScript中,什么是生成器函数(generator function)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 生成器函数概述⭐ 生成器函数的作用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域…

嵌入式开发系统中的加密性能:第1部分

嵌入式系统上的密码学基础密码术是处理数据的艺术和科学,因此外部团体在没有任何秘密的情况下就无法撤消或模仿该操作。它启用了高级功能,例如: 存储和传输期间信息的机密性 用户身份验证 接收/检索的信息的完整性 不可否认交易的 有效性…

美女制服扮演建模法-UMLChina建模知识竞赛第4赛季第13轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。第4题为附加题,对错不影响优胜者…

2023年中国家用路由器市场发展概况分析:家用路由器线上市场整体销量为1050.6万台[图]

在疫情过后的第一个半年度,已经连续三年规模下滑幅度超过15%的家用路由器行业,终于迎来一丝回暖迹象。2023年上半年,我国家用路由器线上市场整体销量为1051万台,同比下降5.5%,下降幅度开始收窄,销售额为24.…

为什么短视频离不开美颜SDK?短视频领域的秘密武器

在当今的社交媒体时代,短视频已经成为了人们获取信息、娱乐和社交的重要方式。无论是抖音、快手,还是Instagram、TikTok,短视频都以其独特的魅力吸引着数亿用户。而在这些短视频的背后,有一款名为“美摄美颜SDK”的秘密武器&#…

【Leetcode】 51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种…

iOS App上架全流程及相关处理

iOS app上架总体流程: 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP,上线成功 1、申请开发者账号 苹果开发者账号主要分为三种:个人账号、公司账号、企业账…

导致 JVM 内存泄露的 ThreadLocal 详解

为什么要有 ThreadLocal 当我们在学习JDBC时获取数据库连接时,每次CRUD的时候都需要再一次的获取连接对象,并把我们的sql交给连接对象实现操作。 在实际的工作中,我们不会每次执行 SQL 语句时临时去建立连接,而是会借助数据库连接…

Android用户登录与数据存储:从权限请求到内外部存储的完整实践【完整实践步骤、外部存储、内部存储】

步骤 1: 登录页面布局 在 MainActivity 中实现用户登录功能&#xff0c;首先创建一个布局文件 activity_main.xml 包含用户名和密码的输入字段以及登录按钮。 <!-- activity_main.xml --> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/andr…

Tomcat服务器下载、安装、配置环境变量教程(超详细)

请先配置安装好Java的环境&#xff0c;若没有安装&#xff0c;请参照如下博客上的步骤进行安装&#xff01; 安装Java环境教程Windows配置Java环境变量(下载、安装、配置环境)_第三女神程忆难的博客-CSDN博客 Tomcat部署Web项目&#xff08;一&#xff09;内嵌 Tomcat部署网站…

Java基于SpringBoot的社区维修平台

文章目录 简介环境需要住户前台功能模块管理员功能模块住户后台功能模块维修员后台功能模块源码咨询 简介 系统管理也都将通过计算机进行整体智能化操作,对于社区维修平台所牵扯的管理及数据保存都是非常多的,例如住户管理、社区公告管理、维修工管理、维修订单管理、接单信息…

STM32H723加上ThreadX,时钟不准确

硬件用的晶振是8MHz 的&#xff0c;默认这里是25&#xff0c;需要改为8&#xff0c;然后主频用400MHz 其他的&#xff1a; tx_thread_sleep(1000); //延时就是1秒了

【java问题排查方法】

文章目录 一、内存泄漏排查方案 一、内存泄漏排查方案 jmap是Java JDK提供的一个命令行工具&#xff0c;用于生成Java虚拟机的堆转储快照dump文件&#xff0c;它可以帮助开发者查看Java堆的内存使用情况&#xff0c;诊断内存泄漏和其他内存问题。 要使用jmap&#xff0c;需要…

tcpdump(五)命令行参数讲解(四)

一 案例讲解 tcpdump官方参考文档 最全的tcpdump手册 强调&#xff1a; -nn 选项一般是must 必选 ① 现场分析并保留现场信息 tcpdump -l | tee dat 使用tee来把tcpdump的输出同时放到文件dat和标准输出中场景&#xff1a; 自己现场分析同时把现场信息保留下来 ② …

tcpdump(四)命令行参数讲解(三)

一 BPF高级过滤条件 高级filter官方地址 常见需求案例汇总 过滤的目的&#xff1a;获取最精细、准确的数据思考&#xff1a; 抓取更精确的包?1) tcp/ip 报文结构要精通,这样才能知道如何获取自己想要的信息 -> 偏移量2) tcpdump 的synax语法要精通,要正确写对3) 多练习…

应用超高频RFID技术的银行款箱柜资产管理系统

背景概述 随着银行后台管理的集中化思路&#xff0c;对款箱的管理需要实现“安全、高效”的“管、控、营”一体化&#xff0c;传统的人工款箱管理模式和数据采集方式已无法满足银行管理的快速、准确要求&#xff0c;严重影响了银行整体运行效率。 传统的款箱管理存在以下问题…

【管理运筹学】第 9 章 | 网络计划(1,网络图的组成及绘制)

文章目录 引言一、网络图的组成及绘制1.1 网络图的组成1. 基本要素2. 线路与关键线路3. 网络图的类型 1.2 网络图的绘制1. 画图原则2. 绘图一般步骤 写在最后 引言 大纲里关于网络计划这一章的描述&#xff0c;就两个&#xff0c;一个是基本概念&#xff1a;网络计划、时间参数…

Zabbix监控系统与部署Zabbix6.0监控(系列操作完整版)

目录 Zabbix 6.0 1 zabbix 是什么 1.1 zabbix 监控原理 1.2 Zabbix 6.0 新特性 1.3 Zabbix 6.0 功能组件 2 Zabbix 6.0 部署 2.1 部署 zabbix 服务端 2.1.1 部署 Nginx PHP 环境并测试 2.1.2 部署数据库&#xff0c;要求 MySQL 5.7 或 Mariadb 10.5 及以上版本 2.1.3…

项目_数据可视化| 折线图.散点图.随机漫步

安装matplotlib 在正式开始编写程序之前&#xff0c;需要先安装pip、matplotlib模块&#xff0c;苹果系统的安装问题在之前的文章中有相关介绍内容&#xff0c;如果pycharm运行模块报错&#xff0c;可以再次检查是否版本兼容问题。 绘制折线图 调用subplot&#xff08;&#x…