本章介绍 Python 编程中的一些进阶主题,涵盖生成器、装饰器、上下文管理器、多线程和多进程、网络编程、数据库操作等。掌握这些内容将帮助你构建更高效、模块化、可扩展的应用程序。
10.1 生成器和迭代器
10.1.1 迭代器(Iterator)
迭代器是实现了 __iter__() 和 __next__() 方法的对象,可用于遍历序列。
my_list = [1, 2, 3]
iterator = iter(my_list)
print(next(iterator)) # 输出 1
print(next(iterator)) # 输出 2
10.1.2 生成器(Generator)
生成器是一种用于创建迭代器的简单方式,使用 yield 关键字返回结果。
def countdown(n):
while n > 0:
yield n
n -= 1
for num in countdown(3):
print(num) # 输出 3, 2, 1
生成器具有惰性计算的特性,适合处理大量数据或流式数据。
10.2 装饰器
装饰器是一个函数,用于在不修改原函数代码的情况下,增强或改变其行为。
def logger(func):
def wrapper(*args, **kwargs):
print(f"调用函数 {func.__name__}")
return func(*args, **kwargs)
return wrapper
@logger
def greet(name):
print(f"Hello, {name}")
greet("Alice")
常见用途包括:日志记录、权限检查、性能计时等。
10.3 上下文管理器
上下文管理器用于资源管理,如文件、网络连接等,常用 with 语句自动处理资源释放。
with open("example.txt", "r") as file:
content = file.read()
等价于:
file = open("example.txt", "r")
try:
content = file.read()
finally:
file.close()
自定义上下文管理器
class MyContext:
def __enter__(self):
print("进入上下文")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出上下文")
with MyContext():
print("处理中")
10.4 多线程和多进程
10.4.1 多线程(threading)
适合 I/O 密集型任务:
import threading
def worker():
print("线程工作中")
t = threading.Thread(target=worker)
t.start()
t.join()
注意:Python 解释器的 GIL(全局解释器锁) 限制了多线程的 CPU 并行性。
10.4.2 多进程(multiprocessing)
适合 CPU 密集型任务:
from multiprocessing import Process
def worker():
print("进程工作中")
p = Process(target=worker)
p.start()
p.join()
每个进程有独立的内存空间,适合并行计算任务。
10.5 网络编程基础
10.5.1 使用 socket 编程
TCP 服务端:
import socket
server = socket.socket()
server.bind(('localhost', 12345))
server.listen(1)
conn, addr = server.accept()
print("连接来自:", addr)
data = conn.recv(1024)
conn.sendall(b"Hello Client")
conn.close()
TCP 客户端:
client = socket.socket()
client.connect(('localhost', 12345))
client.sendall(b"Hello Server")
data = client.recv(1024)
print("收到:", data.decode())
client.close()
10.5.2 使用 requests 库进行 HTTP 编程(常用于 Web 接口调用)
用途: 调用 Web API、模拟浏览器请求。
import requests
response = requests.get('https://api.github.com')
print(response.status_code)
print(response.json())
特点:
- 高层封装、简单易用
- 支持 GET/POST/PUT/DELETE 等方法
- 支持 cookie、headers、参数、文件上传等
10.5.3 Web 服务开发(Flask / Django)
用途: 开发 Web API 或网站后端服务。
Flask 简例:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/hello')
def hello():
return jsonify({'msg': 'Hello, World!'})
if __name__ == '__main__':
app.run(debug=True)
特点:
- 快速构建 RESTful 接口
- 与前端(如 HTML 页面、移动端、Vue/React)通信
10.5.4 异步网络编程(asyncio / aiohttp)
用途: 高并发 HTTP 服务或客户端通信。
import asyncio
import aiohttp
async def fetch():
async with aiohttp.ClientSession() as session:
async with session.get('https://httpbin.org/get') as resp:
print(await resp.text())
asyncio.run(fetch())
特点:
- 非阻塞、适合 I/O 密集型任务
- 常用于爬虫、实时聊天、数据采集
10.5.5 网络爬虫(如 Scrapy)
用途: 抓取网页信息并解析内容。
import requests
from bs4 import BeautifulSoup
res = requests.get('https://example.com')
soup = BeautifulSoup(res.text, 'html.parser')
print(soup.title.text)
常见工具:
- requests + BeautifulSoup
- Scrapy 框架(支持异步、分布式爬虫)
10.5.6 WebSocket 编程(双向通信)
用途: 实时通信,如在线聊天室、股票行情推送。
客户端示例(使用 websockets):
import asyncio
import websockets
async def hello():
uri = "ws://localhost:8765"
async with websockets.connect(uri) as websocket:
await websocket.send("Hello server")
response = await websocket.recv()
print(response)
asyncio.run(hello())
10.5.7 FTP / 邮件(SMTP)协议编程
- FTP 文件上传下载: 使用 ftplib
- SMTP 发邮件: 使用 smtplib + email
import smtplib
from email.mime.text import MIMEText
msg = MIMEText("邮件正文内容")
msg['Subject'] = "主题"
msg['From'] = "sender@example.com"
msg['To'] = "receiver@example.com"
server = smtplib.SMTP('smtp.example.com', 587)
server.starttls()
server.login("user", "password")
server.send_message(msg)
server.quit()
10.5.8 第三方 SDK 封装的接口调用(如微信、钉钉、百度AI)
很多服务商提供 Python SDK,方便直接调用云服务接口。
以阿里云短信服务 Python SDK 为例:
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
# 初始化客户端
client = AcsClient(
ak='你的AccessKeyId',
secret='你的AccessKeySecret',
region_id='cn-hangzhou' # 根据你的服务区域设置
)
# 创建通用请求对象
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http
request.set_version('2017-05-25')
request.set_action_name('SendSms')
# 设置请求参数
request.add_query_param('RegionId', 'cn-hangzhou')
request.add_query_param('PhoneNumbers', '接收手机号')
request.add_query_param('SignName', '你的短信签名')
request.add_query_param('TemplateCode', '你的短信模板ID')
request.add_query_param('TemplateParam', '{"code":"123456"}')
# 发起请求
response = client.do_action_with_exception(request)
print(response.decode('utf-8'))
10.6 数据库操作
10.6.1 SQLite 示例
Python 自带 sqlite3 模块,适合轻量级本地数据库操作。
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER)''')
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 30))
conn.commit()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
conn.close()
10.6.2 使用 ORM(如 SQLAlchemy)
SQLAlchemy 提供更高级、对象化的数据库操作方式,推荐用于中大型项目。