32. 高级函数与闭包、模块实战

32.1 闭包(Closure)

  • 讲解:闭包是函数内部定义的函数,可以访问外部函数的局部变量,保留状态。
def outer(x):
    def inner(y):
        return x + y
    return inner

f = outer(10)
print(f(5))  # 输出 15
print(f(20)) # 输出 30
  • 关键点总结
    • 内部函数访问外部函数变量
    • 外部函数返回内部函数,形成闭包
    • 闭包可保持状态,适合计数器、缓存等

32.2 匿名函数 lambda

  • 讲解lambda 表达式创建匿名函数,用于简单逻辑,常与高阶函数结合。
# 普通函数
def add(a, b):
    return a + b

# 匿名函数
f = lambda a, b: a + b
print(f(10, 20))  # 30

# 与 map, filter, reduce 配合
nums = [1,2,3,4,5]
squared = list(map(lambda x: x**2, nums))
print(squared)  # [1,4,9,16,25]
  • 关键点总结
    • lambda 参数: 表达式
    • 无需 return,表达式结果即返回
    • 简洁、适合短小函数

32.3 高阶函数

  • 讲解:函数可以作为参数传入或返回,增强灵活性。
def apply(func, value):
    return func(value)

def square(x):
    return x * x

print(apply(square, 5))  # 25
  • 关键点总结
    • 函数是对象,可赋值、传参
    • 高阶函数可实现回调、策略模式
    • lambda、闭包结合使用更灵活

32.4 模块实战:自定义工具模块

  • 讲解:将常用函数封装到模块,提高代码复用。
# 文件 math_utils.py
def add(a, b):
    return a + b

def sub(a, b):
    return a - b

def mul(a, b):
    return a * b

def div(a, b):
    return a / b

# 主程序 main.py
from math_utils import add, sub

print(add(10, 5))
print(sub(10, 5))
  • 关键点总结
    • 模块功能单一,便于维护
    • 文档字符串说明模块功能
    • 导入模块使用 importfrom … import …
    • 避免循环导入

32.5 包实战

  • 讲解:将多个模块组织为包,提升项目结构清晰度。
project/
├── mypackage/
│   ├── __init__.py
│   ├── math_utils.py
│   └── string_utils.py
└── main.py

# main.py
from mypackage.math_utils import add
from mypackage.string_utils import reverse

print(add(2,3))
print(reverse("Python"))
  • 关键点总结
    • 包 = 目录 + __init__.py
    • 模块功能分类存放
    • 使用包导入模块,使项目更规范

33. 综合练习与实战案例

33.1 实战案例一:学生信息管理系统

  • 讲解:使用类和列表管理学生信息,实现增删改查功能。
class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def show(self):
        print(f"姓名:{self.name}, 年龄:{self.age}, 成绩:{self.score}")

# 学生列表
students = []

# 添加学生
students.append(Student("小明", 18, 90))
students.append(Student("小红", 19, 95))

# 修改学生成绩
students[0].score = 92

# 删除学生
students.pop(1)

# 遍历显示
for stu in students:
    stu.show()
  • 关键点总结
    • 使用类封装学生信息
    • 列表管理多条数据
    • 增删改查操作结合对象方法

33.2 实战案例二:文件数据统计

  • 讲解:读取文本文件,统计单词出现次数,并写入新文件。
from collections import Counter

# 读取文件
with open('sample.txt', 'r', encoding='utf-8') as f:
    text = f.read()

# 单词统计
words = text.split()
cnt = Counter(words)

# 写入结果
with open('result.txt', 'w', encoding='utf-8') as f:
    for word, count in cnt.items():
        f.write(f"{word}: {count}\n")

print("统计完成!")
  • 关键点总结
    • 文件操作:读取与写入
    • Counter 统计词频
    • 可用于日志分析、文本处理

33.3 实战案例三:简单计算器

  • 讲解:命令行交互实现加减乘除功能,使用函数组织。
def add(a, b):
    return a + b

def sub(a, b):
    return a - b

def mul(a, b):
    return a * b

def div(a, b):
    return a / b

while True:
    op = input("请输入操作(+,-,*,/)或 q 退出: ")
    if op == 'q':
        break
    a = float(input("输入第一个数字: "))
    b = float(input("输入第二个数字: "))
    if op == '+':
        print(add(a, b))
    elif op == '-':
        print(sub(a, b))
    elif op == '*':
        print(mul(a, b))
    elif op == '/':
        print(div(a, b))
    else:
        print("无效操作")
  • 关键点总结
    • 使用函数封装功能
    • 命令行输入控制流程
    • 循环与条件控制实现交互

