热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python_if__name__=='__main__'理解

一.程序入口对于很多编程语言来说,程序都必须要有一个入口,比如C,C,以及完全面向对象的编程语言Java,C
一.程序入口

对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果我们接触过这些语言,对于程序入口这个概念应该很好理解。

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

而Python则不同,它属于脚本语言,不像编译型语言那样现将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。(关于解释性语言和编译型语言的区别可以看这里)

一个Python源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。

接下来我们先举一个例子:

假设我们有一个const.py文件,内容如下:

PI = 3.14def main():print("PI:", PI)main()

我们在这个文件里面定义了一些常量,然后又写了一个main函数来输出定义的常量,最后运行main函数就相当于对定义做了一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python const.py),输出:

PI: 3.14

现在我们有一个area.py文件,用于计算圆的面积,该文件里面需要用到const.py文件中的PI变量,那么我们从const.py中把PI变量导入到area.py中:

from const import PIdef calc_round_area(redius):return PI * (radius ** 2)def main():print("round area: ", calc_round_area(2))main()

运行area.py,输出结果:

PI: 3.14
round area: 12.56

可以看到,const中的main函数也被运行了,实际上我们是不希望它被运行,提供main也只是为了对常量定义进行一下测试。这时,if__name__ == '__ main __'就派上了用场。把const.py改一下:

PI = 3.14def main():print("PI:", PI)if __name__ == "__main__"main()

然后再运行area.py,输出如下:

round area: 12.56

再运行一下const.py,输出如下:

PI: 3.14

这些就是我们想要的效果。因为__ name __ 代表当前模块的名字,当我们再次运行“python area.py”时,对于const.py来说,__ name __ 不再是__ main __,因此其中的mian()不再被执行。

if name == ‘__ main __’ 就相当于是Python模拟的程序入口。Python本身并没有规定这么写,这只是一种编程习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __ name __ 的值。

二.__ name __

__ name __ 是内置变量,用于表示当前模块的名字,同时还能反映一个包的结构。

我们先来举一个例子,假如有下面一个包:

a
├── b
│ ├── c.py
│ └── __init__.py
└── __init__.py

目录中所有py文件的内容都为:

print(__ name __)

我们执行 python -c “import a.b.c” ,输出结果:

a
a.b
a.b.c

由此可见, __ name __ 可以清晰地反映一个模块在包中的层次。其实,所谓模块名就是import时需要用到的名字。

import tornado
import tornado.web

这里的tornado和tornado.web就被称为模块的模块名。

如果一个模块被直接运行,则其没有包结构,其 __ name __ 值为 __ main __ 。例如在上例中,我们直接运行c.py文件(python a/b/c.py),输出结果如下:

__ main __

所以,对于 if __ name __ == '__ main __'我们简单的理解是:如果模块被直接运行,则代码块被运行,如果模块是被导入的,则代码不被运行


推荐阅读
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 开发笔记:python协程的理解
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了python协程的理解相关的知识,希望对你有一定的参考价值。一、介绍什么是并发?并发的本质就是 ... [详细]
  • Python语言简介、环境搭建、PyCharm的安装和配置
    一、Python语言简介1.1Python语言的基本概念官方对Python语言的介绍如下:Python是一款易于学习且功能强大的编程语言。它具有高效率的数据结构,能够简单又有效地实 ... [详细]
  • 开发笔记:超全的《 Django 入门教程 》上线了,居然还免费!
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了超全的《Django入门教程》上线了,居然还免费!相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
lovejiao2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有