首页 > 编程语言 >Python高级之模块与包

Python高级之模块与包

时间:2024-05-09 15:24:17浏览次数:31  
标签:name Python py 高级 导入 m1 模块 import

【一】模块介绍

【1】什么是模块

  • 在Python中,一个py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能
  • 使用模块既保证了代码的重用性,又增强了程序的结构性和可维护性
  • 另外除了自定义模块外,我们还可以导入使用内置或第三方模块提供的现成功能

【2】模块的优点

  • 极大地提高了程序员的开发效率。

【3】模块的来源

  • 内置的:python解释器自带的,直接拿来使用的
  • 第三方的:别人写的,如果想用,就要先下载在使用
  • 自定义的:我们自己写的

【4】模块的存在形式

  • 我们自己写的py文件(一个py文件就是一个模块)
  • 包:一系列py文件的集合(文件夹)
  • 一个包里面会有一个__init__.py文件

【二】模块的使用

【1】准备

  • 新建文件foo.py
name = "ligo"


# 定义一个函数 函数的功能是打印name
def show_name():
    print(name)


# 定义一个函数修改name
def change_name():
    global name
    name = 'scott'
    print(name)


# 内嵌函数
def outer():
    def inner():
        print(f"这是 outer 内部 的 inner")
    return inner()

【2】直接导入

#import语句
import py文件名/模块名

(1)import导入模块会发生哪些事

  • 要想在另外一个 py 文件中引用foo.py中的功能
  • 需要使用 import foo
  • 首次导入模块会做三件事:
    • 执行源文件代码
    • 产生一个新的名称空间用于存放源文件执行过程中产生的名字
    • 在当前执行文件所在的名称空间中得到一个名字 foo,该名字指向新创建的模块名称空间
    • 若要引用模块名称空间中的名字,需要加上该前缀
import foo

#打印当前模块对象位置
print(foo)  # <module 'foo' from'D:\\Python\\pythonProject\\pythonProject1\\bao\\foo.py'>
#打印模块中的name值
print(foo.name) # ligo
#调用修改全局变量name的函数,修改name的值
foo.change_name()  # scott
#打印修改后的那么值
print(foo.name)  # scott
#调用内嵌函数
func = foo.outer()
func()  # 这是 outer 内部 的 inner

(2)import导入模块方式

#单独导入多个模块
import foo1
import foo2
import foo2

#一次性导入多个模块
import foo1,foo2,fool3
  • 不同类别的导入顺序如下:
  • python内置模块
  • 第三方模块
  • 程序员自定义模块
  • 我们也可以在函数内导入模块,在文件开头导入模块属于全局作用域,在函数内导入的模块属于局部作用域

【3】详细导入

(1)语法

  • from ... import ... 语句
from 模块位置 import 模块名
  • 与import语句类似,不同的是在import中,引用模块中的名字时需要在名字前面加上foo.作为前缀,而from...import...语句可以直接引用模块中的名字
from foo import show_name,change_name,outer

show_name()
change_name()
outer()

#也可以指定想要的模块中的方法和参数
from foo import change_name

change_name()

(2)导入所有

#rom语句支持from foo import *语法, * 代表将foo中所有的名字都导入到当前位置
from foo import *

show_name()
change_name()
outer()

【4】重命名模块

  • from ... import ... as ... 语句
from 模块位置 import 模块名 as 自定义名字
  • 给导入的模块起一个别名
#为导入的模块foo在当前位置起别名f,以后再使用时就用这个别名f
import foo as foo_old 

foo_old.show_name()
foo_old.change_name()
foo_old.outer()

#还可以为导入的一个名字起别名
from foo import show_name as get_name
get_name()

【三】循环导入问题

  • 循环导入问题指的是在一个模块加载/导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字
  • 由于第一个模块尚未加载完毕,所以引用失败、抛出异常

【1】循环导入问题的问题所在

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

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