33.4 实战案例四:正则表达式应用

  • 讲解:从文本中提取手机号、邮箱和日期,实现数据清洗功能。
import re

text = """
姓名: 张三, 手机: 13812345678, 邮箱: zhangsan@example.com, 日期: 2023-05-08
姓名: 李四, 手机: 13987654321, 邮箱: lisi@example.com, 日期: 2023-05-07
"""

# 手机号
phones = re.findall(r'1[3-9]\d{9}', text)
print("手机号:", phones)

# 邮箱
emails = re.findall(r'\w+@[\w\.]+', text)
print("邮箱:", emails)

# 日期
dates = re.findall(r'\d{4}-\d{2}-\d{2}', text)
print("日期:", dates)
  • 关键点总结
    • re.findall 提取匹配数据
    • 常用于数据清洗、日志分析
    • 正则表达式技巧:字符集、量词、分组

33.5 综合总结

  • 面向对象、模块、标准库、文件操作、正则表达式、异常处理,结合实战案例可以:
    • 高效管理和处理数据
    • 提高代码复用性和可维护性
    • 为全栈 Python 开发打下基础

34. Python 高级进阶技巧总结

34.1 列表推导式与生成式

  • 讲解:列表推导式简洁创建列表,生成器表达式节省内存。
# 列表推导式
nums = [x**2 for x in range(10) if x % 2 == 0]
print(nums)  # [0, 4, 16, 36, 64]

# 嵌套列表推导式
matrix = [[i*j for j in range(3)] for i in range(3)]
print(matrix)

# 生成器表达式
gen = (x**2 for x in range(10))
for n in gen:
    print(n, end=" ")
  • 关键点总结
    • 简洁、可读性高
    • 推导式支持条件、嵌套
    • 生成器表达式惰性计算,节省内存

34.2 上下文管理器 with

  • 讲解with 自动管理资源,适用于文件、数据库连接、网络等。
with open('example.txt', 'w') as f:
    f.write("上下文管理器示例")

# 自定义上下文管理器
class MyContext:
    def __enter__(self):
        print("进入上下文")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出上下文")

with MyContext() as ctx:
    print("执行代码块")
  • 关键点总结
    • 自动释放资源,避免忘记关闭
    • __enter____exit__ 控制上下文
    • 可用于文件、网络、锁等管理

34.3 装饰器进阶

  • 讲解:装饰器可组合使用,实现权限控制、日志、缓存等功能。
def decorator1(func):
    def wrapper(*args, **kwargs):
        print("装饰器1前")
        result = func(*args, **kwargs)
        print("装饰器1后")
        return result
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print("装饰器2前")
        result = func(*args, **kwargs)
        print("装饰器2后")
        return result
    return wrapper

@decorator1
@decorator2
def greet(name):
    print(f"Hello, {name}")

greet("小明")
  • 关键点总结
    • 装饰器可多层嵌套
    • 内层先执行,外层后执行
    • 可用于日志、权限检查、缓存、性能统计

34.4 生成器与迭代器进阶

  • 讲解:生成器、迭代器结合高阶函数处理大数据流。
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

# 使用生成器
for num in fibonacci(10):
    print(num, end=" ")

# 使用 itertools 高级迭代器
import itertools
nums = [1,2,3]
for item in itertools.cycle(nums):
    print(item, end=" ")  # 无限循环示例,注意控制结束
    break
  • 关键点总结
    • yield 节省内存,适合大数据
    • itertools 提供高效迭代工具
    • 可结合生成器表达式实现流式计算

34.5 综合应用技巧

  • 讲解

    :在全栈开发中,高级技巧可以组合使用:

    • 列表推导式处理数据
    • 装饰器控制函数权限或日志
    • 上下文管理器安全管理资源
    • 生成器与迭代器处理大数据或流式计算
# 组合示例
def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数: {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def process_data(data):
    return [x**2 for x in data if x % 2 == 0]

result = process_data(range(10))
print(result)
  • 关键点总结
    • 多种高级功能组合提高代码效率和安全
    • 全栈开发中常用
    • 提前规划代码结构,模块化、可复用性高
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