```python
# Python函数式编程:lambda、map与filter的高效用法
# 1. lambda表达式的高阶应用
# 匿名函数的灵活使用场景
# 场景1:作为高阶函数的参数
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x2, numbers))
print(f平方运算: {squared})
# 场景2:条件表达式与lambda结合
even_check = lambda x: 偶数 if x % 2 == 0 else 奇数
results = list(map(even_check, numbers))
print(f奇偶判断: {results})
# 场景3:多参数lambda
coordinates = [(1, 2), (3, 4), (5, 6)]
distances = list(map(lambda x, y: (x2 + y2)0.5,
[c[0] for c in coordinates],
[c[1] for c in coordinates]))
print(f距离计算: {distances})
# 2. map函数的进阶技巧
# 多序列映射
list1 = [1, 2, 3]
list2 = [10, 20, 30]
list3 = [100, 200, 300]
# 多序列并行处理
sum_results = list(map(lambda x, y, z: x + y + z, list1, list2, list3))
print(f多序列求和: {sum_results})
# 类型转换映射
str_numbers = ['1', '2', '3', '4']
int_numbers = list(map(int, str_numbers))
print(f类型转换: {int_numbers})
# 方法调用映射
names = ['alice', 'BOB', 'charLie']
capitalized = list(map(str.capitalize, names))
print(f首字母大写: {capitalized})
# 3. filter函数的精妙运用
# 复杂条件过滤
mixed_data = [1, 'hello', 3.14, '', 0, 'world', None, 42]
# 过滤非空且为字符串的值
valid_strings = list(filter(lambda x: isinstance(x, str) and x != '', mixed_data))
print(f有效字符串: {valid_strings})
# 多条件组合过滤
numbers_range = range(1, 21)
filtered = list(filter(lambda x: x % 2 == 0 and x % 3 == 0, numbers_range))
print(f2和3的公倍数: {filtered})
# 4. 组合使用技巧
# map与filter的链式操作
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 先过滤后映射
processed = list(map(lambda x: x 10,
filter(lambda x: x > 5, data)))
print(f过滤大于5后乘以10: {processed})
# 先映射后过滤
processed2 = list(filter(lambda x: x < 75,
map(lambda x: x 10, data)))
print(f乘以10后过滤小于75: {processed2})
# 5. 实际应用案例
# 案例1:数据处理管道
raw_data = ['25.5', '30.0', 'invalid', '42.3', '0', '100.7']
def clean_data(data_list):
# 转换为浮点数,过滤无效值
cleaned = list(map(float,
filter(lambda x: x.replace('.', '').isdigit(), data_list)))
# 过滤异常值
final = list(filter(lambda x: 0 <= x <= 100, cleaned))
return final
cleaned_results = clean_data(raw_data)
print(f数据清洗结果: {cleaned_results})
# 案例2:文本处理
texts = ['Hello World', 'python programming', 'FUNCTIONAL PROGRAMMING']
# 提取包含特定关键词且长度合适的文本
keywords = ['programming', 'functional']
filtered_texts = list(filter(
lambda text: any(keyword in text.lower() for keyword in keywords) and len(text) > 10,
texts
))
print(f关键词过滤: {filtered_texts})
# 6. 性能优化技巧
# 使用生成器表达式替代map/filter
large_data = range(1000000)
# 传统方式
traditional = list(map(lambda x: x2, filter(lambda x: x % 2 == 0, large_data)))[:10]
# 生成器表达式(更高效)
generator_way = [x2 for x in large_data if x % 2 == 0][:10]
print(f传统方式样本: {traditional[:5]})
print(f生成器方式样本: {generator_way[:5]})
# 7. 函数组合模式
# 创建可重用的函数组合
def compose(functions):
return lambda x: reduce(lambda acc, f: f(acc), functions, x)
from functools import reduce
# 构建处理管道
process_pipeline = compose(
lambda x: x 2, # 第一步:乘以2
lambda x: x + 10, # 第二步:加10
lambda x: x 0.5 # 第三步:开平方
)
result = process_pipeline(16)
print(f函数组合结果: {result})
# 8. 错误处理与边界情况
# 安全的map操作
def safe_map(func, iterable):
def safe_func(item):
try:
return func(item)
except Exception:
return None
return map(safe_func, iterable)
problematic_data = ['123', '456', 'abc', '789']
safe_converted = list(filter(lambda x: x is not None,
safe_map(int, problematic_data)))
print(f安全转换结果: {safe_converted})
# 总结:最佳实践
1. lambda适用于简单的一次性函数逻辑
2. map/filter在处理数据流水线时非常高效
3. 考虑使用生成器表达式提高大数据的处理性能
4. 合理组合这些工具可以构建清晰的数据处理流程
5. 注意错误处理和边界条件的处理
# 性能对比示例
import time
def benchmark_approach():
data = range(100000)
# 方法1:传统循环
start = time.time()
result1 = []
for x in data:
if x % 2 == 0:
result1.append(x2)
time1 = time.time() - start
# 方法2:map+filter
start = time.time()
result2 = list(map(lambda x: x2, filter(lambda x: x % 2 == 0, data)))
time2 = time.time() - start
# 方法3:列表推导式
start = time.time()
result3 = [x2 for x in data if x % 2 == 0]
time3 = time.time() - start
print(f传统循环: {time1:.4f}秒)
print(fmap+filter: {time2:.4f}秒)
print(f列表推导式: {time3:.4f}秒)
benchmark_approach()
```
669

被折叠的 条评论
为什么被折叠?