y='m2'
  • main.py
import m1

[1]问题一

  • 执行mian.py会抛出异常
#正在导入m1
#正在导入m2

#ImportError: cannot import name 'x'
  • 分析
    • 先执行main.py--->执行import a
    • 开始导入m1并运行其内部代码--->打印内容"正在导入m1"
    • --->执行from m2 import y 开始导入m2并运行其内部代码--->打印内容“正在导入m2”
    • --->执行from m1 import x,由于m1已经被导入过了,所以不会重新导入,所以直接去m1中拿x
    • 然而x此时并没有存在于m1中,所以报错

[2]问题二

  • 执行文件不等于导入文件,比如执行m1.py不等于导入了m
#直接执行m1.py抛出异常
#正在导入m1
#正在导入m2
#正在导入m1

#ImportError: cannot import name 'y'
  • 分析
    • 执行m1.py,打印“正在导入m1”,
    • 执行from m2 import y
      • 导入m2进而执行m2.py内部代码
      • --->打印"正在导入m2"
    • 执行from m1 import x
      • 此时m1是第一次被导入
      • 执行m1.py并不等于导入了m1
    • 于是开始导入m1并执行其内部代码
      • --->打印"正在导入m1"
    • 执行from m1 import y
      • 由于m1已经被导入过了
      • 所以无需继续导入而直接问m2要y
      • 然而y此时并没有存在于m2中所以报错

【2】问题的解决办法

[1]方法一

  • 导入语句放到最后,保证在导入时,所有名字都已经加载过
  • m1.py
print('正在导入m1')
x='m1'
from m2 import y
  • m2.py
print('正在导入m2')
y='m2'
from m1 import x
  • main.py
import m1
print(m1.x)
print(m1.y)

[2]方法二

  • 导入语句放到函数中,只有在调用函数时才会执行其内部代码
  • m1.py
print('正在导入m1')

def f1():
    from m2 import y
    print(x,y)

x = 'm1'
  • m2.py
print('正在导入m2')

def f2():
    from m1 import x
    print(x,y)

y = 'm2'
  • main.py
import m1

m1.f1()

【四】搜索模块的路径与优先级

【1】模块的分类

  • 模块其实分为四个通用类别,分别是:
    • 1、使用纯Python代码编写的py文件
    • 2、包含一系列模块的包
    • 3、使用C编写并链接到Python解释器中的内置模块
    • 4、使用C或C++编译的扩展模块
  • 加载顺序:使用C或C++编译的扩展模块 --> 使用C编写并链接到Python解释器中的内置模块 --> 包含一系列模块的包 --> 使用纯Python代码编写的py文件
  • 在导入一个模块时
    • 如果该模块已加载到内存中,则直接引用
    • 否则会优先查找内置模块
      • 然后按照从左到右的顺序依次检索 sys.path中定义的路径
    • 直到找到模块对应的文件为止
      • 否则抛出异常

【2】查看模块的搜索路径

#sys.path也被称为模块的搜索路径,它是一个列表类型
import sys

print(sys.path)
#['D:\\Python\\pythonProject\\pythonProject1',
# 'D:\\Python\\pythonProject\\pythonProject1',
# 'D:\\PyCharm 2023.3.5\\plugins\\python\\helpers\\pycharm_display',
# 'D:\\python310.zip',
# 'D:\\DLLs',
# 'D:\\lib',
# 'D:\\PyCharm 2023.3.5\\plugins\\python\\helpers\\pycharm_matplotlib_backend']

#sys.path中的第一个路径通常为空,代表执行文件所在的路径,所以在被导入模块与执行文件在同一目录下时肯定是可以正常导入的

#针对被导入的模块与执行文件在不同路径下的情况
#为了确保模块对应的源文件仍可以被找到,需要将源文件 foo.py 所在的路径添加到 sys.path 中
#假设 foo.py 所在的路径为 /python/pythonProject/
import sys

