首页 > 编程语言 >Python 文件与模块的运行顺序及调用时的执行流程详解【大白话版本!!】

Python 文件与模块的运行顺序及调用时的执行流程详解【大白话版本!!】

时间:2024-10-24 15:52:17浏览次数:10  
标签:name 大白话 Python 代码 module 详解 模块 执行

Python 文件与模块的运行顺序及调用执行流程详解

引言

ython 是一种强大的编程语言,具有极大的灵活性和简洁性。无论是在开发小型脚本,还是构建复杂的应用程序时,理解 Python 文件的运行顺序以及模块调用时的执行流程都至关重要。尤其当你开发大规模项目,涉及到多个模块(文件)之间的交互时,弄清楚它们之间的调用和执行顺序能帮助你避免很多困惑和错误。

本文将深入探讨 Python 文件或模块的运行顺序、如何被调用、以及 if name == “main”: 这一结构的作用,帮助你更好地理解 Python 程序的运行逻辑。我们将通过代码示例来解释其执行流程,并让你对 Python 文件的运行机制有更全面的了解

1.Python 文件的基本运行顺序

在 Python 中,文件被称为 模块。每当你运行一个 Python 文件时,Python 解释器会从上到下逐行执行代码。运行时分为几个主要步骤:

  • 从上到下依次执行:Python 解释器会逐行执行文件中的代码,函数和类的定义不会立即执行,而是被加载到内存中等待调用
  • 全局变量和表达式会立即执行:如果在文件中有赋值或表达式,它们会立即被执行。
  • 函数和类不会被立即执行:函数和类的定义只会被注册,而不会自动执行,除非在代码中明确调用它们

2.if –name– == “–main–”: 的作用

这是 Python 中的一个特殊结构,用来判断一个文件是直接运行,还是作为模块被导入到其他文件中

  • –name– 变量:每个 Python 文件都有一个内置的特殊变量 –name–,当该文件被直接运行时,–name– 的值为 “–main–”。但如果该文件被导入到另一个文件中作为模块使用,–name– 的值将是该模块的名称
  • if name == “main”: 块:这个块的代码只有在文件被直接运行时才会执行,而当文件被导入时则不会执行。这样可以避免在模块被导入时执行一些不必要的代码,确保只有在运行主程序时才执行特定的逻辑。

3.模块的调用流程

当一个文件被作为模块导入到另一个文件中时,Python 会执行以下步骤:

  • 查找模块:Python 通过 sys.path 查找模块的路径,找到该模块后会开始加载。
  • 执行顶层代码:Python 会执行被调用模块中的顶层代码(即不在任何函数或类中的代码),但不会执行 if name == “main”: 块中的代码
  • 将模块导入到当前命名空间:模块中的函数、类和全局变量会被导入到调用文件的命名空间中,可以在调用文件中使用。

4.代码示例

文件:module_a.py

# module_a.py

print("module_a: 顶层代码正在运行")

def say_hello():
    print("module_a: Hello from module_a!")

if __name__ == "__main__":
    print("module_a: 正在作为主程序运行")
    say_hello()
else:
    print("module_a: 被导入为模块")

文件:module_b.py

# module_b.py

import module_a  # 导入 module_a

print("module_b: 顶层代码正在运行")

def say_hello_from_b():
    print("module_b: Hello from module_b!")

if __name__ == "__main__":
    print("module_b: 正在作为主程序运行")
    say_hello_from_b()
else:
    print("module_b: 被导入为模块")

5.运行分析

直接运行 module_a.py 的输出:

module_a: 顶层代码正在运行
module_a: 正在作为主程序运行
module_a: Hello from module_a!

解释:

  • 当直接运行 module_a.py 时,Python 解释器首先会执行模块的顶层代码(即 print(“module_a: 顶层代码正在运行”))。
  • 由于 name == “main” 为 True,所以会执行 if name == “main”: 块中的代码。
  • 然后,调用 say_hello() 函数,输出 “module_a: Hello from module_a!”。

运行 module_b.py 的输出:

module_a: 顶层代码正在运行
module_a: 被导入为模块
module_b: 顶层代码正在运行
module_b: 正在作为主程序运行
module_b: Hello from module_b!

解释:

  • 当运行 module_b.py 时,Python 首先导入 module_a。在导入过程中,Python 会执行 module_a.py 的顶层代码,输出 “module_a: 顶层代码正在运行”。
  • 由于 module_a.py 被导入,name != “main”,所以会执行 else 块中的代码,输出 “module_a: 被导入为模块”。
  • 然后,Python 执行 module_b.py 中的顶层代码,输出 “module_b: 顶层代码正在运行”。
  • 因为 module_b.py 是直接运行的,所以 name == “main”,会执行 if name == “main”: 块中的代码,调用 say_hello_from_b(),输出 “module_b: Hello from module_b!”。

