| 30天学会Python编程:6.Python函数编程完全指南
					当前位置:点晴教程→知识管理交流
					
					→『 技术文档交流 』
					
				 
 
 | 
| calculate_area | ||
| radius | ||
| return 3.14 * radius**2 | ||
| 78.5 | ||
| """计算圆面积""" | 
文档字符串使用建议:
help(function_name)访问def greet(name):
    """返回个性化问候语
    
    Args:
        name (str): 用户名
        
    Returns:
        str: 问候字符串
    """
    return f"Hello, {name.capitalize()}!"
# 调用示例
print(greet("alice"))  # Hello, Alice!
函数设计原则:
四种参数类型:

参数组合顺序:
def func(positional, keyword=value, *args, **kwargs):
    pass
参数传递规则:
*args收集多余位置参数**kwargs收集多余关键字参数# 位置参数
defpower(base, exponent):
    return base ** exponent
# 关键字参数(提高可读性)
print(power(exponent=3, base=2))  # 8
# 默认参数(提供缺省值)
defconnect(host, port=3306, timeout=10):
    print(f"连接到 {host}:{port}, 超时:{timeout}s")
# 可变位置参数(*args)
defsum_numbers(*numbers):
    returnsum(numbers)
# 可变关键字参数(**kwargs)
defbuild_profile(**info):
    for key, value in info.items():
        print(f"{key}: {value}")
默认参数陷阱:
# 错误示例:可变对象作为默认参数
def append_to(element, target=[]):
    target.append(element)
    return target
# 正确做法
def append_to(element, target=None):
    if target is None:
        target = []
    target.append(element)
    return target
# 列表/元组解包为位置参数
args = [3, 4]
print(power(*args))  # 81
# 字典解包为关键字参数
kwargs = {"base": 2, "exponent": 5}
print(power(**kwargs))  # 32
解包应用场景:
多返回值实现:
def analyze_number(n):
    """返回数字的平方、立方和绝对值"""
    return n**2, n**3, abs(n)
# 元组解包接收多个返回值
square, cube, absolute = analyze_number(-3)
返回函数(高阶函数):
def create_multiplier(factor):
    """创建乘法器函数"""
    def multiplier(x):
        return x * factor
    return multiplier
double = create_multiplier(2)
print(double(5))  # 10
返回值最佳实践:
None,考虑使用空对象模式LEGB规则:

作用域示例:
x = "global"
def outer():
    x = "enclosing"
    def inner():
        x = "local"
        print(x)  # local
    inner()
    print(x)  # enclosing
outer()
print(x)  # global
作用域管理:
global声明全局变量nonlocal修改闭包变量numbers = [1, 2, 3, 4]
# map: 应用函数到每个元素
squares = list(map(lambda x: x**2, numbers))
# filter: 过滤满足条件的元素
evens = list(filter(lambda x: x%2==0, numbers))
# reduce: 累积计算(需导入)
from functools import reduce
product = reduce(lambda x,y: x*y, numbers)
函数式编程优势:
def apply_operation(func, a, b):
    """应用指定操作到两个数"""
    return func(a, b)
# 使用匿名函数
result = apply_operation(lambda x,y: x+y, 3, 4)  # 7
# 使用预定义函数
import operator
result = apply_operation(operator.mul, 3, 4)  # 12
回调函数应用场景:
def counter():
    """闭包实现计数器"""
    count = 0
    def increment():
        nonlocal count  # 声明非局部变量
        count += 1
        return count
    return increment
c = counter()
print(c(), c(), c())  # 1 2 3
闭包本质:
简单装饰器:
def timer(func):
    """测量函数执行时间"""
    import time
    defwrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__}执行耗时: {end-start:.4f}s")
        return result
    return wrapper
@timer  # 装饰器语法糖
deflong_running_task(n):
    returnsum(i*i for i inrange(n))
带参数装饰器:
def repeat(times):
    """重复执行函数"""
    defdecorator(func):
        defwrapper(*args, **kwargs):
            for _ inrange(times-1):
                func(*args, **kwargs)
            return func(*args, **kwargs)  # 返回最后一次结果
        return wrapper
    return decorator
@repeat(3)
defsay_hello():
    print("Hello!")
装饰器最佳实践:
functools.wraps保留元信息from functools import partial, lru_cache
# 偏函数:固定部分参数
square_root = partial(power, exponent=0.5)
print(square_root(9))  # 3.0
# 缓存装饰器:优化递归函数
@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
functools实用工具:
reduce:累积计算cmp_to_key:旧式比较函数转换total_ordering:自动生成比较方法singledispatch:函数重载def fibonacci_sequence(limit):
    """生成斐波那契数列"""
    a, b = 0, 1
    while a < limit:
        yield a  # 产出值并暂停
        a, b = b, a + b
# 惰性求值,节省内存
print(list(fibonacci_sequence(100))) 
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
生成器优势:
def data_pipeline():
    """数据处理管道示例"""
    raw_data = ["10", "20", "30", "abc", "40"]
    
    # 处理步骤链
    steps = [
        lambda data: map(str.strip, data),      # 去空格
        lambda data: filter(str.isdigit, data), # 过滤数字
        lambda data: map(int, data),            # 转整数
        lambda data: map(lambda x: x*2, data),  # 数值加倍
        list                                    # 转为列表
    ]
    
    data = raw_data
    for step in steps:
        data = step(data)
        print(f"当前结果: {data}")
    
    return data
print("最终结果:", data_pipeline())
函数式管道优势:
def permission_required(permission):
    """权限检查装饰器"""
    defdecorator(func):
        defwrapper(user, *args, **kwargs):
            # 检查权限位
            if user.get("permissions", 0) & permission != permission:
                raise PermissionError("权限不足")
            return func(user, *args, **kwargs)
        return wrapper
    return decorator
# 权限定义
READ = 0b0001
WRITE = 0b0010
DELETE = 0b0100
ADMIN = 0b1000
@permission_required(READ | WRITE)
defedit_document(user, document):
    print(f"{user['name']}正在编辑{document}")
# 使用示例
user = {"name": "Alice", "permissions": READ | WRITE}
edit_document(user, "重要文件")  # 正常执行
装饰器应用场景:

学习路径建议:
函数基础:
def定义函数,return返回值参数处理:
*args, **kwargs)作用域管理:
global和nonlocal谨慎修改作用域高阶函数:
mapfilter/reduce应用装饰器:
@functools.wraps保留元信息函数式工具:
functools.partialfunctools.lru_cache协程与异步:
asyncawait语法元编程:
inspect模块)函数式进阶:
类型系统:
可变默认参数:
# 错误
def add_item(item, items=[]):
    items.append(item)
    return items
# 正确
def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items
闭包变量绑定:
# 错误:所有函数共享i
funcs = [lambda: i for i in range(3)]
# 正确:创建闭包捕获当前值
funcs = [lambda i=i: i for i in range(3)]
装饰器元信息丢失:
from functools import wraps
def decorator(func):
    @wraps(func)  # 保留原始函数信息
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper
生成器状态耗尽:
gen = (x for x in range(3))
print(list(gen))  # [0, 1, 2]
print(list(gen))  # [] 生成器已耗尽
# 解决方案:重新创建生成器
掌握Python函数编程是成为Python开发必须要掌握的知识。通过理解函数基础、参数传递、作用域管理,再到高阶函数和装饰器应用,我们将能够编写更简洁、高效且可维护的代码。
阅读原文:原文链接