# 也可以使用sys.path.insert(……)
sys.path.append(r'/python/pythonProject/') 

# 无论foo.py在何处,我们都可以导入它了
import foo 

【五】模块小结

【1】什么是模块

  • 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀

  • import加载的模块分为四个通用类别:

    • 使用python编写的代码(.py文件)

    • 已被编译为共享库或DLL的C或C++扩展

    • 包好一组模块的包

    • 使用C编写并链接到python解释器的内置模块

【2】模块的介绍与使用(见上文)

【3】模块的优点

  • 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失
    • 因此我们通常将程序写到文件中以便永久保存下来
    • 需要时就通过python test.py方式去执行
    • 此时test.py被称为脚本script。
  • 随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。
    • 这时我们不仅仅可以把这些文件当做脚本去执行
    • 还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

【六】包

【1】什么是包

  • 包是一个模块的集合,能把多个模块的功能组合到一起,然后按照其功能和作用进行分类,利于用户的使用,包可以通过import语句来引入和使用
  • Python的包分为标准库包和第三方库包:
    • 标准库包是Python内置的包,包含了一些基本的模块和函数,如os、sys、random等
    • 第三方库包是第三方开发的包,通常提供了更加丰富和高级的功能

【2】创建包

  • 创建一个文件夹,这个文件夹的路径下必须要有一个名为__init__.py的文件,这个文件夹就是包
  • 包是Python程序中用于组织模块的一种方式
  • 在pycharm文件中新建Python软件包会自动创建 init.py 文件

【3】使用包

(1)语法

#【1】直接使用包
import 包名.包名.模块名

#【2】详细使用包
from 包名.模块名 import 模块中的方法

(2)使用

  • add.py
def add(a, b):
    print("这里是加法!")
    return int(a) + int(b)
  • reduce.py
def reduce(a, b):
    print("这里是减法!")
    return int(a) - int(b)
  • main.py
#【1】直接使用包
import add
import reduce

print(add.add(6,4))
print(reduce.reduce(6,4))
# 这里是加法!
# 10
# 这里是减法!
# 2

#【2】详细使用包
from bao import add
from bao import reduce

print(add.add(6, 4))
print(reduce.reduce(6, 4))
# 这里是加法!
# 10
# 这里是减法!
# 2

【4】制作包

(1)注册包

  • 在包下的__init__.py中注册相关变量
  • __init__.py
# 注意这里要用相对路径
# 从 add.py和reduce.py 中将需要导出的方法导入到这里
from .add import add
from .reduce import reduce

(2)使用包

# 将注册在 __init__.py 中的方法导入过来
from bao import add
from bao import reduce

# 使用包的模块的方法
print(add(6, 4))  # 这里的add是方法名
print(reduce(6, 4))   # 这里的reduce是方法名
# 这里是加法!
# 10
# 这里是减法!
# 2

【七】绝对路径和相对路径

【1】相对路径

  • 相对路径是相对于当前工作目录或当前脚本文件所在目录的路径
# 加入文件所在路径是D:\Python\pythonProject\pythonProject1\01.text,那么相对路径就是:
path = '01.text'
path = './01.text' # ./表示当前同级目录下
path = '../01.text' # ../表示当前目录的上一级目录

#示例
with open(file='01.text',mode='r',encoding='utf8') as fp:
    res = fp.read()
    print(res)

【2】绝对路径

  • 绝对路径是文件或目录在文件系统中的完整路径,不依赖于当前工作目录
#使用时要使用文件的完整路径
path = 'D:\Python\pythonProject\pythonProject1\01.text'


#示例
with open(file='D:\Python\pythonProject\pythonProject1\01.text',mode='r',encoding='utf8') as fp:
    res = fp.read()
    print(res)

标签:name,Python,py,高级,导入,m1,模块,import
From: https://www.cnblogs.com/ligo6/p/18180001

