美文网首页
系统高阶函数

系统高阶函数

作者: Vector_Wan | 来源:发表于2019-05-18 20:55 被阅读0次

主要包括:

  • map 函数
  • reduce 函数
  • filter 函数
  • sorted 函数

map 函数

map(func,interable)该函数使用函数作为自己的一个参数,它可以interable(可迭代对象) 中的数据依次传递给 func 函数处理,最后把处理的结果作为新的可迭代对象返回。

例如 [1,2,3,4,5]->[1,4,9,16,25]

def power (x):
    return x*x

result = map(power, [1,2,3,4,5])  # 返回的结果是一个生成器,所以要转化为列表打印
print(list(result))
[1, 4, 9, 16, 25]

这个也可以使用 lambda 表达式来写:

result = map(lambda x: x*x, [1,2,3,4,5])  
print(list(result))
[1, 4, 9, 16, 25]

map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的 f(x)=x^2 ,还可以计算任意复杂的函数,比如,把这个 list 所有数字转为字符串只需要一行代码:

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

reduce 函数

reduce(func,inteable)函数 累积操作。func函数必须接受两个参数,reduce会把 fuc 的运行结果做一个参数,然后从 interable 中再依次取出一个数据当作另一个参数,

from functools import reduce
li = [1,2,3,4]
result = reduce(lambda x, y: x* y, li)
print(result)
24

这个函数有点意思,我们看看他具体的运行是怎样的;

在第一次运算时从可迭代对象中取出两个数: 1\times2 = 2

第二次运算时将上次运行的结果 2 作为第一个参数传入,再取一个数 3 作为第二个参数传入: 2\times3 = 6

同理: 6\times4 = 24

最后返回最后一次的处理结果。

实际上我们直接一个 sum() 就可以搞定。。。

下面再举一个实际应用的例子:要把序列[1, 3, 5, 7, 9]变换成整数 13579,reduce就可以派上用场:

from functools import reduce
def fn(x, y):
    return x * 10 + y

reduce(fn, [1, 3, 5, 7, 9])
13579

这个例子本身没多大用处,但是,如果考虑到字符串 str 也是一个可迭代对象序列,对上面的例子稍加改动,配合 map() ,我们就可以写出把 str 转换为 int 的函数:

from functools import reduce
def fn(x, y):
     return x * 10 + y

def char2num(s):
    digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return digits[s]

reduce(fn, map(char2num, '13579'))
13579

整理成一个 str2int 的函数就是:

from functools import reduce

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def str2int(s):
    def fn(x, y):
        return x * 10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(fn, map(char2num, s))

str2int('13579')
13579

还可以用lambda函数进一步简化成:

from functools import reduce

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def char2num(s):
    return DIGITS[s]

def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))

filter 函数

filter(func,interable) 根据函数 func 来过滤 interable ,将interable 中的数据传入 func 中,如果函数返回 True 则保留该数据,否则就不保留。

li = [1,2,3,4,5,6,9,10,15]
result = filter(lambda x: x % 2 == 1, li)  # 返回一个 filter 对象,同样使用list()转化一下
print(list(result))
[1, 3, 5, 9, 15]

sorted 函数

sorted(interable,key = None, reverse = False) 对数据进行排序,并返回一个新对象 原对象不变。key 可以用来指定排序的规则,它接受的值是一个函数。reverse 是指定排序的顺序(升序或降序),默认为升序。

# 使用 list.sort()方法:
li = [1,-4,-10,2,12]
re = li.sort()   # 就地排序破坏了原来的数组
print('原来的列表为:',li)
print('返回值是:',re)  # ,没有返回值
原来的列表为: [-10, -4, 1, 2, 12]
返回值是: None
# 使用 sorted(list)函数
li = [1,-4,-10,2,12]
rs = sorted(li, key = abs)  # 指定排序方式为 绝对值大小

print('原来的列表为:',li)
print('返回值是:',rs)  
原来的列表为: [1, -4, -10, 2, 12]
返回值是: [1, 2, -4, -10, 12]

我们试试修改 key 的值(传入不同的函数)使它按照不同的规则来排序:

注意这个函数是分别对列表(可迭代对象)中的每一个元素作用。

# 根据长度排序
chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
print(sorted(chars, key=len))
# 使用lambda 函数
print(sorted(chars, key=lambda x: len(x)))
['a', 'is', 'This', 'from', 'test', 'Andrew', 'string']
['a', 'is', 'This', 'from', 'test', 'Andrew', 'string']

如果是一个复合的列表结构,例如由元组构成的列表,要按照元组中的第二个元素排序,那么可以用 lambda 定义一个匿名函数.关于匿名函数:https://www.jianshu.com/p/5cdfabd43f76

students = [('zhang', 'A'), ('li', 'D'), ('wang', 'C')]
sorted(students, key=lambda x: x[1])
[('zhang', 'A'), ('wang', 'C'), ('li', 'D')]

这里将按照字典顺序 A-B-C-D 的顺序排列。

相关文章

  • wangyanhua--python2

    基本函数的使用 匿名函数 常用系统高阶函数 高阶函数 常用系统高阶函数 Python递归 安装第三方库 三国小说人...

  • 系统高阶函数

    主要包括: map 函数 reduce 函数 filter 函数 sorted 函数 map 函数 map(fun...

  • python学习(三)函数式编程

    高阶函数 函数也是变量,函数参数为函数的函数,称作高阶函数 自定义高阶函数 内建高阶函数 map/reducema...

  • 11.Lambda和高阶函数(Lambda and Higher

    高阶函数 kotlin_Lambda,高阶函数 *swift_高阶函数

  • Python | 高阶函数基本应用及Decorator装饰器

    一、高阶函数 理解什么是高阶函数?以及高阶函数的基本应用方法 ▲ 高阶函数 在了解什么是高阶函数之前,我们来看几个...

  • 四、函数进阶

    一. 高阶函数 参数类型包含函数类型或返回值类型为函数类型的函数为高阶函数。 常见的高阶函数 高阶函数的调用 二....

  • Kotlin 高阶函数

    什么是高阶函数 将函数作为参数或者返回值的,称高阶函数。 定义高阶函数 action是一个高阶函数,(Int) -...

  • 高阶组件

    高阶组件 先来引入这个概念 高阶函数是什么? 高阶函数就是一个函数返回一个函数eg: 高阶组件 类同 高阶组件就是...

  • [JS函数] (Array)の高阶函数

    JS函数 高阶函数 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScr...

  • HOC - High Order Component 高阶组件

    高阶函数 简而言之,可以接收函数作为参数的函数就是一个高阶函数。 上面的hoc函数就是一个高阶函数。 高阶组件 高...

网友评论

      本文标题:系统高阶函数

      本文链接:https://www.haomeiwen.com/subject/pwkxzqtx.html