函数式编程 之
高阶函数
- 把函数作为参数使用的函数,叫高阶函数
1. 引子
- 函数名可以类似变量那样使用
>>> a = 10
>>> b = a
>>> b
10
>>>
>>> def func():
... print("abc")
...
>>> func()
abc
>>> new_func = func
>>> new_func()
abc
>>> type(new_func)
<class 'function'>
>>>
- 下方这个例子
- 说白了,就是在一个函数里调用另一个函数
- 对理解后面的“装饰器”也有帮助
>>> def funcA(n):
... return n + 1
...
>>> def funcB(n):
... return funcA(n) * 2
...
>>> def funcC(n, f):
... return f(n) % 5
...
>>> funcC(5, funcB)
2
>>>
2. 系统提供的高阶函数
2.1 map
原意就是映射,即把集合或者列表的每一个元素都按照一定规则进行操作,生成一个新的集合集合或者列表
map 函数返回一个迭代对象
举例
# 不用 map
>>> lst1 = [i for i in range(10)]
>>> lst2 = []
>>> for i in lst1:
... lst2.append(i * 10)
...
>>> lst1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst2
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>>
# 使用 map
>>> mul_ten = lambda x: 10 * x
>>> lst3 = map(mul_ten, [1, 2, 3])
>>> lst3
<map object at 0x000002AD0F8C00B8>
>>> for i in lst3:
... print(i)
...
10
20
30
>>>
# 使用 map,配合 list,map 会舍去多余项
>>> lst4 = [1, 2, 3]
>>> lst5 = [4, 5, 6, 7]
>>> list(map(lambda x,y: x+y, lst4, lst5))
[5, 7, 9]
>>>
- 注意,map 生成的 iterator 只能迭代一次
>>> lst6 = map(lambda x: x*x, [1, 2, 3])
>>> for i in lst6:
... print(i)
...
1
4
9
>>> for i in lst6:
... print(i)
...
>>>
>>> lst7 = map(lambda x: x*x, [1, 2, 3])
>>> [i for i in lst7]
[1, 4, 9]
>>> [i for i in lst7]
[]
>>>
2.2 filter
- 过滤函数: 对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
- 与 map 相比
- 相同
- 都对列表的每一个元素逐一进行操作
- 不同
- map 会生成一个跟原来数据相对应的新队列
- filter 不一定,只有符合条件的才会进入新的数据集合
- 相同
-
filter 函数的写法
- 利用给定函数进行判断
- 返回值一定是个布尔值
- 调用格式
filter(f, data)
,f 是过滤函数,data 是数据
>>> list(filter(lambda x: x%2==0, [1, 2, 3, 4, 5]))
[2, 4]
>>>
3. functools 包提供的 reduce
- 原意为“归并”,“缩减”
- 把一个可迭代对象最后归并成一个结果
- 对于作为参数的函数要求
- 必须有两个参数
- 必须要返回结果
-
reduce([1, 2, 3])
可以理解成f(f(1, 2), 3)
>>> from functools import reduce
>>> reduce(lambda x,y: x+y, [1, 2, 3, 4, 5])
15
>>>
4. 排序
把一个序列按照给定算法进行排序
Python2 和 Python3 相差巨大
格式:
sorted(iterable, /, *, key=None, reverse=False)
key:在排序前,对每一个元素进行 key 函数运算,可以理解成按照 key 函数定义的逻辑进行排序
>>> sorted([1, 3, 5, 7, 9], reverse=True)
[9, 7, 5, 3, 1]
>>>
>>> sorted([9, -3, 0, 4, 8], key=abs)
[0, -3, 4, 8, 9]
>>>
>>> names = ["Tony black", "Amy Green", "Johnny Lee"]
>>> sorted(names)
['Amy Green', 'Johnny Lee', 'Tony black']
>>> sorted(names, key=str.lower)
['Amy Green', 'Johnny Lee', 'Tony black']
>>>