十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python编程教程(十二)

Python编程教程(十二) 第 12 章模块与包本章摘要本章介绍 Python 的模块与包机制。你将了解模块的概念、三种导入方式import、from...import、起别名并通过实战编写一个随机密码生成器随后学习如何创建自己的模块最后掌握用pip安装和使用第三方库的方法。12.1 什么是模块模块就是一个.py文件里面包含了一些函数和变量。你可以把模块理解为工具箱——需要哪个工具就导入哪个模块。Python 自带了大量的标准库模块比如处理时间的time、生成随机数的random、数学计算的math等同时你也可以自己写模块。12.2 导入模块使用import语句来导入模块# 方式一导入整个模块importmathprint(math.pi)# 3.141592653589793print(math.sqrt(16))# 4.0平方根print(math.ceil(3.2))# 4向上取整print(math.floor(3.8))# 3向下取整print(---)# 方式二只导入需要的部分frommathimportpi,sqrtprint(pi)# 3.141592653589793不用写 math.pi 了print(sqrt(25))# 5.0print(---)# 方式三起别名importrandomasrprint(r.randint(1,10))# 随机 1-10 之间的整数print(r.choice([石头,剪刀,布]))# 随机选一个输出3.141592653589793 4.0 4 3 --- 3.141592653589793 5.0 --- 5 剪刀三种导入方式各有特点下面用表格对比一下导入方式语法格式调用方式适用场景注意事项导入整个模块import mathmath.pi、math.sqrt(16)需要用到模块中多个成员时每次调用都要写模块名前缀代码稍显冗长导入指定成员from math import pi, sqrt直接写pi、sqrt(25)只需使用模块中少数几个成员时容易与当前文件中的同名变量或函数冲突导入并起别名import random as rr.randint(1, 10)模块名较长或与变量名冲突时别名要简短且语义清晰避免过度缩写影响可读性12.3 实战随机密码生成器importrandomimportstringdefgenerate_password(length8):生成随机密码# string.ascii_letters 包含所有大小写字母# string.digits 包含所有数字 0-9charactersstring.ascii_lettersstring.digits passwordforiinrange(length):passwordrandom.choice(characters)returnpassword# 生成不同长度的密码print(6 位密码generate_password(6))print(8 位密码generate_password(8))print(12 位密码generate_password(12))print(默认长度generate_password())每次运行这段代码都会生成不同的随机密码12.4 创建自己的模块你完全可以创建自己的模块。假设你创建了一个文件my_utils.py# my_utils.pydefsay_hello(name):returnfHello,{name}!defadd(a,b):returnab PI3.14159然后在另一个文件中导入并使用它# main.py和 my_utils.py 在同一个文件夹中importmy_utilsprint(my_utils.say_hello(小明))print(my_utils.add(3,5))print(my_utils.PI)模块搜索路径当 Python 执行import my_utils时它会按照sys.path中记录的路径列表依次查找my_utils.py文件。sys.path是一个包含字符串路径的列表通常包括当前脚本所在目录、标准库目录以及环境变量PYTHONPATH中指定的目录。如果模块不在这些默认路径中导入就会失败。此时可以用sys.path.append()手动把模块所在的目录添加进去# main.pymy_utils.py 在上级目录的 utils 文件夹中importsys# 把上级目录下的 utils 文件夹加入搜索路径sys.path.append(../utils)importmy_utilsprint(my_utils.say_hello(小明))print(my_utils.add(3,5))print(my_utils.PI)这样即使模块不在当前目录也能顺利导入。不过要注意sys.path.append()只在当前程序运行期间生效下次运行需要重新添加。输出Hello, 小明! 8 3.14159这就是模块化编程——把代码拆分成多个文件每个文件负责一部分功能让项目更有条理。12.4.1 什么是包当项目越来越大、模块越来越多时把所有.py文件堆在一个文件夹里会显得很乱。这时可以用**包package**来组织代码。包就是一个包含__init__.py文件的文件夹用来存放多个相关的模块。__init__.py可以是空文件它的存在告诉 Python「这个文件夹是一个包」。有了包你就可以把功能相近的模块归类到一起让项目结构更清晰。下面创建一个utils包里面放两个模块utils/ ├── __init__.py ├── math_utils.py └── str_utils.py# utils/__init__.py# 这个文件可以为空也可以写一些包的初始化代码# utils/math_utils.pydefadd(a,b):returnabdefmultiply(a,b):returna*b# utils/str_utils.pydefto_upper(text):returntext.upper()defjoin_words(words):return .join(words)然后在主程序中导入包里的模块# main.py和 utils 文件夹在同一个目录下fromutilsimportmath_utils,str_utilsprint(math_utils.add(3,5))# 8print(math_utils.multiply(4,6))# 24print(str_utils.to_upper(hello))# HELLOprint(str_utils.join_words([a,b,c]))# a b c输出8 24 HELLO a b c可以看到用包来组织模块后导入语句变成了from utils import math_utils语义更清晰也避免了不同模块之间的命名冲突。当项目中的模块数量增多时用包来分层管理会非常方便。12.5 pip 和第三方库除了 Python 自带的模块全球开发者还贡献了数以万计的第三方库可以通过pip来安装# 安装第三方库pipinstallrequests# 安装特定版本pipinstallrequests2.28.0# 查看已安装的库pip list# 卸载库pip uninstall requests安装后就可以像使用标准库一样使用它importrequests responserequests.get(https://api.github.com)print(f状态码{response.status_code})print(f数据{response.json()})常见问题与排查pip install偶尔会失败常见原因有以下三种网络问题下载超时或连接不上 PyPI 镜像源。可换用国内镜像源加速pipinstallrequests-ihttps://pypi.tuna.tsinghua.edu.cn/simple权限不足当前用户没有写系统目录的权限。可加--user安装到当前用户目录pipinstall--userrequests版本冲突已安装的依赖与目标库版本不兼容。可先升级pip再重试pipinstall--upgradepip pipinstallrequests另外网络请求并不总是成功建议用try...except捕获异常避免程序直接崩溃importrequeststry:responserequests.get(https://api.github.com,timeout5)response.raise_for_status()# 状态码不是 200 时抛出异常print(f状态码{response.status_code})print(f数据{response.json()})exceptrequests.exceptions.RequestExceptionase:print(f请求失败{e})12.6 本章练习学完本章动手练一练吧下面 3 道题由易到难覆盖了本章的核心知识点。练习 1随机数求和入门使用random模块生成 10 个 1-100 之间的随机整数并计算它们的总和。提示使用random.randint(1, 100)生成随机整数配合for循环累加求和。importrandom total0foriinrange(10):numrandom.randint(1,100)print(f第{i1}个数{num})totalnumprint(f总和{total})参考输出第 1 个数42 第 2 个数87 第 3 个数15 第 4 个数63 第 5 个数91 第 6 个数28 第 7 个数56 第 8 个数74 第 9 个数33 第 10 个数69 总和558练习 2自定义几何模块进阶创建一个自定义模块geometry.py包含求圆面积和周长的函数然后在主程序中导入并调用。提示圆面积公式为π * r²周长公式为2 * π * r。可参考 12.4 节创建模块的方法。# geometry.pyimportmathdefcircle_area(radius):计算圆面积returnmath.pi*radius**2defcircle_perimeter(radius):计算圆周长return2*math.pi*radius# main.py和 geometry.py 在同一个文件夹中importgeometry r5print(f半径{r}的圆面积{geometry.circle_area(r):.2f})print(f半径{r}的圆周长{geometry.circle_perimeter(r):.2f})参考输出半径 5 的圆面积78.54 半径 5 的圆周长31.42练习 3网络请求异常处理挑战使用requests库获取指定 URL 的响应状态码并用try...except处理网络异常。提示参考 12.5 节「常见问题与排查」中的异常处理写法用requests.exceptions.RequestException捕获所有网络相关异常。importrequests urlhttps://api.github.comtry:responserequests.get(url,timeout5)response.raise_for_status()print(f状态码{response.status_code})print(f请求成功)exceptrequests.exceptions.RequestExceptionase:print(f请求失败{e})参考输出网络正常时状态码200 请求成功参考输出网络异常时请求失败HTTPSConnectionPool(hostapi.github.com, port443): Max retries exceeded with url: / (Caused by NewConnectionError(urllib3.connection.HTTPSConnection object at 0x...: Failed to establish a new connection: [Errno 11001] getaddrinfo failed))
返回列表