Python函数式编程map()、filter()和reduce()


前言

学习python函数,看到C语言中文网的教程,接触到函数式编程。这里引用作者这个概念定义。

所谓函数式编程,是指代码中每一块都是不可变的,都由纯函数的形式组成。这里的纯函数,是指函数本身相互独立、互不影响,对于相同的输入,总会有相同的输出。
除此之外,函数式编程还具有一个特点,即允许把函数本身作为参数传入另一个函数,还允许返回一个函数。

函数除了我们理解的本身定义,有递归函数,现在又发现还有纯函数,这些有利于我们深入理解函数的本质。


一、python函数式编程map()、filter()和reduce()实例

  • 三个函数可以理解是list、字符串的专属函数,实现对列表、字符串每个元素操作,我们可以自己编写相同功能函数,不过python提供的更为高效。

1、map()函数

# 这里不是map()使用常规代码,只是让我们更好理解。
def func1(x): # 自定义带一个参数函数,并返回加1结果。
	return x+1

my_list = [1, 2, 3]
new_list = map(func1, my_list)) # map(function, iterable)
print(list(new_list))
# [2, 3, 4]

map功能式对可迭代对象中的每个元素,都调用指定的函数,并返回一个map对象。
实现类似如下代码,即用for in 循环来实现。

def func1(x): # 自定义带一个参数函数,并返回加1结果。
	return x+1
	
my_list = [1, 2, 3]
new_list=[]
for i in my_list:
	new_list.append(func1(i)) # 将列表每个元素作为参数传入func1函数,存放在new_list。
print(new_list)	
# [2, 3, 4]

常规map()函数代码写法,使用lambda表达式创建匿名函数替代func1函数,把传回map对象转换为list使用。

my_list = [1, 2, 3]
new_list = list(map(lambda x: x + 1, my_list))
# 将列表每个元素作为参数传入func1函数,返回每个元素计算结果,我们使用list转换返回map对象
print(new_list)
# [2, 3, 4]

2、filter()(筛选函数)

理解map()函数使用方法,我们把filter()相同功能代码贴出,理解也很轻松。filter就是在map加上if判断。

def func1(x): # 自定义带一个参数函数,大于1返回真。
	return x>1
	
my_list = [1, 2, 3]
new_list=[]
for i in my_list:
	if func1(i):			# 将列表每个元素作为参数传入func1函数判断。
	 	new_list.append(i)  # 条件为真,将符合元素存放在new_list并返回。
print(new_list)	
# [2, 3]

使用filter函数实现,lambda表达式是python匿名函数写法,起到简化作用,等同第一个函数。

my_list = [1, 2, 3]
new_list = list(filter(lambda x: x > 1, my_list))
print(new_list)
# [2, 3]

3、reduce()(累计函数)

累计函数,就是将每个元素进行相加或者相乘计算累计总值,如我们要计算列表所有元素和

def func1(x, y):# 自定义带两个参数函数,返回相加之和。
    return x + y

my_list = [1, 2, 3]
result = 0
for i in my_list:
    result = func1(i, result)  # 将每个元素相加,返回相加之和。
print(result)
# 6

reduce不是内置,使用前必须导入functools。

from functools import reduce

my_list = [1, 2, 3]
print(reduce(func1, my_list))
# 6

二、map()、filter()和reduce()的总结

map()filter()reduce()
语法格式map(function, iterable)filter(function, iterable)reduce(function, iterable)
实现功能对可迭代对象中的每个元素,都调用指定的函数,并返回一个map对象。对 iterable 中的每个元素,都使用function函数判断,并返回 True 或者 False,最后将返回 True 的元素组成一个新的可遍历的集合。reduce() 函数通常用来对一个集合做一些累积操作
函数要求iterable参数一个或者多个,但是对应的传入function函数有相同数量参数iterable参数一个或者多个,但是对应的传入function函数有相同数量参数function函数必须是两个参数
返回结果可以使用list()将map函数返回对象map转换为列表可以使用list()将filter函数返回对象filter转换为列表单个值
常用情况列表算术计算或者两个列表相加等算术计算对单个列表进行筛选出需要数据列表对单个列表进行累计值操作

相同点:

  • 函数语法格式相同。

function 参数表示要传入一个函数,其可以是内置函数、自定义函数或者 lambda 匿名函数;iterable 表示一个或多个可迭代对象,可以是列表、字符串等。

  • 操作传入对象都是可以迭代的对象,可以理解是list、字符串的专属函数。

不同点:

  • map:映射操作,返回可以转换list的map对象。
  • filter:筛选操作,返回符合条件可以转换list的filter对象。
  • reduce:累计操作,返回一个所有元素累计总值。

总结

python提供的map、filter、reduce操作对象一般是是列表或者字符串,我们也可以使用自编写代码实现,但是两者效率相差很大,python提供的快上一倍。所以相同实现上,应使用map、filter、reduce。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值