每天一个Python小技巧(10).md

2022/6/13 Python小技巧

大家好,我是米洛,求三连!求关注米洛的测开日记!

# 简单回忆

上篇我们讲了filter的用法,仍然有同学不服,觉得列表推导式才是王道!别急,今天的小丑皇(reduce)会让你们难受的!今天我们就来讲讲这对连体婴儿

# map

map(还有reduce)和filter一样,都是根据你传入的方法,对你的可迭代对象进行批量操作。

比如上篇说过,捞出所有大于0的数字。

这篇我们的需求也类似,我们需要给每个元素加一个前缀: wqrf-,代表这些数据属于wqrf

二三流青年的解法就不详细说明了,我们来看看map的用法:

a = ["测试开发干货", "测试开发水货", "测试开发杂货", "测试开发笋货"]
data = list(map(lambda x: f"wqrf-{x}", a))
1
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)
1
2
3
4
5
6

数学方法

这已经在采用数学方法了,先倒序排列,然后第一个数就是个位,8 ** 10的0次幂,接着是到了十位,8 + 7 * 10的一次幂。

这样最终加起来就是那个数字了。但是第一我是觉得比较麻烦,第二是我觉得这些不够优雅

# reduce登场

按照我们刚才的说法, 我们用reduce,第一个数字 X 10+第二个数字,以此类推,是不是就能拿到最终结果了呢?

试试就试试:

可以看到结果完全正确,符合预期

这里需要注意的是,因为reduce常用度较低,所以把它包装到了functools里面,如果想尝鲜的铁子们,可以引入一下再用。

from functools import reduce
1

今天的内容就到这里了,下一篇技巧君会带大家来到异步文件读取的世界,结合最近做的一个需求展开细🔒~

有喜欢我这个主题的(我自己做的),请发消息(点个赞)给我,我告诉你们怎么用~