详解Python高阶函数:lambda、map、reduce、filter

背景

高阶函数是一种高级函数,至少满足以下一个条件:

  1. 函数作为参数被传入
  2. 函数作为返回值被输出
    即函数的参数是另一个函数,或函数返回值为一个函数的,就是高阶函数。函数式编程就采用高阶函数来实现复杂的处理。

lambda 匿名函数

语法:lambda 参数: 表达式
功能:定义一个匿名函数;减少代码量使代码更简洁
实例:

>>> a = lambda x,y: x+y
>>> a(2,3)
5
相当于
>>> def s(x,y):
	return x + y
>>> s(2,3)
5

map 映射函数

功能:把函数作用在可迭代对象每个元素上
语法:map(func, iterables)
实例:
使用map()函数,把用户输入的不规范英文名字,变成首字母大写的规范名字。
如输入:[‘victoria’, ‘LISA’, ‘arYE’] 输出:[‘Victoria’, ‘Lisa’, ‘Arye’]

>>> list(map(lambda x: x.capitalize(), ['victoria', 'LISA', 'arYE']))
['Victoria', 'Lisa', 'Arye']

求整数列表中每个元素的平方,最终返回一个列表

>>> map(lambda x: x**2, [1,2,3])	# python3中 map() 函数返回的是一个map对象
<map object at 0x038074B0>
>>> list(map(lambda x: x**2, [1,2,3]))	# 要用list()把map对象转为列表才能打印出map对象的值
[1, 4, 9]
相当于
>>> [x**2 for x in [1,2,3]]		# 列表解析,即包含for循环的列表
[1, 4, 9]

reduce 累积函数

功能:对序列中元素进行累积。每次取出2个元素放入函数处理,先取出iterables中的1、2个元素放入function处理,再把得到的结果和第3个元素用function运算,最终得到一个值
语法:和map一样,reduce(func, iterables)
实例:
求 1+2+3+…+100 的和

>>> from functools import reduce	# Python3.x reduce() 已经被移到 functools 模块里,如果我们要使用,需要引入 functools 模块来调用 reduce() 函数
>>> reduce(lambda x,y: x+y, range(1,101))
5050

定义一个阶乘函数 f(n) = n!

>>> def f(n):
	return reduce(lambda x,y: x*y, range(1,n+1))
>>> f(20)
2432902008176640000
相当于
>>> def f(n):
	p = 1
	for i in range(1, n+1):
		p *= i
	return p
>>> f(20)
2432902008176640000

filter 过滤函数

功能:过滤函数,根据True或False决定输出,如果是True则保留
语法:filter(func, iterables)
实例:
去掉偶数,只保留奇数

>>> list(filter(lambda x: x%2==1, range(1,21)))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

保留正数

>>> list(filter(lambda x: x>0, [-10,4,0,1,-8,9]))
[4, 1, 9]

练习

对一个列表 ls=[2,18,9,22,17,24,12,8,27]

  1. 只保留能被3整除的数
  2. 对列表中每个元素乘2加10
  3. 求列表所有元素之和
>>> ls = [2,18,9,22,17,24,12,8,27]
>>> ls
[2, 18, 9, 22, 17, 24, 12, 8, 27]
>>> list(filter(lambda x:x%3==0, ls))
[18, 9, 24, 12, 27]
>>> list(map(lambda x:x*2+10, ls))
[14, 46, 28, 54, 44, 58, 34, 26, 64]
>>> from functools import reduce
>>> reduce(lambda x,y:x+y, ls)
139

参考

Python3之打印出map结果的print(list())用法
Python reduce() 函数
python中lambda的用法

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值