模块基础——模块简介、模块导入方式、模块查找顺序

Python导入模块的3种方式(超级详细) Python导入模块的3种方式(超级详细) 很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用 import(或 from…import) 语句引入该文件时,Python 解释器同时如下错误: ModuleNotFoundError: No module named '模块名' 意思是 Python 找不到这个模块名,这是什么原因导致的呢?要想解决这个问题,读者要先搞清楚 Python 解释器查找模块文件的过程。 通常情况下,当使用 import 语句导入模块后,Python 会 阅读详情

模块简介

  • 什么是模块?

    模块就是一系列功能的集合。在python中,一个py文件就是一个模块,文件名为mytest.py,则模块名为mytest,导入模块就可以引用模块中已经写好的功能和变量。

  • 为什么要使用模块?

    使用模块的目的是为了提高开发效率,站在巨人的肩膀上进行开发,保证了代码的重用性,又增加了程序的可维护性。

  • 模块的分类?

    1. 内置模块:在python解释器中已经存在的,例如time模块等。
    2. 第三方模块:别人已经写到的功能,并且在网上公开给其他开发者使用的。
    3. 自定义模块:就是自己写的,自己来用的模块。
  • 模块的表现形式?

    1. 使用python编写的代码(.py文件),一个py文件就是一个模块。
    2. 已经被编译为共享库或者DLL的C或C++扩展。
    3. 包含多个py文件的文件夹叫作包,包也是模块。
    4. 使用C编写并链接到python解释器的内置模块。

模块的使用

​ 使用模块的目的是为了提高开发的效率,那么我们该如何导入模块来供我们使用呢?下面介绍模块的导入方式。

import句式

​ 通过import加模块名,则表示对模块的导入。

有如下代码文件:

# test1.py  导入文件
num = 100
def get_num():
    print(x)
    
def change():
    global num
    num = 0

# start.py  执行文件
# 在学习模块的时候,首先分清楚谁是执行文件,谁是导入文件
import test1  # 导入的模块test1,注意不要加后缀

num = 200
x = test1.num  # 引用模块test1中num的值赋值给当前名称空间中的变量x
print(x)
test1.get_num()  # 调用模块test1中的get_num()函数
test1.change()  # 调用模块test1中的change()函数
  • 模块被导入时注意:

    模块会执行,但是导入多次,只会执行一次。

  • 模块首次导入时发生了哪些事?

    1. 运行执行文件,产生一个执行文件的全局名称空间。
    2. 运行被导入文件,产生一个模块的全局名称空间。
    3. 模块中的名字放入到模块的名称空间中。
    4. 在执行文件的名称空间中有一个test1的名称指向模块的名称空间。

    图解:
    image-20220115194307453

    注意:在start.py的名称空间中有与test1.py的名称空间中有相同的名字,但是在使用模块名称空间中的名字时,会通过test1.加名字来引用,所以不会出现名称冲突的问题。

from…import…句式

​ from…import…与import语句基本一致,唯一不同的是:使用import test1导入模块后,引用模块中的名字都需要加上test1.作为前缀,而使用from test1 import num,get_num,change来导入,start则可以在当前执行文件中直接引用模块test1中的名字,如下代码所示:

from test1 import num
from test1 import get_num,change

print(num)
get_num()
change()
  • 使用from…import…导入模块时注意:

    文件作为模块被导入时,模块文件会执行。

  • from…import句式首次被导入时发生了什么?

    1. 产生一个执行文件的名称空间。
    2. 运行导入文件。
    3. 产生一个导入文件的名称空间。
    4. 在执行文件中产生num,get_num, change,执行导入文件中的相应变量。导入文件中的名称若没有被导入,在执行文件中就无法使用,若要使用,则必须再次导入该名称。
  • 连续导入:

    from test1 import num,get_num,change

模块的补充知识
  • 使用as来起别名

    as既可以给模块起别名,也可以给模块中的某一个名字其别名

    示例:

    # my_first_model.py
    num = 100
    def get_num():
        print(x)
        
    def change():
        global num
        num = 0
        
    # start.py
    import my_first_model as model
    print(model.num)
    model.get_num()
    model.change()
    
    from test1 import num as a
    print(a)
    
  • 连续导入

    可以一个句式导入多个模块,每个模块之间用逗号隔开。

    示例:

    # 方式一:
    import time
    import os
    import sys
    
    # 方式二:
    import time,os,sys
    
  • 通用导入

    在使用from…import…句式时,可以使用*号来表示导入模块中的所有名称。

from test1 import *

print(num)
get_num()
change()

