关于Python中的if __name__ == ‘__main__’详情

目录
  • 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)

我们写完一个函数后,不免要写一些测试的代码,而这些测试的代码我们不希望他们在引入时执行,只有当我们主动执行进行测试才执行这些测试代码。

到此这篇关于关于Python中的if __name__ == ‘__main__'详情的文章就介绍到这了,更多相关Python中的if __name__ == ‘__main__'内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-09-13

Python3.10的一些新特性原理分析

Python 3.10.0a2 版本已经于 2020-11-04 发布,因此我们可以窥见 Python 3.10 的一些新特性.这些新特性很可能会改变未来的 Python 生态系统,使其朝着更明确,更易读的方向发展,同时保持我们熟知和喜欢的易用性. PEP 602 1.类型注释的进一步扩展 3.9 版对 Python 中的类型提示和注释进行了大幅度修改和清理,类型提示这似乎是一种持续的趋势,在 3.10 中得到进一步扩展,目的很明显,是为了更好的可读性,无需看代码即可得知变量和函数返回值的类型.

浅谈Python的元编程

目录 一.装饰器 二.装饰器的执行顺序 三.元类 四.descriptor 类(描述符类) 五.总结 相应的元编程就是描述代码本身的代码,元编程就是关于创建操作源代码(比如修改.生成或包装原来的代码)的函数和类.主要技术是使用装饰器.元类.描述符类. 一.装饰器 装饰器就是函数的函数,它接受一个函数作为参数并返回一个新的函数,在不改变原来函数代码的情况下为其增加新的功能,比如最常用的计时装饰器: from functools import wraps def timeit(logger=None

Python编程应用设计原则详解

目录 1.单一职责原则 SRP 2.开闭原则 OCP 3.里氏替换原则 (LSP) 4.接口隔离原则 (ISP) 5.依赖反转原则 (DIP) 最后的话 写出能用的代码很简单,写出好用的代码很难. 好用的代码,也都会遵循一此原则,这就是设计原则,它们分别是: 单一职责原则 (SRP) 开闭原则 (OCP) 里氏替换原则 (LSP) 接口隔离原则 (ISP) 依赖倒置原则 (DIP) 提取这五种原则的首字母缩写词,就是 SOLID 原则.下面分别进行介绍,并展示如何在 Python 中应用. 1.

Python办公自动化PPT批量转换操作

目录 python-pptx 模块的安装 读取 PPT 写入 PPT 添加一张幻灯片 为幻灯片添加内容 获取幻灯片中的形状: 添加自动形状 占位符 访问占位符 将内容插入占位符 如果要插入表格: 如果要插入图表: PPT 转 Pdf 最后的话 如果你有一堆 PPT 要做,他们的格式是一样的,只是填充的内容不一样,那你就可以使用 Python 来减轻你的负担. PPT 分为内容和格式,用 Python 操作 PPT,就是利用 Python 对 PPT 的内容进行获取和填充,修改 PPT 的格式并不

Python编程编写完善的命令行工具

目录 1. python-fire 2. mando 最后的话 1. python-fire python-fire 是一个三方库,可以将任何 Python 对象变成一个命令行接口. 使用前先 pip install fire 下. 可以把你的函数直接变成命令行接口: import fire def hello(name="World"): return "Hello %s!" % name if __name__ == '__main__': fire.Fire(

python的变量和简单数字类型详解

目录 1. 变量 1.1 使用变量名时避免命名错误 2.字符串 2.1 修改字符串大小写的方法 2.2 合并字符串 2.3 使用制表符或换行符来添加空白 2.4 删除空白 2.5 使用字符串时需要避免语法错误 3. 数字类型 3.1 整数 3.2 浮点数 3.3 复数 3.4 使用函数str()避免类型错误 4 .注释 5 .python之禅 总结 1. 变量 每个变量都存储了一个值 在程序中可以随时修改变量,但Python将始终记录变量的最新值 message = "Hello Huang Z

Python黑魔法之metaclass详情

目录 一.什么是 metaclass 二.metaclass 能解决什么问题? 三.通过一个实例来理解 metaclass 四.Python 底层语言设计层面是如何实现 metaclass 的? 1.所有的 Python 的用户定义类,都是 type 这个类的实例. 2.用户自定义类,只不过是 type 类的 __call__ 运算符重载 3.,"超越变形"正常的类 四.使用 metaclass 的风险 关于Python 黑魔法 metaclass 的两种极端观点: 这种特性太牛逼了,

Python编程中Python与GIL互斥锁关系作用分析

我们知道,在 CPython 中,有一个全局解释器锁,英文叫 global interpreter lock,简称 GIL,是一个互斥锁,用来保护 Python 世界里的对象,防止同一时刻多个线程执行 Python 的字节码,从而确保线程安全,这导致了 Python 的线程无法利用多核 CPU 的优势,因此有人说 Python 的多线程是伪多线程,性能不高,那么 Python 将来有可能去除 GIL 吗? 要回答这个问题,先从 GIL 的起源进行分析. GIL 的起源 Python 第一次发布是

python可视化之颜色映射详解

本文主要介绍一下在学习可视化过程里遇到的一些情况 比如cmap=plt.cm.Blues的映射 import matplotlib.pyplot as plt from random_walk import RandomWalk # Keep making new walks, as long as the program is active. while True: # Make a random walk. rw = RandomWalk(50_000) rw.fill_walk() # P

一篇文章带你了解Python和Java的正则表达式对比

目录 简单批量替换 复杂模板替换 总结 参考资料: 正则表达式语法–菜鸟教程 Java正则表达式实现 简单批量替换 举例:将and 批量替换为&& Python实现 import re def transformSimple(fromRegex, toText, inText): return re.sub(fromRegex, toText,inText, flags =re.I) if __name__ == "__main__": inText = "x

Python函数式编程中itertools模块详解

目录 容器与可迭代对象 count() 函数 cycle 函数 repeat 函数 enumerate 函数,添加序号 accumulate 函数 chain 与 groupby 函数 zip_longest 与 zip tee 函数 compress 函数 islice.dropwhile.takewhile.filterfalse.filter 总结 容器与可迭代对象 在正式开始前先补充一些基本概念在 Python 中存在容器 与 可迭代对象 容器:用来存储多个元素的数据结构,例如 列表,元

Python办公自动化解决world文件批量转换

目录 python-docx 库简介 读取 Word 写入 Word Word 转 pdf 最后的话 只要是简单重复的工作,就想办法用 Python 来帮你解决吧,人生苦短,你需要 Python. Word 是办公软件中使用频率非常高的软件之一了,假如你需要调整 100 个 Word 文档的格式保持统一,或者要把 100 个 Word 全部转换为 pdf,那么你就需要 Python 来帮忙了. python-docx 库简介 python-docx 是一个可以对 Word 进行读写操作的第三方库

Python实现批量转换文件编码的方法

本文实例讲述了Python实现批量转换文件编码的方法.分享给大家供大家参考.具体如下: 这里将某个目录下的所有文件从一种编码转换为另一种编码,然后保存 import os import shutil def match(config,fullpath,type): flag=False if type == 'exclude': for item in config['src']['exclude']: if fullpath.startswith(config['src']['path']+o

python实现文件批量编码转换及注意事项

起因:大三做日本交换生期间在修一门C语言图像处理的编程课,在配套书籍的网站上下载了sample,但是由于我用的ubuntu18.04系统默认用utf-8编码,而文件源码是Shift_JIS编码,因而文档注释是乱码.在不改变系统默认编码的前提下,用python将'.c'和'.h'文件的编码转换保存新的文件夹,其余文件原封不动复制. import os abspath = "/home/fanghaoyu/桌面/libraries/" # 新文件夹的路径 try: os.makedirs(

使用python批量转换文件编码为UTF-8的实现

由于这两天换了IDE,在导入以前的工程的时候发现了一个大问题,由于以前脑残的我不知道改编码方式,导致出现了大量的GBK,这就很难受,要是一个两个还好说,可是这么多要是一个一个的改我会觉得现在的我比以前还脑残,于是乎,我就想用python批量的修改一下,然后就产生了这篇文章,其中好多不足的地方还请大佬指导 本来一开始的思路还是比较清晰,觉得也比较简单,天真的认为用GBK的方式读取出文件内容,然后UTF8写入就好了,可是在实际的操作中我发现我就是太天真了,出现了大量的问题,比如说: 怎么查看文件的编

python解决js文件utf-8编码乱码问题(推荐)

html文件中引入js文件,显示乱码! js文件为utf-8 编码(无bom)  ,此时只要将js文件转成utf-8 BOM编码就可以解决了 可以使用notepad++转码 也可以使用下面的python代码批量转码 # -*- coding:utf-8 -*- import os,sys import chardet def convert( filename, in_enc = "GBK", out_enc="UTF-8" ): try: print("

解决python大批量读写.doc文件的问题

前言: java语言读写.doc的出现乱码问题: 大家都知道当我们利用java语言读写.doc文件时,无论是利用流的方式将.doc文件的内容输出到控制台(console),还是将其写到其他文件中,无论你采取何种编码格式(utf-8,gbk等)输出,你看到的内容99%都是乱码. java语言读写.doc的出现乱码问题原因分析: .doc文件是微软开发的用于办公的编辑文字的软件之一,如果说一篇word文档的字体格式采用的是utf-8,那么你采用utf-8格式读写该文档,应该能够正确输出汉字,但是一旦

Python 利用高德地图api实现经纬度与地址的批量转换

我们都知道,可以使用高德地图api实现经纬度与地址的转换.那么,当我们有很多个地址与经纬度,需要批量转换的时候,应该怎么办呢? 在这里,选用高德Web服务的API,其中的地址/逆地址编码,可以实现经纬度与地址的转换. 高德API地址: 地理/逆地理编码:http://lbs.amap.com/api/webservice/guide/api/georegeo 坐标转换:http://lbs.amap.com/api/webservice/guide/api/convert 1.申请key 2.坐

Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作

1. 目标 通过hadoop hive或spark等数据计算框架完成数据清洗后的数据在HDFS上 爬虫和机器学习在Python中容易实现 在Linux环境下编写Python没有pyCharm便利 需要建立Python与HDFS的读写通道 2. 实现 安装Python模块pyhdfs 版本:Python3.6, hadoop 2.9 读文件代码如下 from pyhdfs import HdfsClient client=HdfsClient(hosts='ghym:50070')#hdfs地址

python实现快速文件格式批量转换的方法

用python实现文件夹下的成批文件格式转换 我们对于文件转换的需求很大,甚至于对于图片的格式,JPG和PNG格式在肉眼看来都没什么差别,但是对于计算机而言,它有时候就只接受这些肉眼看起来差不多的格式的其中一种. 环境 windows10 python3.7+pycharm 创建目录 1.在编程前,创建一个文件夹,并放入你想用的文件(非目录),这些文件的格式不合适. 例如,我在桌面创建了名为"in_path"的文件夹,在里面放进了.pgm和.png格式的文件,想让他们都转化成.jpg格

vbs脚本实现批量转换文件编码

最近需要使用SourceInsight查看分析在Linux系统下开发的项目代码,我们知道Linux系统中文本文件默认编码格式是UTF-8,而Windows中文系统中的默认编码格式是Gb2312.系统内的编码格式有所区别倒无伤大雅,关键的是SourceInsight竟不支持UTF-8,导致项目代码内的中文注释全部乱码! 既然SourceInsight不支持UTF-8编码的文件,那我们就得想办法将UTF-8的代码文件转化为GB2312编码的.首先想到的是到网上搜一下"批量编码转换工具",结

批量转换目录下文件编码的shell脚本代码

一例批量转换目录下文件编码的shell脚本代码. 需求描述:由于从window转linux过来,很多原来win下的gbk文件需要转换成utf8. 以下脚本仅判断非utf8文件转换成utf8文件,并且默认非utf8文件为gbk,如果文件类型不一致需要修改. 例子: 复制代码 代码如下: #!/bin/bash# File Name: iconv.sh# Author: wanggy# site: www.jb51.net#show_file(){    for file in `ls $1`