说说Python中的几个内建函数和表推导
admin
2023-07-30 22:21:45
0

Guido 非常不喜欢lambdamapfilter以及reduce这几个函数式编程中的函数,他比较喜欢使用表推导。而且出于防止滥用的考虑,lamdba在Python中”享受”到了在其他语言中未曾遇到过的限制。

我个人也很喜欢表推导,不仅仅是速度快,而且看上去更pythonic,那么,上面说的几个函数是不是都可以用表推导代替呢?来做个试验。

map

最基本的lambda就是一个接受参数返回值的匿名函数,没有涉及到枚举,就不单独说了。直接把lambdamap组合起来用,map的作用是将一个函数映射到一个枚举类型上。比如求一个列表中所有值的三次方:

123 >>>l = [1, 2, 3]>>>list(map(lambda x: x**3, l))[1, 8, 27]

使用表推导:

123 >>>l = [1, 2, 3]>>>[x**3 for x in l][1, 8, 27]

没什么好说的, 表推导更简洁。注意map外面用了list这是Python3中的语法,因为在Python3中,mapfilter都从返回列表更改为返回迭代器了。

filter

filter返回可迭代对象传入function后返回值为True的item。

例如,返回一个列表中只含有字母的元素:

123 >>>l = [\’H2O\’, \’HO\’, \’HNO3\’, \’CO\’]>>>list(filter(lambda x: x.isalpha(), l))[\’HO\’, \’CO\’]

使用表推导

123 >>>l = [\’H2O\’, \’HO\’, \’HNO3\’, \’CO\’]>>>[x for x in l if x.isalpha()][\’HO\’, \’CO\’]

嗯,看上去还是表推导更好看,更容易理解

reduce

reduce稍微复杂一些,reduce是一种类似向左折叠列表的操作,按照可迭代对象的顺序迭代调用函数。并且要求函数接受两个参数。如果有第三个参数,则表示初始值。

一个简单的例子,求10的阶乘:

123 >>>from functools import reduce    # 在Python3中,reduce()已经从全局命名空间中移除,放置在functools模块中>>>reduce(lambda x, y: x*y, range(1, 10))362880

reduce还接受第三个参数,作为初始值,有时候我们是一定需要第三个参数的,例如在一段文本中查找某个单词出现的次数:

1234 >>>from functools import reduce>>>sen = \’I scream, you scream, we all scream for ice-cream!\’>>>reduce(lambda a, x: a + x.count(\’cream\’), sen.split(), 0)4

如果不使用默认值,第一个值就是大写字母’I’,显然不能用于计算出现的次数。

这种左乘的迭代操作,并不适合用表推导来实现。

当然为了表示我对表推导的支持,我把上面第二个reduce例子,用表推导实现了一下:

123 >>>sen = \’I scream, you scream, we all scream for ice-cream!\’>>>[i for i in sen.split() if \’cream\’ in i].__len__()4

然而这并没有什么luan用,因为迭代求和求乘积的,还是reduce更好用。

apply

apply在Python3中已经被移除了,统一使用*将列表中的值作为参数传入。

结论

综上,表推导可以完全替代mapfilter并且更简洁,但是不适用于reduce


相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...