注意:模块的编写者可以通过在自己的文件中定义__all__变量来控制*号代表的意思。

# first.py
num = 100
def get_num():
    print(x)
    
def change():
    global num
    num = 0
__all__ = ['num','get_num']   



# start.py
from first import *
print(num)  # 可用
get_num() # 可用
change()  # 不可用
判断文件类型

​ 因为一个python文件,可以是执行文件,也可以是被导入文件,那么我们该如何来区分呢?python中通过__name__的内容来进行区分。

​ 注意:

​ 如果在执行文件中,__name__的值是__main__,并且是字符串类型。

​ 如果作为模块时,__name__的值被赋予模块名。

作为模块的开发者,可以在文件末尾基于__name__在不同应用场景下的值的不同来控制文件执行不同的逻辑。

# test.py
if __name__ == '__main__':
    test.py被当做脚本执行时运行的代码
else:
    test.py被当做模块导入时运行的代码
循环导入问题

​ 循环导入指的是在一个模块导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字,由于第一个模块尚未加载完毕,所以引用失败、抛出异常,究其根源就是在python中,同一个模块只会在第一次导入时执行其内部代码,再次导入该模块时,即便是该模块尚未完全加载完毕也不会去重复执行内部代码。我们从以下例子来做出分析:

# m1.py
print('正在导入m1')
from m2 import y

x='m1'

# m2.py
print('正在导入m2')
from m1 import x

y='m2'

# start.py
import m1

运行start.py:
image-20220115213740757
分析:

​ 先执行start.py,执行import m1,开始导入m1,并运行其内部代码,打印内容"正在导入m1",然后执行from m2 import y 开始导入m2并运行其内部代码,打印内容“正在导入m2”,再执行from m1 import x,由于m1已经被导入过了,所以不会重新导入,所以直接去m1中拿x,然而x此时并没有存在于m1中,所以报错。

解决方案:在文件的最后导入模块

# m1.py
print('正在导入m1')

x='m1'
from m2 import y

# m2.py
print('正在导入m2')

y='m2'
from m1 import x

# start.py
import m1

结论:

​ 循环导入问题是不允许出现的,如果出现,则是程序设计不合理。

模块的查找顺序(重点)
  1. 先从内存中查找
  2. 再从内置中查找
  3. 最后从sys.path,按照从左到右的顺序,依次查找。

如果在你的执行文件中找不到模块的时候,解决方案:把模块所在的路径加到sys.path中。

面向过程编程

​ 面向过程编程, 核心是”过程“二字,即先干什么,在干什么,最后干什么,表示一件事的执行步骤。面向过程编程不是一门技术,而是一种思想。

举例:把大象放冰箱分几步?

  1. 打开冰箱门
  2. 把大象塞进去
  3. 把冰箱门关上
面向过程的优缺点
  • 优点:使复杂的问题简单化

  • 缺点:扩展性差

  • 使用场景:在对扩展性要求不高的项目中可以使用面向过程的思想。

【Python】模块的导入和路径,详细解释 模块是一个包含 Python 代码的文件,通常以。 阅读详情

相关推荐

压电陶瓷传感器避坑指南:实测阻抗匹配对信号输出的影响(附示波器调试技巧)

本文深入探讨压电陶瓷传感器在工业振动监测中的阻抗匹配问题,通过等效电路模型和实测数据揭示负载阻抗对信号输出的关键影响。文章提供从元件选型到示波器调试的完整解决方案,特别强调100kΩ以上负载阻抗的重要性,并分享JFET缓冲器设计和PCB布局的实用技巧,帮助工程师避免信号失真和输出不稳定问题。

ooo22的博客 516

python学习Day16 模块的概念、模块的导入方式【import 模块名、from 模块 imoprt 功能】、模块的搜索路径、链式导入&循环导入...

复习 1.生成器中的send方法 -- 给当前停止的yield发生信息 -- 内部调用__next__()取到下一个yield的返回值2.递归:函数的(直接,间接)自调用 -- 回溯 与 递推 -- 重点:出口 | 递归的条件3.匿名函数 -- lambda 参数列表: (返回值, 返回值) -- 应用场景:1.用变量接受 | 2.结合内置函数使用 -- add = lambda n1, n...

weixin_30361753的博客 385

Python开发者必看:5分钟搞定Gemini API的3种调用方式(含代码示例)

本文为Python开发者详细介绍了三种高效调用Gemini API的核心方式:基础同步调用、流式调用和聊天模式,并涵盖多模态应用等高级特性。通过清晰的代码示例和实战场景分析,帮助开发者快速掌握Gemini API的集成与优化,提升AI应用开发效率。

