有勇气的牛排博客

Python 函数式编程 map/reduce、filter函数、匿名函数lambda、装饰器

有勇气的牛排 350 Python 2023-05-18 21:02:41

1 介绍

https://docs.python.org/zh-cn/3/howto/functional.html

函数式 编程将一个问题分解成一系列函数。

理想情况下,函数只接受输入并输出结果,对一个给定的输入也不会有英系那个输出内部状态。著名的函数式语言有ML家族和Haskell。

2 高阶函数

2.1 map/reduce

Python内建了map()reduce函数。
该函数的思想同Google发布的“MapReduce: Simplified Data Processing on Large Clusters”相同。

2.1.1 map方法

eg. f(x)=x^2

(1)用map方式实现

def f(x): return x * x r = map(f, [1, 2, 3]) print(list(r)) # 输出:[1, 4, 9]

(2)传统方式
这种方法将 f(x)作用到了list的每一个元素,结果在新的list

def f(x): return x * x L = [] for n in [1, 2, 3]: L.append(f(n)) print(L) # 输出:[1, 4, 9]

eg. 将list所有数字转为字符串

print(list(map(str, [1, 2, 3]))) # 输出:['1', '2', '3']
2.1.1 reduce方法

reduce 把一个函数作用在以下序列 [x1, x2, x3,…] 上,这个函数必须介绍2个参数, reduce 把结果继续和序列的下一个元素做积累计算,其效果为

reduce(f,[x1, x2, x3]) = f(f(f(f(x1, x2),x3),x4)

序列求和

# 1 reduce方法 from functools import reduce def add(x, y): print(x, y) return x + y # 输出 # 1 2 # 3 3 print(reduce(add, [1, 2, 3])) # 输出:6 # 2 直接sum方法 print(sum([1, 2, 3]))

把序列[1, 3, 5, 7, 9]变换成整数13579

# 把序列[1, 3, 5, 7, 9]变换成整数13579 from functools import reduce def fn(x, y): return x * 10 + y print(reduce(fn, [1, 3, 5, 7, 9]))

2.2 filter(筛选)

Python内包含filter()函数用于过滤序列。
map()不同的是filter()把传入的函数依次作用于每个元素,然后根据返回值值TrueFalse保留或删除元素。

filter返回的是一个Iterator, 是个惰性序列,所以要转为list

eg. 删除list中偶数,保留奇数

def is_odd(n): return n % 2 == 1 print(list(filter(is_odd, [1, 2, 3, 4, 5, 6]))) # 输出:[1, 3, 5]

eg. 删除序列中的空字符串

def not_empty(s): return s and s.strip() print(list(filter(not_empty, ['A', '', 'C', None, ' ']))) # 输出:['A', 'C']

3 匿名函数 lambda

lambda:表示匿名函数,冒号前表示参数,冒号后为表达式(只能有一个)

eg. 求解f(x)=x^2

(1) map()函数

def f(x): return x * x r = map(f, [1, 2, 3]) print(list(r)) # 输出:[1, 4, 9]

(2)lambda 方法

print(list(map(lambda x: x * x, [1, 2, 3]))) # 输出:[1, 4, 9]

4 装饰器

def use_logging(func): def wrapper(*args, **kwargs): print(">>>>>>>>>>>>>>>") print("%s 正在运行" % func.__name__) print(*args) print(args[0]) print(args[1]) print(">>>>>>>>>>>>>>>") return func(*args) return wrapper @use_logging def getInfo(name, age): print("-------") print(name, age) getInfo("有勇气的牛排", "20")

留言

专栏
文章
加入群聊