大家好,我是米洛,求三连!求关注
米洛的测开日记
!
# 简单回忆
上篇我们讲了filter
的用法,仍然有同学不服,觉得列表推导式
才是王道!别急,今天的小丑皇(reduce)会让你们难受的!今天我们就来讲讲这对连体婴儿
。
# map
map(还有reduce)和filter
一样,都是根据你传入的方法,对你的可迭代对象
进行批量操作。
比如上篇说过,捞出所有大于0的数字。
这篇我们的需求也类似,我们需要给每个元素加一个前缀: wqrf-
,代表这些数据属于wqrf
。
二三流青年的解法就不详细说明了,我们来看看map的用法:
a = ["测试开发干货", "测试开发水货", "测试开发杂货", "测试开发笋货"]
data = list(map(lambda x: f"wqrf-{x}", a))
2
简单解释一下,map的用法和filter类似,但是map传入的方法里面不再强制要求返回True/False,会根据你返回的值生成不同的值。
把传入的function理解为一个加工步骤
,比如批量给手机套个壳儿,这边的f"wqrf-{x}"就是把x加工为wqrf-x
。
f"{}"是一种新型写法,{}
里面可以写Python语句,非常方便好用
。
# reduce
接下来是我们最大的boss->reduce了。reduce理解起来比较怪异,它的参数类型也和其他2个类似,但是用起来却不大一样
。
- 首先它接受一个含2个参数的方法
- 其次,它返回的不是一个可迭代对象,而是一个具体的值
reduce是这样的功能,把可迭代对象里面的数据进行一个累积操作
。假设我们的方法是f:
reduce(f, [a,b,c,d,e])
那我们的执行结果就是:
f(f(f(f(a, b), c), d),e)
可以看到,f(a,b)的结果继续和c进行f
操作,之后和d进行f操作,直到迭代数据走完。
# 来看一个实用的场景
假设我有一个整数数组: [5,2,0,1,3,1,4,7,7,8]
我们要把它变成 5201314778
这个数字,想想这道菜该怎么做?
# 二流青年
Python
a = [5,2,0,1,3,1,4,7,7,8]
number = 0
for idx, n in enumerate(a[::-1]):
number += n * 10 ** idx
print(number)
2
3
4
5
6
这已经在采用数学方法了,先倒序排列,然后第一个数就是个位,8 ** 10的0次幂,接着是到了十位,8 + 7 * 10的一次幂。
这样最终加起来就是那个数字
了。但是第一我是觉得比较麻烦,第二是我觉得这些不够优雅
。
# reduce登场
按照我们刚才的说法, 我们用reduce,第一个数字 X 10+第二个数字,以此类推,是不是就能拿到最终结果
了呢?
试试就试试:
这里需要注意的是,因为reduce常用度较低,所以把它包装到了functools里面,如果想尝鲜的铁子们,可以引入一下再用。
from functools import reduce
今天的内容就到这里了,下一篇技巧君会带大家来到异步文件读取
的世界,结合最近做的一个需求展开细🔒~
有喜欢我这个主题的(我自己做的),请发消息(点个赞
)给我,我告诉你们怎么用~