g8f9d0s1a2的博客 1122

模块相关基础知识(学习笔记)

import语句 导入模块 from … import …语句 导入指定内容 if __name__ == '__main__' 程序的入口

weixin_44061552的博客 262

AvFrame和AvPacket

在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。

Lce的专栏 3236

工作中SVN的使用,保姆级教程!

SVN是一款集中式版本控制系统,采用客户端-服务器模式管理代码版本。与Git相比,SVN在目录权限控制、大型二进制文件处理等方面具有优势,适合特定场景使用。本文介绍了SVN的安装方法、基本操作(检出、提交、更新、回滚等)以及分支管理(创建、合并、切换)。同时讲解了文件冲突的解决方法,并演示了如何在IDEA中集成SVN工具。SVN虽然逐渐被Git取代,但在某些特定场景下仍是可靠选择,工具选择应基于团队和项目需求。

胜人者有力,自胜者强! 1854

Python---模块与包

一、模块 模块就是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。 模块是非常简单的Python文件,单个Python文件(.py)就是一个模块,两个文件就是两个模块。 模块知识点网络图: 1、如何导入python内置模块 模块导入方式1:import 模块名1,模块名2和import 模块名.函数名 问:为什么必须加上模块名调用呢? 答:因为可能存在这样一种情况:在多个模...

Wangtuo1115的博客 364

从NASA DataPort下载到PyTorch Dataset:手把手处理USGS光谱库的AVIRIS数据

本文详细介绍了如何从NASA DataPort下载USGS光谱库的AVIRIS高光谱数据,并将其转化为PyTorch Dataset对象。内容涵盖数据获取、预处理、辐射定标及高效数据加载技巧,特别针对AVIRIS数据的水吸收波段剔除和波段分组标准化进行了重点讲解,为环境监测、地质勘探等领域的研究者提供实用指南。

weixin_30607659的博客 283

python模块如何导入解释器_Python3模块与包管理,Python解释器

前面我们了解了函数,lambda表达式,参数类型与传参,及变量作用域LEGB等内容,今天我们了解下Python模块与包管理。模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py包是管理模块命名空间的一种形式,包结构类似于电脑上的文件夹结构,一般有顶层包,下面有子包,子包下面又有.py模块。包和模块存在的意义是为了提高代码复用性,方便别的程序去引入,这在其它编程语言里也都是常见和常用的。py...

weixin_39633954的博客 1031

QNX Neutrino 进程间通信编程之Message-passing/Pulse

Interprocess Communication(IPC,进程间通信)在QNX Neutrino从一个嵌入式实时系统向一个全面的POSIX系统转变起着至关重要的作用。IPC是将在内核中提供各种服务的进程内聚在一起的粘合剂。在QNX中,消息传递是IPC的主要形式,也提供了其他的形式,除非有特殊的说明,否则这些形式也都是基于本地消息传递而实现的。本篇幅主要讲解Message-passing和Pulse。

zhuwade的博客 3533

OpenCV卡尺工具实战:5步搞定工业级圆与直线拟合(附完整C++源码)

本文详细介绍了使用OpenCV卡尺测量工具实现工业级圆与直线拟合的5个关键步骤,包括核心原理、环境配置、边缘点提取优化、鲁棒性几何拟合实现及QT集成技巧。通过模块化C++源码和实战案例,帮助开发者快速掌握高精度尺寸测量技术,适用于机械零件、PCB板等工业检测场景。

uran的专栏 843

python基础——模块【模块的介绍,模块的导入,自定义模块,*和__all__,__name__和__main__】

python基础——模块【模块的介绍,模块的导入,自定义模块,*和__all__,__name__和__main__】,详细讲解,附带示例

tan_run的博客 4777

基于STM32的HC-SR04超声波模块测距(新手级)

本人是嵌入式新手,学习了STM32的部分内容,最近想找些项目做,然后顺便学习了一下HC-SR04超声波模块,学习过程中也参考了一些大佬的文章。本文记录了自己的学习方法和学习过程,同时也希望能和各位大佬交流讨论。

weixin_63758495的博客 2206

Python包模块与模块导入查找顺序

无论是为了看懂别人的代码,还是为了更好的组织我们的个人的工程代码,了解一下Python的模块和包都非常有必要。另外,知道搜索模块的顺序,也能帮助我们更好的理解一些常见的错误,方便我们快速定位问题。

trayvontang的博客 1432

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

模块简介,导入模块的句式,模块查找顺序

快来学习

lzq78998的博客 291

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范...

