| 30天学会Python编程:18.Python函数式编程
					当前位置:点晴教程→知识管理交流
					
					→『 技术文档交流 』
					
				 
 
 | 
函数式编程优势:
适用场景举例:
from functools import reduce
# 示例数据集
numbers = [1, 2, 3, 4, 5]
# map应用函数
squares = list(map(lambda x: x**2, numbers))
print(squares)  # [1, 4, 9, 16, 25]
# filter过滤元素
evens = list(filter(lambda x: x%2==0, numbers))
print(evens)  # [2, 4]
# reduce累积计算
sum_total = reduce(lambda acc, x: acc+x, numbers, 0)
print(sum_total)  # 15
使用技巧:
注意事项:
def compose(*funcs):
    """从右向左组合多个函数"""
    definner(data):
        return reduce(lambda val, func: func(val), reversed(funcs), data)
    return inner
# 创建数据处理管道
process = compose(
    lambda s: s.strip(),       # 去除空格
    lambda s: s.replace(' ', '_'),  # 替换空格为下划线
    lambda s: s.upper()        # 转为大写
)
print(process(" hello world "))  # HELLO_WORLD
组合优势:
def make_counter(initial=0):
    """闭包实现计数器工厂"""
    count = initial
    
    defcounter(increment=1):
        nonlocal count  # 声明使用外部变量
        count += increment
        return count
    
    return counter
# 创建计数器实例
c1 = make_counter()
print(c1())   # 1 (默认+1)
print(c1(2))  # 3 (增加2)
闭包特点:
from functools import wraps
defmemoize(func):
    """缓存装饰器:存储计算结果"""
    cache = {}
    
    @wraps(func)  # 保留原函数信息
    defwrapper(*args):
        if args notin cache:
            cache[args] = func(*args)
        return cache[args]
    return wrapper
@memoize
deffibonacci(n):
    """带缓存的斐波那契函数"""
    return n if n < 2else fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(50))  # 快速计算大数值
装饰器用途:
from collections import namedtuple
# 普通元组
point = (1, 2)
x, y = point  # 解包赋值
# 命名元组
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, y=2)
print(p.x, p.y)  # 1 2
# 创建不可变集合
fs = frozenset([1, 2, 3])
try:
    fs.add(4)  # 尝试修改
except AttributeError as e:
    print("错误:frozenset不可修改")
不可变数据优势:
# 列表推导式(立即求值)
squares_list = [x**2 for x in range(1000000)]  # 消耗大量内存
# 生成器表达式(惰性求值)
squares_gen = (x**2 for x in range(1000000))  # 几乎不占内存
print(sum(squares_gen))  # 333333833333500000
import itertools
# 无限计数器
counter = itertools.count(start=10, step=2)
print(next(counter), next(counter))  # 10, 12
# 排列组合
perms = itertools.permutations('ABC', 2)
print(list(perms))  # [('A','B'), ('A','C'), ('B','A'), ...]
# 分组操作
data = sorted(['apple', 'banana', 'cherry', 'date'], key=len)
for key, group in itertools.groupby(data, key=len):
    print(key, list(group))
# 4: ['date']
# 5: ['apple']
# 6: ['banana', 'cherry']
惰性求值优势:
def factorial(n):
    """递归阶乘函数"""
    return 1 if n <= 1 else n * factorial(n-1)
# 尾递归优化版
def factorial_tail(n, acc=1):
    return acc if n <= 1 else factorial_tail(n-1, acc*n)
def trampoline(func):
    """尾递归优化装饰器"""
    defwrapped(*args, **kwargs):
        result = func(*args, **kwargs)
        whilecallable(result):
            result = result()
        return result
    return wrapped
@trampoline
deffactorial(n, acc=1):
    """优化后的尾递归阶乘"""
    return acc if n <= 1elselambda: factorial(n-1, acc*n)
print(factorial(1000))  # 计算大数不栈溢出
递归注意事项:
def data_pipeline(data):
    """函数式数据处理管道"""
    # 定义处理步骤
    steps = [
        lambda d: filter(lambda x: x % 2 == 0, d),  # 过滤偶数
        lambda d: map(lambda x: x**2, d),           # 平方
        lambda d: map(str, d),                       # 转字符串
        lambda d: ', '.join(d)                       # 连接结果
    ]
    
    # 应用所有处理步骤
    result = reduce(lambda d, step: step(d), steps, data)
    return result
data = range(1, 11)
print(data_pipeline(data)) 
# 输出: 4, 16, 36, 64, 100
def where(data, predicate):
    returnfilter(predicate, data)
defselect(data, transform):
    returnmap(transform, data)
defgroup_by(data, key_func):
    from itertools import groupby
    sorted_data = sorted(data, key=key_func)
    return groupby(sorted_data, key_func)
# 使用DSL查询数据
users = [
    {'name': 'Alice', 'age': 25, 'dept': 'HR'},
    {'name': 'Bob', 'age': 30, 'dept': 'IT'},
    {'name': 'Charlie', 'age': 35, 'dept': 'IT'}
]
# 构建查询:年龄>25的员工按部门分组
result = group_by(
    select(
        where(users, lambda u: u['age'] > 25),
        lambda u: {'name': u['name'], 'dept': u['dept']}
    ),
    lambda u: u['dept']
)
# 输出结果
for dept, group in result:
    print(f"{dept}部门:")
    for user in group:
        print(f"  - {user['name']}")

函数式编程的一些原则:
Python函数式编程技巧:
functools模块简化函数操作适用场景举例: ✅ 数据转换和清洗 ✅ 并行/并发编程 ✅ 数学和科学计算 ✅ 配置管理和验证 ✅ 构建DSL领域特定语言
性能考虑:
函数式编程虽然不是万能神药,但在处理复杂数据流和构建可维护系统方面具有独特优势。将函数式思想融入Python开发,能提升代码质量和开发效率。
阅读原文:原文链接