10、python——模块与包

1、模块的导入

1.1、什么是模块

模块就是 Python文件 ,里面定义了很多的函数、类、变量 。一个完整大型的python程序是由 模块和包 的形式组织起来的,可见模块在python中的重要性。

1.2、模块有什么作用

在python交互式解释器中操作输入的代码,在退出python时是不会被保存的; 而模块文件中的代码是 永久存在 的。减少重复代码, 减少工作量(写的量、改的量)、代码更优雅、拿来主义

1.3、模块的分类

(1)、标准模块,无需安装和编写,自动导入就有的模块,比如说random,math

(2)、第三方模块,别人写到的发布到平台上的模块,需要安装的模块,比如,requests,需要pip安装的

(3)、自定义模块,自己写的模块

1.4、什么是包

Python包实际上是一个目录,包含python的目录

1.4.1、py3和py2在包结构里的区别(__init__.py)

包结构的目录里有一个_int_.py的模块。这是一个初始化文件,一般导入当前包里的内容,都会执行__init__.py文件,用于初始化数据库连接

py2,_int_.py是必须的;py3,_int_.py是可选的,例如:

这里,py2只会识别pack02是一个包,而py3会识别pack01和pack02为包

1.4.2、模块和包名要尽量和内置的模块名不相同, 不然会覆盖内置的模块

若是有一样的模块名了,且不能够修改,我们可以使用别名来区分并且调用这些模块

1.5、import与from import 导入

导入标准库和导入自定义库是有一些区别的

1.5.1、直接导入模块

import string

print(string.ascii_uppercase)

# 执行结果:ABCDEFGHIJKLMNOPQRSTUVWXYZ

1.5.2、从包或者模块里导入函数

# 从string里单独导入具体的遍变量或者函数,导入之后可以不用"string."调用这个函数或者类
from string import ascii_uppercase

print(ascii_uppercase)

# 执行结果:ABCDEFGHIJKLMNOPQRSTUVWXYZ

导入所有函数(模糊导入)

from string import *

print(ascii_lowercase)

# 执行结果:abcdefghijklmnopqrstuvwxyz

1.5.3、导入自定义模块,并且访问

 目录结构展示:

10、python——模块与包_第1张图片

包展示:

# pack01/one.py
print("this is pack01 one")


def packtest():
    print("pack01 test func")


# pack02/one.py
print("this is pack02 one")


def packtest():
    print("pack02 test func")
# two.py
print("i am subpk01 two model")
# three.py
print("i am subpk02 three model")

分割线

# 这个代码是在mod.py这个主程序或者说程序入口执行的(top_level)
import pack01   # ×  这个只是导入了包
pack01.one.packtest()  # 执行之后会报错

 [错误做法]

10、python——模块与包_第2张图片

导入自定义模块时,光导入包是无法识别的,必须要导入到模块这层才能够被识别。

[正确做法]

# 当这样导入的时候,这种导入叫做直接导入
# 就是直接运行了E:\python\Python\python.exe F:/Desktop/Pycharm练习/模块与包/模块导入/mod.py
from pack01 import one

# 执行结果:this is pack01 one
# 另外,这是虽然只导入了one,但是其实整个pack01都运行了

1.6、模块运行方式

模块运行方式有两种方式:直接解释器运行(直接运行的为主程序/程序入口)和导入运行(只要导入了模块(无论整体或者部分),那么这个整个模块都会运行)

1.6.1、可以重复导入,但只会执行一次

第一次导入的时候,就会将这个模块加载到内存空间,下次导入的时候,会先查看内存空间有没有

# 从pack01包中导入了one这个模块
from pack01 import one
from pack01 import one

# 执行结果
this is pack01 one

1.6.2、如果导入的模块名相同会发生什么

# 如果导入的模块明相同,就使用后导入的模块
from pack01.one import packtest
from pack02.one import packtest
packtest()
# 执行结果:
this is pack01 one
this is pack02 one
pack02 test func

解决办法:给模块取别名---as

1.6.3、给模块取别名

# 从pack02.one模块中导入packtest函数,取别名叫做pk02
from pack02.one import packtest as pk02
pk02()
# 执行结果
pack02 test func

1.6.4、动态导入

接受字符串,动态导入。需要使用"importlib"模块

import importlib
st = importlib.import_module('string')
print(st.digits)
# 执行结果:
0123456789

[动态导入脚本]

# 要求:接受用户从键盘的输入,按q退出,用户输入什么模块就导入什么模块,并提示导入成功
import importlib

while True:
    try:   # 执行要尝试(try)的代码
        module_name = input("请输入你要导入的模块:")
        if module_name.lower() == "q":
            print("模块导入结束")
            break
        st = importlib.import_module(module_name)
        print("导入成功!")
    except:  # 执行应对异常发生时的代码
        print("\033[31m没有这个模块!\033[0m")

[执行结果查看]

10、python——模块与包_第3张图片

1.6.5、相对导入和绝对导入

以". "开头的导入路径称为相对导入

. 表示当前

.. 表示上一级

... 表示上上级

相对导入不能访问到top-level那一层,只能访问到top-level以下层

在top-level以下层推荐使用相对导入,否则程序入口改变绝对路径就会改变

绝对导入路径 就是从top-level那一层开始,一层一层往下数

10、python——模块与包_第4张图片

 简单来说,若是以mod.py作为程序入口,那么它和它平级的pack01和pack02都是top-level

你可能感兴趣的:(python,模块与包)