一.模块的简介   什么是模块:     模块就是一系列功能的结合体   模块的三种来源:     1.内置的     2.第三方的      3.自定义的   模块的四种表现形式:     1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)(***)    2.已被编译为共享库或DLL的C或C++扩展(了解)    3.把一...

weixin_30484739的博客 370

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python基础--模块的查找顺序以及相对导入和绝对导入

模块:模块是一系列功能的结合体     模块的来源:         内置的模块(python解释器自带的)         第三方(开发者编写的模块)         自定义的模块(自己编写的模块)     模块的四种表现形式:         1、使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)         2...

weixin_30896511的博客 144

Python 导入模块的3种方式

回到顶部 一、定义 模块就是用一堆的代码实现了一些功能的代码的集合,通常一个或者多个函数写在一个.py文件里,而如果有些功能实现起来很复杂,那么就需要创建n个.py文件,这n个.py文件的集合就是模块。如果不懂可以先看下面这篇博文: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318447437605e90206e261744c08630a836851f5183000 .

test_leader的博客 1万+

python--文件的循环导入及模块查找顺序

上一篇我们介绍了模块/文件的导入, 现在重点讲一下文件的导入.两个文件彼此导入彼此, 循环导入的时候极有可能出现某个名字还没有被创建就是用的情况导致报错, 所以以后写代码的时候要尽量避免出现循环导入的问题.如果确实需要循环导入就要确保双方使用的名字都必须'提前定义好' 出现错误的解决方法:1. 将导入模块的句式定义在名字的下面2. 浆倒入模块的句式写在函数体代码内.判断文件类型py文件可以被分为两种类型1. 执行文件2.被导入文件可以通过内置变量__name__的方法进行查看.当__name__所在的文件是

Yietong的博客 723

python的导入模块的方式及模块的搜索顺序

参考:https://www.runoob.com/python/python-modules.html 当你导入一个模块,Python 解析器对模块位置的搜索顺序是: 1、当前目录 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python...

weixin_43794311的博客 1001

python模块导入详解

目录 包和模块 模块导入 绝对导入 sys.modules sys.meta_path sys.path 相对导入 __init__.py相对导入 mian脚本中的相对导入 Reference 包和模块 我们可以在一个脚本中定义变量、函数和类,并添加逻辑,但是当某个项目具有复杂的逻辑时,我们希望把这些逻辑分解成不同的脚本,并以一定的合理的方式组织成层级结构,这种具有层级结构的包含脚本的文件夹就称为包。 模块通常指的是定义了变量、函数和类的脚本。但...

S_o_l_o_n的博客 8569

模块导入知识详细

模块导入知识详细1 > 循环导入问题2 > 判断文件类型3 > 模块的查找顺序3.1 > 验证先从内存空间查找3.2 > 验证再从内置模块中查找3.3 > 验证sys.path(类似于环境变量)4 > 绝对导入与相对导入4.1 > 绝对导入4.2 > 相对导入5 > 包5.1 > 包的导入6 > 编程思想演变7 > 软件开发目录规范 1 > 循环导入问题   当两个文件彼此导入彼此的情况出现时,极有可能出现某个名字还没被创建

weixin_64178950的博客 1391

模块导入、循环导入、模块查找顺序、相对导入及绝对导入

模块导入 什么是模块   模块:就是一系列功能的结合体     模块的三种来源:       1.内置的(python解释器自带)       2.第三方的(别人写的)       3.自定义的(自己写的)     模块的四种表现形式       1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)       2.已被编译为...

weixin_30491641的博客 161

Python笔记,模块与包,模块的导入,制作模块与包,相对导入以及模块查找

模块与包模块与包的含义模块导入操作制作包与模块相对导入模块的查找 模块与包的含义 一,什么是模块 1.模块就是python文件,里面定义了很多函数,类,变量, 一个完整大型的python程序是由模块和包的形式组成起来, 可见模块在Python中的重要性 二,模块有什么作用 1.在Python交互式解释器中操作输入的代码, 在Python中是不会被保存的,而模块文件中的代码是永久保存的 2.减少重复代码,减少工作量(写的量,改的量)代码更优雅,拿来主义 Python的模块

weixin_49750432的博客 5148

迭代取值与索引取值的优缺点、模块的简介、导入模块的两种方式、循环导入问题、模块查找顺序

掌握迭代取值与索引取值的优缺点,了解导入模块的import方式和from...import...句式,熟悉查找模块的顺序

m0_56371364的博客 151
上一篇: 函数进阶——yield关键字及生成器
下一篇: 模块基础——相对导入、绝对导入及软件开发目录规范
Jakey_src
博客等级 码龄9年 10粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值