Python函数式编程(map()、filter()和reduce())详解
除此之外,函数式编程还具有一个特点,即允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
例如,想让列表中的元素值都变为原来的两倍,可以使用如下函数实现:
def multiply_2(list): for index in range(0, len(list)): list[index] *= 2 return list
需要注意的是,这段代码不是一个纯函数的形式,因为列表中元素的值被改变了,如果多次调用 multiply_2() 函数,那么每次得到的结果都不一样。
而要想让 multiply_2() 成为一个纯函数的形式,就得重新创建一个新的列表并返回,也就是写成下面这种形式:
def multiply_2_pure(list): new_list = [] for item in list: new_list.append(item * 2) return new_list
函数式编程的优点,主要在于其纯函数和不可变的特性使程序更加健壮,易于调试和测试;缺点主要在于限制多,难写。
注意,纯粹的函数式编程语言(比如 Scala),其编写的函数中是没有变量的,因此可以保证,只要输入是确定的,输出就是确定的;而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出。
Python 允许使用变量,所以它并不是一门纯函数式编程语言。Python 仅对函数式编程提供了部分支持,主要包括 map()、filter() 和 reduce() 这 3 个函数,它们通常都结合 lambda 匿名函数一起使用。接下来就对这 3 个函数的用法做逐一介绍。
Python map()函数map() 函数的基本语法格式如下:
map(function, iterable)
其中,function 参数表示要传入一个函数,其可以是内置函数、自定义函数或者 lambda 匿名函数;iterable 表示一个或多个可迭代对象,可以是列表、字符串等。
map() 函数的功能是对可迭代对象中的每个元素,都调用指定的函数,并返回一个 map 对象。
注意,该函数返回的是一个 map 对象,不能直接输出,可以通过 for 循环或者 list() 函数来显示。
【例 1】还是对列表中的每个元素乘以 2。
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x: x * 2, listDemo) print(list(new_list))
运行结果为:
[2, 4, 6, 8, 10]
【例 2】map() 函数可传入多个可迭代对象作为参数。
listDemo1 = [1, 2, 3, 4, 5] listDemo2 = [3, 4, 5, 6, 7] new_list = map(lambda x,y: x + y, listDemo1,listDemo2) print(list(new_list))
运行结果为:
[4, 6, 8, 10, 12]
注意,由于 map() 函数是直接由用 C 语言写的,运行时不需要通过 Python 解释器间接调用,并且内部做了诸多优化,所以相比其他方法,此方法的运行效率最高。
Python filter()函数filter()函数的基本语法格式如下:
filter(function, iterable)
此格式中,funcition 参数表示要传入一个函数,iterable 表示一个可迭代对象。
filter() 函数的功能是对 iterable 中的每个元素,都使用 function 函数判断,并返回 True 或者 False,最后将返回 True 的元素组成一个新的可遍历的集合。
【例 3】返回一个列表中的所有偶数。
listDemo = [1, 2, 3, 4, 5] new_list = filter(lambda x: x % 2 == 0, listDemo) print(list(new_list))
运行结果为:
[2, 4]
【例 4】filter() 函数可以接受多个可迭代对象。
listDemo = [1, 2, 3, 4, 5] new_list = map(lambda x,y: x-y 0,[3,5,6],[1,5,8] ) print(list(new_list))
运行结果为:
[True, False, False]
Python reduce()函数reduce() 函数通常用来对一个集合做一些累积操作,其基本语法格式为:
reduce(function, iterable)
其中,function 规定必须是一个包含 2 个参数的函数;iterable 表示可迭代对象。
注意,由于 reduce() 函数在 Python 3.x 中已经被移除,放入了 functools 模块,因此在使用该函数之前,需先导入 functools 模块。
【例 5】计算某个列表元素的乘积。
import functools listDemo = [1, 2, 3, 4, 5] product = functools.reduce(lambda x, y: x * y, listDemo) print(product)
运行结果为:
120
通常来说,当对集合中的元素进行一些操作时,如果操作非常简单,比如相加、累积这种,那么应该优先考虑使用 map()、filter()、reduce() 实现。另外,在数据量非常多的情况下(比如机器学习的应用),一般更倾向于函数式编程的表示,因为效率更高。
当然,在数据量不多的情况下,使用 for 循环等方式也可以。不过,如果要对集合中的元素做一些比较复杂的操作,考虑到代码的可读性,通常会使用 for 循环。
23037.html
python相关文章
- Python求逆矩阵_3x3下三角矩阵求逆矩阵
- python的安装教程_Python的安装
- python anaconda和pycharm的区别_质量度三者关系
- 哪些软件是python编写出来的_用Python编程需要什么软件?
- python中矩阵的转置_[转]Python中的矩阵转置[通俗易懂]
- python filelock 文件锁_详解进程文件锁FileLock
- python最好的开发工具_Python编译器
- Python抓取数据_python抓取游戏数据
- python lambda表达式 if_Python学习-lambda表达式
- Python保存json_python保存json文件
- python deepcopy函数_Python deepcopy
- 【Python常用函数】一文让你彻底掌握Python中的Map函数
- Python应用之猜不到的鲁迅先生
- python多线程并发采集黄金走势数据
- python-Python与SQLite数据库-SQLite数据库的基本知识(二)
- python-Python与SQLite数据库-处理SQLite查询结果(二)
- python-Python与PostgreSQL数据库-使用Python执行PostgreSQL查询(一)
- Python函数值传递和引用传递(包括形式参数和实际参数的区别)
- Go语言sync.Map(在并发环境中使用的map)
- python获得linux物理内存大小详解编程语言
- python递归删除指定目录详解编程语言
- Linux系统快速运行Python脚本(linux运行python脚本)
- 开发Linux下Python编程:实现自己的开发梦想(linux下python)
- Python实例:贪吃蛇游戏
- Oracle Map映射从实施到实现(oracle map映射)
- python编程-将Python程序转化为可执行程序[整理]