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开发,能提升代码质量和开发效率。
阅读原文:原文链接