10.1 可变参数
*args - 位置可变参数
1 | def sum_all(*args): |
**kwargs - 关键字可变参数
1 | def show_info(**kwargs): |
组合使用
1 | def func(a, b, *args, **kwargs): |
10.2 参数解包
列表/元组解包
1 | def add(a, b, c): |
字典解包
1 | def introduce(name, age, city): |
10.3 闭包
闭包是引用了外部作用域变量的内部函数。
1 | def outer(x): |
实际应用:计数器
1 | def make_counter(): |
10.4 装饰器
装饰器用于在不修改原函数的情况下增强功能。
基本装饰器
1 | def my_decorator(func): |
带参数的装饰器
1 | def repeat(times): |
实用装饰器示例
1 | import time |
10.5 递归函数
递归是函数调用自身的技术。
示例:阶乘
1 | def factorial(n): |
示例:斐波那契数列
1 | def fibonacci(n): |
递归注意事项
- 必须有终止条件(基线条件)
- 避免无限递归
- Python 默认递归深度限制为 1000
1 | import sys |
10.6 生成器函数
生成器使用 yield 返回值,可以暂停和恢复执行。
1 | def count_up_to(max): |
生成器表达式
1 | # 列表推导式 vs 生成器表达式 |
10.7 函数注解进阶
1 | from typing import List, Dict, Optional |
10.8 本章小结
*args接收位置参数(元组),**kwargs接收关键字参数(字典)- 闭包是引用外部变量的内部函数
- 装饰器用于增强函数功能,使用
@语法 - 递归函数调用自身,必须有终止条件
- 生成器使用
yield,惰性求值节省内存 - 类型提示提高代码可读性和工具支持
练习题
- 编写装饰器
@log,在函数执行前后打印函数名和参数 - 使用递归实现计算列表元素之和
- 编写生成器函数,生成斐波那契数列(无限)
- 以下代码输出什么?
1
2
3def func(a, *args, **kwargs):
print(args, kwargs)
func(1, 2, 3, x=4, y=5)