相关文章

  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-45-鼠标操作-下篇
    1.简介鼠标为我们使用电脑提供了很多方便,我们看到的东西就可以将鼠标移动过去进行点击就可以打开或者访问内容,当页面内容过长时,我们也可以使用鼠标滚轮来实现对整个页面内容的查看,其实playwright也有鼠标操作的方法。上一篇文章中已经讲解过鼠标的部分操作了,今天宏哥在这里将剩下......
  • Python高级之函数参数进阶Optional
    【一】引言在Python3.5版本后引入的typing模块为Python的静态类型注解提供了支持。这个模块在增强代码可读性和维护性方面提供了帮助。本文将深入探讨typing模块,介绍其基本概念、常用类型注解以及使用示例,以帮助读者更全面地了解和应用静态类型注解。【二】基本类型注解【......
  • Python高级之名称空间和作用域
    【一】名称空间【1】什么是名称空间名称空间就是存放函数名与函数值对应关系的地方内存空间就是申请一块内存空间,然后将函数值放到内存空间里再将变量名和变量值绑定存到名称空间里程序执行期间最多会存在三种名称空间【2】内置名称空间会跟着python解释器的启动而生成,......
  • Python高级之匿名函数
    【一】匿名函数的定义在Python里有两类函数:用def关键词定义的正规函数用lambda关键词定义的匿名函数lambda参数:表达式lambda:定义匿名函数的关键词。函数参数它们可以是位置参数、默认参数、关键字参数表达式,输入函数参数,输出一些值,表达式本身结果就是返回......
  • Python高级之函数对象与闭包函数
    【一】函数对象函数对象是指函数可以被当成数据来处理,python中一切皆为对象【1】函数可以被引用defadd(a,b):returna+bres=add(3,4)print(res)#7【2】函数作为容器类型的元素defadd(a,b):returna+bnum_list=[add,1]res=num_list[0......
  • Python高级之函数的参数
    【一】形参和实参函数的参数分为形参和实参,形参就是定义在函数名后面括号里的参数(用来接收外部传来的值),实参就是调用函数时,括号里传进去的值(值可以是常量、变量、表达式)defadd(x,y):returnx+y#实参是常量print(add(3,4))#输出7#实参是变量x=3y=4prin......
  • Python高级之函数
    【一】函数的基本使用我们在前面的学习中,所有的功能代码都集中在一块,需要使用同一功能时,需重复编写该功能的代码,这样比较麻烦,当我们到后面代码变得越来越长,也不利于我们修改其中一个小功能的代码我们完全可以从现实生活中找到简化程序设计的方案:比如一个修理工会事先准备好螺......
  • BOSHIDA AC/DC电源模块在通信与网络设备中的应用研究
    BOSHIDAAC/DC电源模块在通信与网络设备中的应用研究随着通信与网络技术的不断发展,通信与网络设备的使用不断增加。电源作为通信与网络设备的重要组成部分之一,在其稳定工作中起到至关重要的作用。AC/DC电源模块作为一种常用的电源转换器,广泛应用于通信与网络设备中。 一,AC/DC......
  • xlwings:在Excel中集成Python
    Github地址:https://github.com/xlwings/xlwings在现代数据分析和报表生成中,MicrosoftExcel仍然是一款非常流行和强大的工具。与此同时,Python作为一种高级编程语言,具备出色的数据处理和分析能力。那么,有没有一种方法可以将Excel和Python完美结合,以发挥它们各自的优势?答案是肯定的......
  • pybuilder:Python项目构建、测试、文档、发布
    Github地址:https://github.com/pybuilder/pybuilder在Python项目开发中,良好的构建和自动化流程是非常重要的。PyBuilder是一个用于构建Python项目的工具,它提供了简单易用的方式来定义和管理项目的构建过程,包括依赖管理、测试、代码质量检查等。本文将深入探讨PyBuilder库的使用......