大模型学习-python基础Day9
一.模块与包
模块是包含Python代码的文件,通常以.py为扩展名。模块可以包含函数、类、变量或可执行代码,用于将相关功能组织在一起,便于代码复用和维护。
模块的作用
- 代码复用:将常用功能封装为模块,避免重复编写相同代码。
- 命名空间管理:通过模块划分作用域,避免命名冲突。
- 项目结构化:通过模块化设计提升项目的可读性和可维护性。
模块的分类
- 内置模块:Python标准库提供的模块(如
math、os)。 - 第三方模块:通过包管理工具(如
pip)安装的模块(如numpy)。 - 自定义模块:用户自行编写的模块文件。
1.创建模块
在 Python 中,模块是一个包含 Python 代码的 .py 文件。创建一个新文件,命名为 mymodule.py,并在其中编写函数或变量。
# mymodule.py
def greet(name):
return f"Hello, {name}!"
PI = 3.14159
2.导入模块
全局导入
在其他 Python 文件中,使用 import 语句导入模块并调用其功能
import 模块名 [as 别名]
访问:模块名.成员名
import mymodule
print(mymodule.greet("Alice"))
print(mymodule.PI)
局部导入
from 模块名 import 成员名1[as 别名], 成员名2[as 别名]
访问:直接通过成员名的方式访问
说明:指定导入模块的部分成员,只能使用其导入的成员,未导入的成员不能使用;如果多个模块中存在重名成员,后一次导入会覆盖前一次导入。
from mymodule import greet, PI
print(greet("Bob"))
print(PI)
from 模块名 import *
导入模块中所有不以单下划线开头的成员,直接通过成员名的方式访问
通过成员名方式直接访问
模块搜索顺序
当导入一个模块时的搜索顺序:
当前目录->PYTHONPATH环境变量中的目录->包含python模块以及这些模块所以来的任何extension module的目录
可以使用以下方式查看模块搜索顺序
import sys
print(sys.path)
也可以通过sys.path.append(路径)向sys.path中临时添加路径
Python 的 sys.path 是一个列表,存储了模块的搜索路径。通过 sys.path.append() 可以向其中临时添加自定义路径,使得 Python 解释器能够找到该路径下的模块。
import sys
sys.path.append('/path/to/your/module')
添加后,可以直接导入该路径下的模块:
import your_module
注意事项
- 临时性:通过
sys.path.append()添加的路径仅在当前运行时生效,程序退出后不会保留。 - 路径格式:需使用绝对路径或正确相对路径,确保路径存在且可访问。
- 避免重复添加:多次添加同一路径会导致
sys.path冗余,建议先检查路径是否存在:
__all__
在Python模块中,__all__是一个特殊的列表变量,用于定义模块的公共接口。当使用from module import *时,只有__all__中列出的名称会被导入。若未定义__all__,则默认导入所有不以下划线开头的全局名称。
#my_add.py中向__all__添加部分元素
__all__ = ["num","add"] #内容必须要用引号引起来
num = 100
num1 = 200
_str1 = "abc"
def add(a,b):
return a + b
在main.py中使用from my_add import *导入模块中的内容,没在__all__中的变量在使用时会报错
from my_add import *
print(_str1) #会报错,不可以使用.如果all里面声明了就可以访问
print(num) #100
__name__属性
使用__name__ = "__main__"避免测试代码被执行
注意:
当一个python文件被直接运行时,该文件的__name__属性值为"__main__"
当一个python文件作为模块被导入,__name__属性会被设置为该模块的名称
如果在导入其他模块时候,不需要被导入模块的测试代码被执行,那么可以在被导入模块中作出以下分支判断:
if __name__ = "__main__"
执行测试语句
#my_add.py中向__all__添加部分元素
__all__ = ["num","add"] #内容必须要用引号引起来
num = 100
num1 = 200
_str1 = "abc"
def add(a,b):
return a + b
#测试语句
if __name__ = "__main__"
print(add(1,2))
#此时是main.py
import my_add
"""
导入操作会自动打印my_add.py的最后一个打印语句,输出3
但是我们不想让他执行这个用于测试的语句
我们应该在my_add中使用__name__用来避免这个问题
使用__name__ = "__main__"避免测试代码被执行
"""
3.dir()
dir()是一个内置函数,主要用于列出对象的属性和方法,或者列出当前作用域中定义的名称,并以一个字符串列表的形式返回
当你将一个模块作为dir()的参数时,它返回该模块中定义的名称列表,包括函数、类、变量等等
import math
#查看math模块下的
print(dir(math))
当你将一个对象作为dir()的参数时,他会返回该对象的属性和方法列表
class Example:
def __init__(self):
self.data = 42
def method(self):
pass
obj = Example()
print(dir(obj)) # 输出包含 'data', 'method', '__class__', '__str__' 等
4.包概述
包是管理python模块命名空间的形式
通过使用.模块名来构造python模块命名空间的一种方式。例如,模块名A.B表示名为A的包中包为B的子模块。通常我们将多个有联系的模块放入一个包中,包和文件夹相似,不过该文件夹下必须有一个__init__.py文件
sound/ #最高层级的包
__init__.py #初始化sound包
formats/ #用于文件格式转换的包
__init__.py
auwrite.py
aiffread.py
effects/ #用于音效的包
__init__.py
echo.py
surround.py
5.创建包
__init__.py可以只是一个空文件,也可以执行包的初始化或设置__all__变量。
创建一个graphic文件夹,并且在其中创建circle.py、rectangle.py文件。其中__init__.py文件暂时为空。circle.py和rectangle.py文件写入代码
右键点击项目根目录或目标父目录,选择“New” → “Directory”,输入名称“graphic”并确认。
在“graphic”文件夹上右键,选择“New” → “Python File”,分别输入文件名“circle.py”和“rectangle.py”。创建空文件__init__.py的方式相同,输入文件名时需包含扩展名。
最终目录结构应如下所示:
project_root/
graphic/
__init__.py
circle.py
rectangle.py
main.py
6.导入包
全局导入import
导入包中模块的所有成员
语法:
import 包名.模块名 [as 别名]
调用方式:包名.模块名.成员名
import graphic.circle
print(graphic.circle.area(10)) #314.15926
注意⚠️:
使用import时,除最后一项外都必须是包。最后一项可以是模块或者包,但不能是类、函数或者变量。
如果最后一项是包,那么必须在被导入包的__init__.py文件中,指定导入包中的哪些模块。这是python导包的一个优化机制,避免导入过多的模块,并且在__init__.py中指定导入模块的时候,建议使用相对路径(from . import circle)。如果是绝对路径,那么他会把导入的模块circle作为顶级模块,直接从sys.path找circle模块,而不是找graphic.circle(import circle)
#__init_.py限制包中的哪些模块可以被导入
#from 包名 import 模块
from . import circle
#main.py
import graphic
print(graphic.circle.PI) #此时可以输出
局部导入包下的模块from import
语法: from 包名 import 模块名 [as 别名]
说明:导入包中的某一模块的所有成员
访问:模块名.成员名
from graphic import circle
print(circle.area(10)) #314.159
局部导入包下模块的成员 from import
从包中模块导入功能
语法:from 包名.模块名 import 成员名 [as 别名]
调用方式:成员名
from graphic.circle import area
print(area(10))
局部导入from import*从包中导入模块
当我们使用from import*时,python并不会查找并导入包的所有子模块。唯一解决的方法是提供包的显式索引。如果包的__init__.py中定义了__all__,运行from import*时,他就是被导入的模块名
语法:from 包名 import *
导入包中的某一个模块中不以下划线开始的成员
调用方式:模块名.成员名
在__init__.py下添加如下内容:
__all__ = ["circle"]
注意:如果不加会无法导包
在main.py中使用 from 包名 import *
python的标准库(包)
以下是一些常用的Python标准库及其功能的总结表格:
| 模块名 | 功能描述 |
|---|---|
os |
提供与操作系统交互的功能,如文件操作、目录管理等 |
sys |
提供与Python解释器交互的功能,如命令行参数、退出程序等 |
math |
提供数学运算功能,如三角函数、对数、幂运算等 |
datetime |
提供日期和时间处理功能,如日期计算、格式化等 |
json |
提供JSON数据的编码和解码功能 |
re |
提供正则表达式功能,用于字符串匹配和处理 |
random |
提供生成随机数的功能 |
collections |
提供额外的数据结构,如defaultdict、Counter、namedtuple等 |
itertools |
提供高效的迭代器工具,如排列组合、无限迭代器等 |
functools |
提供高阶函数工具,如reduce、partial等 |
argparse |
提供命令行参数解析功能 |
logging |
提供日志记录功能 |
subprocess |
提供启动和管理子进程的功能 |
multiprocessing |
提供多进程支持 |
threading |
提供多线程支持 |
socket |
提供网络通信功能,支持TCP/UDP协议 |
urllib |
提供URL处理功能,如发送HTTP请求、解析URL等 |
csv |
提供CSV文件读写功能 |
pickle |
提供对象序列化和反序列化功能 |
hashlib |
提供哈希算法功能,如MD5、SHA1等 |
zipfile |
提供ZIP文件压缩和解压功能 |
sqlite3 |
提供SQLite数据库操作功能 |
unittest |
提供单元测试框架 |
time |
提供时间相关功能,如休眠、获取时间戳等 |
glob |
提供文件名模式匹配功能 |
shutil |
提供高级文件操作功能,如复制、移动、删除等 |
tempfile |
提供临时文件和目录管理功能 |
这些标准库覆盖了Python开发中的常见需求,包括文件操作、数据处理、网络通信、并发编程等。
7.引入第三方库
当使用python中没有内置的库时,可以通过以下方式安装第三方库
pip命令方式
pip是python包管理工具,该工具提供了对python包的查找、下载、安装、卸载的功能。pip默认的源是python package index,其地址为https://pypi.org/simple/,如果下载比较慢还可以指定其他源
pip常用命令
查看我们已经安装的软件包:pip list
安装软件包,具体包名可以到pypi上查找:pip install 包名
卸载软件包:pip uninstall 包名
临时使用其他源:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
8.打包自己的库并安装
先安装setuptools库
使用命令:pip install setuptools
在包外创建一个setup.py文件

setup.py中添加如下内容:

在setup.py同级目录下进行构建

也可以生成压缩包
python setup.py sdist
pip命令安装自己打的库
pip install path_to_your_package/distribution/your_package_name-0.1.tar.gz(自己的库的地址)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)