21
一个 Python 文件就是一个模块,这个模块可以由其他文件导入,并在其他 Python 文件中使用。
创建一个 list_prcess.py 文件,内容如下
def page_num(page_size, total):
return total // page_size + int(total % page_size > 0)
def offset(page_size, page):
return page_size * (page - 1)
def coords_id(loc):
return f"{round(loc[0], 6)}-{round(loc[1], 6)}"不仅可以放函数,也可以放类。 通过这种方式拆分代码,可以更好地组织代码。
在其他文件中,通过下面的语句导入这个模块。有几种导入方式
import list_process # 使用时用包名做前缀
import list_process as lp # 使用时以 lp 别名做前缀
from list_process import * # 导入所有函数,直接使用函数名
from list_process import page_num # 只能使用导入的函数,不能使用其他的区别只在于函数调用地方式上
__name__模块化带来的一个问题
导入模块时,该模块的所有代码都会被执行。 所以通常模块中只声明函数和类,不会调用函数和类。 这有时候会造成一定的问题:如果我们既想将函数作为模块提供给其他代码,又想直接使用 python 执行这个文件,并调用函数呢?
可以通过变量 __name__ 来区分该模块执行的方式。如果 __name__ == "__main__",那么表示现在是直接使用 python 去执行,而不是作为模块导入。
一组具有一定文件结构模块构成了一个包。
绝大多数情况下我们都是使用 Python 提供的包。 内置包有很多,比较常用的有
csv json yaml toml pickle 等读写文件的包os sys pathlib 等与系统交互的包datetime time 操作日期时间的包math 进行数学运算logging 输出日志dataclasses 数据类re 正则表达式Python 的强大之处就在于有浩如烟海的第三方包,例如
numpy pandas geopandas 等做矩阵运算和数据处理urllib requests 等发送网络请求、处理数据的包tqdm 显示进度条可以在 https://pypi.org/ 网站上搜索包。
每个 Python 包和模块可能都需要使用一些其他的包,这些其他的包就被称为当前包的“依赖项”。 根据约定,requirements.txt 文件列出了包的依赖项及其版本号。
django==3.2.12
psycopg2>=2.9.3
Pillow>=9.0.1
sorl-thumbnail>=12.8.0
提示
版本号也可以不指定。但通常要指定,避免版本不同的包提供的函数和类不同,导致当前包无法工作。
由于每个包都可能有很多依赖项,一个一个手动安装显然是不现实的。 pip 命令行程序是 Python 的包管理器,用来自动处理和安装包及其依赖项。 但 pip 不是 Python 代码,因此不能在 Python 代码中使用,只能在终端命令行中使用。
但在 Windows 上,有些包的安装可能会遇到问题。还有一些其他的包管理器可以使用,比如 Anaconda 、 Mamba 等。
文件和文件系统