6.运行顺序与执行流程总结

  • Python 文件的运行顺序是从上到下依次执行的,函数和类的定义会被注册到内存中,但不会立即执行,除非在程序中显式调用。
  • if name == “main”: 块的作用 是确保文件只有在作为主程序运行时才执行特定的代码,而当它被导入到其他模块时,避免执行这些不必要的代码。
  • 模块的导入流程:当一个文件被导入时,Python 会执行其顶层代码,但不会执行 if name == “main”: 中的代码,这样可以避免意外执行不必要的逻辑。

总结

理解 Python 文件和模块的运行顺序及调用方式,是编写高效、清晰和健壮代码的关键。if name == “main”: 是一个非常有用的结构,确保在运行主程序时执行所需的代码,而在模块导入时避免不必要的执行。通过清晰地定义模块行为和主程序行为,我们可以使代码更具扩展性和可维护性!如果你是初学者,不妨多尝试写几个模块相互调用的小项目,进一步理解这些机制。
觉得有用的同学 关注 点赞 收藏一下 !!!
欢迎评论区讨论交流

标签:name,大白话,Python,代码,module,详解,模块,执行
From: https://blog.csdn.net/qq_41889538/article/details/143209950

相关文章

  • python、JavaScript 、JAVA等实例代码演示教你如何免费获取股票数据(实时数据、历史数
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • HONEYWELL霍尼韦尔QCS系统5425400详解
    HONEYWELL霍尼韦尔QCS系统5425400是霍尼韦尔公司提供的一款高质量控制系统,该系统被广泛应用于多个工业领域,以下是关于该系统的详细介绍:一、系统概述HONEYWELL霍尼韦尔QCS系统5425400作为质量控制及系统的重要组成部分,具有高精度、高稳定性和易操作等特点。该系统采用先进的测......
  • 【C语言】自定义类型(结构体、枚举、联合的详解)
    写在前面今天是10月24日来到了一年一度的程序......
  • RSA算法详解及相关数学原理解析
    RSA算法详解及相关数学原理解析前言‍为了记录自己学习密码学的过程,也是为了便于个人应付相关课程的考核,故写此博客。本博客总结了怎么用C++手搓一个RSA算法,以及补补欠缺的一些数学知识和可能欠缺的一些其他算法的实现。参考了其他人的相关博客,用便于我自己理解的话和方式和......
  • 基于python的金融分析与风险管理-代码块-c8-股票投资组合
    绘图importnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt##Matplotlib是一个用于绘制数据可视化的Python库。它提供了一种类似于Matlab的绘图接口,可以用于生成各种静态、动态、交互式的图形,包括线图、散点图、柱状图、饼图、等高线图等。###Matplotlib......
  • 使用跳板机在 PyCharm 中配置远程服务器的 Python 环境
    使用跳板机在PyCharm中配置远程服务器的Python环境在需要通过跳板机连接到远程服务器时,PyCharm提供了一些内置的方式,可以让你通过中间服务器访问远程机器上的Python解释器。本指南将介绍如何使用PyCharm通过跳板机连接,并在远程服务器上运行Python。前提条件PyCharm......
  • python编程语言实现身份证实名认证?身份证查询接口
    互联网的便利性犹如一把双刃剑,在给人们带来便利的同时,也滋生了网络诈骗、网络水军等影响网络健康、安全的隐患。为了更好地监管网络安全,建设绿色、健康的网络环境,互联网平台软件均开始实行实名认证,下面以翔云身份证实名认证接口为例。翔云身份证实名认证接口,实时联网,通过......
  • 改变函数调用上下文:apply与call方法详解及实例
    目录改变函数调用上下文:apply与call方法详解及实例一、什么是apply方法?1、apply语法2、apply示例二、什么是call方法?1、call语法 2、call示例三、apply和call的共同与差异1、apply和call的共同点2、apply和call的差异四、apply和call的其他实......
  • python编程语言实现身份证实名认证?身份证查询接口
    互联网的便利性犹如一把双刃剑,在给人们带来便利的同时,也滋生了网络诈骗、网络水军等影响网络健康、安全的隐患。为了更好地监管网络安全,建设绿色、健康的网络环境,互联网平台软件均开始实行实名认证,下面以翔云身份证实名认证接口为例。翔云身份证实名认证接口,实时联网,......
  • python C3算法
    PythonMROC3算法是python当中计算类继承顺序的一个算法,从python2.3以后就一直使用此算法了。c3linearization算法称为c3线性化算法C3算法原理首先定义几个符号的意义:符号意义L针对一个类进行解析用L进行表示,例如L(A)表示对类A进行解析merge合并操作的一个函......