文章目录
前言
学习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。