python 函数式编程学习笔记 2

时间:2021-07-18 22:42:31

上接 python 函数式编程学习笔记

函子

map 映射

map() 是 Python 内置的高阶函数,它接收一个函数 f 和一个 可迭代对象,并通过把函数 f 依次作用在 可迭代对象 的每个元素上,并返回一个新的可迭代对象。

def f(x):
    return x * x


print('map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])):',
      list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])))

print('map(lambda x, y: x * y, [1, 2, 3], [4, 5, 6]):',
      list(map(lambda x, y: x * y, [1, 2, 3], [4, 5, 6])))
map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])): [1, 4, 9, 16, 25, 36, 49, 64, 81]
map(lambda x, y: x * y, [1, 2, 3], [4, 5, 6]): [4, 10, 18]
def format_name(s):
    s1 = s[0:1].upper() + s[1:].lower()
    return s1


print("map(format_name, ['adam', 'LISA', 'barT']):",
      list(map(format_name, ['adam', 'LISA', 'barT'])))
map(format_name, ['adam', 'LISA', 'barT']): ['Adam', 'Lisa', 'Bart']

reduce 递推

from functools import reduce

m = 2
n = 5
reduce(lambda x, y: x * y, list(range(1, n + 1)), m)
240

filter 过滤器

print("filter((lambda x: x>0), range(-5, 5)):",
      list(filter((lambda x: x > 0), range(-5, 5))))
filter((lambda x: x>0), range(-5, 5)): [1, 2, 3, 4]

zip 并行

print("zip( [1, 2, 3], [4, 5, 6]):", list(zip([1, 2, 3], [4, 5, 6])))
zip( [1, 2, 3], [4, 5, 6]): [(1, 4), (2, 5), (3, 6)]

下面以一个例子结束:

L = list(range(6))
## 计算l中每个元素的两倍和平方,并将两种组成一个列表
## lambda表达式和python函数一样,也可以接受函数作为参数
twoTimes = lambda x: x * 2
square = lambda x: x**2

print([list(map(lambda x: x(i), [twoTimes, square])) for i in L])
print(list(filter(lambda x: x % 2 == 0, L)))

## 内置reduce函数,计算 L 的和
print(reduce(lambda accumValue, newValue: accumValue + newValue, L, 0))
[[0, 0], [2, 1], [4, 4], [6, 9], [8, 16], [10, 25]]
[0, 2, 4]
15

函数修饰器(Decorator)

Python中的函数是对象,故函数可以被当做变量使用。

参考资料:

作用:

对已有的函数添加一些小功能,却又不希望对函数内容有太多的刚性的修改。

  • 将需要添加功能的函数像普通对象一样作为参数传入修饰器在中;
  • 将函数作为修饰器的返回值返回。

修饰器的本质: Python解释器在发现函数调用修饰器后,将其传入修饰器中,然后用返回的函数对象将自身完全替换。

一个函数可以被多个修饰器嵌套修饰:

@deco3
@deco2
@deco1
def df():
    pass

等同于 f=deco3(deco2(deco1(f)))

示例

添加水印 Hello World_

def deco(func):          #修饰器deco
    def wrappedFunc():          #内嵌函数wrappedFunc(所有对于传入函数的修饰逻辑都将在此内嵌函数中实现。)
        return 'Hello World_'+func()
    return wrappedFunc

# 在程序中若有函数需要修饰器修饰,只需在函数定义前使用“`@+修饰器名`”即可使用此修饰器。
@deco
def f():    # 调用修饰器
    return 'I am f'
def g():     # 没有调用修饰器
    return 'I am g'

print(f())
print(g())
Hello World_I am f
I am g
def deco(f):
    def g():
        return [f()[i] for i in range(5)]
    return g
@deco
def h():
    return [1,2,3,4,56,7,'75s']
print(h())
[1, 2, 3, 4, 56]