Python入门第四课:高级特性与实战:应用列表推导式与生成器
列表推导式与生成器
1. 列表推导式(List Comprehensions)
# 传统方式创建平方列表
squares = []
for x in range(1, 11):squares.append(x**2)
print("传统方式:", squares)# 使用列表推导式
squares_lc = [x**2 for x in range(1, 11)]
print("列表推导式:", squares_lc)# 带条件的列表推导式
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print("偶数平方:", even_squares)# 嵌套推导式(矩阵转置)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
print("转置矩阵:", transposed)
2. 生成器表达式(Generator Expressions)
# 创建生成器
square_gen = (x**2 for x in range(1, 11))# 使用生成器
print("生成器值:", end=" ")
for value in square_gen:print(value, end=" ")# 生成器优势:节省内存
import sys
print("\n内存占用比较:")
print("列表推导式:", sys.getsizeof([x**2 for x in range(1000000)]), "bytes")
print("生成器表达式:", sys.getsizeof((x**2 for x in range(1000000))), "bytes")
装饰器(Decorators)
1. 基本装饰器
def simple_decorator(func):def wrapper():print("--- 函数执行前 ---")func()print("--- 函数执行后 ---")return wrapper@simple_decorator
def greet():print("你好,世界!")# 调用被装饰的函数
greet()
2. 带参数的装饰器
def repeat(num_times):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(num_times):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator_repeat@repeat(num_times=3)
def say_name(name):print(f"我的名字是 {name}")say_name("小明")
3. 计时装饰器(实用示例)
import timedef timer(func):def wrapper(*args, **kwargs):start_time = time.perf_counter()result = func(*args, **kwargs)end_time = time.perf_counter()print(f"函数 {func.__name__} 执行时间: {end_time - start_time:.4f} 秒")return resultreturn wrapper@timer
def long_running_function(n):total = 0for i in range(n):total += ireturn totalprint("计算结果:", long_running_function(1000000))
正则表达式(Regular Expressions)
1. 基本匹配
import retext = "联系我: 电话 138-1234-5678, 邮箱 example@email.com, 网址 https://www.example.com"# 查找电话号码
phone_pattern = r'\d{3}-\d{4}-\d{4}'
phones = re.findall(phone_pattern, text)
print("找到的电话号码:", phones)# 查找邮箱
email_pattern = r'[\w\.-]+@[\w\.-]+'
emails = re.findall(email_pattern, text)
print("找到的邮箱:", emails)# 查找URL
url_pattern = r'https?://\S+'
urls = re.findall(url_pattern, text)
print("找到的URL:", urls)
2. 验证输入格式
def validate_email(email):pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'return bool(re.match(pattern, email))# 测试邮箱验证
emails = ["test@example.com", "invalid_email", "name@domain.org", "wrong@format."]
for email in emails:print(f"{email}: {'有效' if validate_email(email) else '无效'}")
虚拟环境与包管理
1. 创建和使用虚拟环境
# 创建虚拟环境
python -m venv myenv# 激活虚拟环境 (Windows)
myenv\Scripts\activate# 激活虚拟环境 (Mac/Linux)
source myenv/bin/activate
2. 使用pip管理包
# 安装包
pip install requests pandas matplotlib# 查看已安装包
pip list# 生成requirements.txt
pip freeze > requirements.txt# 从requirements.txt安装
pip install -r requirements.txt
项目实践:天气查询应用
import requests
import json
from datetime import datetimedef get_weather(city_name):"""获取城市天气信息"""api_key = "YOUR_API_KEY" # 替换为你的API密钥base_url = "http://api.openweathermap.org/data/2.5/weather"params = {"q": city_name,"appid": api_key,"units": "metric","lang": "zh_cn"}try:response = requests.get(base_url, params=params)response.raise_for_status() # 检查请求是否成功data = response.json()# 提取天气信息weather_info = {"城市": data["name"],"温度": data["main"]["temp"],"体感温度": data["main"]["feels_like"],"天气状况": data["weather"][0]["description"],"湿度": data["main"]["humidity"],"风速": data["wind"]["speed"],"日出": datetime.fromtimestamp(data["sys"]["sunrise"]).strftime("%H:%M"),"日落": datetime.fromtimestamp(data["sys"]["sunset"]).strftime("%H:%M")}return weather_infoexcept requests.exceptions.RequestException as e:print(f"网络错误: {e}")return Noneexcept (KeyError, json.JSONDecodeError):print("解析天气数据失败")return Nonedef display_weather(weather_data):"""显示天气信息"""if not weather_data:returnprint("\n===== 天气报告 =====")print(f"城市: {weather_data['城市']}")print(f"温度: {weather_data['温度']}°C (体感温度: {weather_data['体感温度']}°C)")print(f"天气: {weather_data['天气状况']}")print(f"湿度: {weather_data['湿度']}%")print(f"风速: {weather_data['风速']} m/s")print(f"日出: {weather_data['日出']}, 日落: {weather_data['日落']}")print("=" * 20)def main():"""主程序"""print("=== 天气查询系统 ===")while True:city = input("\n请输入城市名称 (或输入 'q' 退出): ")if city.lower() == 'q':print("感谢使用天气查询系统!")breakweather = get_weather(city)if weather:display_weather(weather)else:print("无法获取天气信息,请检查城市名称或稍后再试")if __name__ == "__main__":main()
Python学习路径图
练习任务
密码生成器:使用列表推导式生成随机密码(包含大小写字母、数字和符号)
日志装饰器:创建装饰器自动记录函数调用和参数
数据提取工具:编写正则表达式从文本中提取所有日期(格式:YYYY-MM-DD)
API扩展:为天气应用添加天气预报功能(使用5天预报API)
包管理实践:创建虚拟环境,安装必要包,并生成requirements.txt
"代码不是写给机器执行的,而是写给人阅读的。" - Robert C. Martin
通过本课的学习,你已经掌握了Python的高级特性和实战应用技能!这些工具将大幅提升你的编程效率和代码质量。接下来可以探索Web开发、数据分析或人工智能等专业方向。💻🚀