035 高阶函数

  • 把函数作为参数使用的函数,叫高阶函数

引子

  • 函数名可以类似变量那样使用

例1

>>> a = 10
>>> b = a
>>> b
10
>>> 
>>> def func():
...   print("abc")
...
>>> func()
abc
>>> new_func = func
>>> new_func()
abc
>>> type(new_func)
<class 'function'>
>>> 

例2

  • 在一个函数里调用另一个函数
>>> 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
>>> 

系统提供的高阶函数

  • Python2 与 Python3 用法有些许不同

map

  • 映射,即把序列中每个元素都按照一定规则进行操作,生成一个新的序列的迭代对象

例1 不用 map

>>> a = list(range(10))
>>> b = []
>>> for i in a:
...   b.append(i * 10)
...
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> 

例2 使用 map

>>> mul_ten = lambda x: 10 * x
>>> it = map(mul_ten, [1, 2, 3])
>>> it
<map object at 0x000002AD0F8C00B8>
>>> for i in it:
...   print(i)
...
10
20
30
>>> 

例3 map 配合 list

>>> a = [1, 2, 3]
>>> b = [4, 5, 6, 7]
>>> list(map(lambda x, y: x + y, a, b))  # 类似 zip
[5, 7, 9]
>>> 

例4 map 生成的迭代器只能迭代一次

>>> a = map(lambda x: x * x, [1, 2, 3])
>>> for i in a:
...   print(i)
...
1
4
9
>>> for i in a:
...   print(i)
...
>>> 
>>> b = map(lambda x: x * x, [1, 2, 3])
>>> [i for i in b]
[1, 4, 9]
>>> [i for i in b]
[]
>>> 

filter

  • 过滤函数,对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
  • map 相比
    • 同:都对序列的每个元素逐一进行操作
      • map 会生成一个跟原来数据相对应的新序列
      • filter 不一定,只有符合条件的才会进入新的数据集合
  • filter 函数的写法
    • 利用给定函数进行判断
    • 返回值一定是个布尔值
    • 调用格式:filter(f, data)
      • f 过滤函数
      • data 数据
>>> list(filter(lambda x: x % 2, [1, 2, 3, 4, 5]))
[1, 3, 5]
>>> 

reduce

  • functools 包提供
  • 把一个可迭代对象归并成一个结果
  • 对于作为参数的函数要求
    • 必须有两个参数
    • 必须要返回结果
  • reduce(f, [1, 2, 3]) 可以理解成 f(f(1, 2), 3)
>>> from functools import reduce
>>> reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
15
>>> 

排序

  • 把一个序列按照给定算法进行排序
  • 格式:sorted(iterable, /, *, key=None, reverse=False)
  • key: 在排序前,对每一个元素进行 key 函数运算,可以理解成按照 key 函数定义的逻辑进行排序

例1

>>> sorted([1, 3, 5, 7, 9], reverse=True)
[9, 7, 5, 3, 1]
>>> 

例2

>>> sorted([9, -3, 0, 4, 8], key=abs)
[0, -3, 4, 8, 9]
>>> 

例3

>>> names = ["Tony black", "amy green", "Johnny Lee"]
>>> sorted(names)
['Johnny Lee', 'Tony black', 'amy green']
>>> sorted(names, key=str.lower)
['amy green', 'Johnny Lee', 'Tony black']
>>> 
原文地址:https://www.cnblogs.com/yorkyu/p/12070111.html