在上一篇[Python札记24_lambda、map]札记中主要学习了
lambda
和map
函数,本文中主要讲解reduce、filter、zip
的相关知识。
reduce
在Python3中reduce
已经被转移到functools
模块里面了,使用的时候需要进行导入:
from functools import reduce
- 两个参数 reduce(function, seq)
- 执行:从左到右根据函数一次执行
- 返回值是一个
value
看下官方的例子:
from functools import reduce
list1 = range(1, 6) # [1,2,3,4,5]
reduce(lambda x,y: x+y, list1)
官方解释
注意map
和reduce
的区别
-
map
函数得到是列表list
-
reduce
得到的是一个值value
list1 = list(range(1, 10))
list2 = list(range(1, 10))[::-1] #实现一次翻转
list(map(lambda x, y: x+y, list1, list2)) # 将两个列表中的元素上下对应相加
reduce(lambda x, y: x+y, list1) # 从1+2+....+9=45
高斯求和用reduce函数简单实现
list1 = range(1, 101)
reduce(lambda x, y: x+y, list1)
filter
filter翻译成中文就是过滤器
的意思,在Python
起到了过滤的作用,将满足条件的对象进行输出:
- 两个参数:函数+可迭代对象
- 满足条件的对象进行输出
看下filter函数的文档说明:
help(filter)
Help on class filter in module builtins:
class filter(object)
| filter(function or None, iterable) --> filter object # 两个参数:函数(可无)和可迭代对象,输出是筛选出来的对象
|
| Return an iterator yielding those items of iterable for which function(item)
| is true. If function is None, return the items that are true.
|
| Methods defined here:
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __iter__(self, /)
| Implement iter(self).
|
| __next__(self, /)
| Implement next(self).
|
| __reduce__(...)
| Return state information for pickling.
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
用具体的例子来说明:
filter函数
numbers = range(-5, 5)
list(filter(lambda x: x < 0, numbers)) # 选出小于0的数,返回列表list
列表解析式
x for x in range(-5, 5) if x < 0]
[list(filter(lambda x: x!="e", "Peter"))] # 选择不是e的字符串
list(filter(lambda x: x%10 == 0, range(1,101)))
zip
在Python札记13_内建函数zip、enumerate中已经对zip
函数进行了一个初步的介绍。在此更加深入地学习,达到温故而知新
的效果。zip
是一个内建函数,它的参数是可迭代对象,返回的是一个可迭代对象,可用list
查看其内容:
- 参数必须可迭代
- 输出可迭代对象
- 用list查看返回内容
help(zip) # 查看zip文档
Help on class zip in module builtins:
class zip(object)
| zip(iter1 [,iter2 [...]]) --> zip object # 参数有多个可迭代对象,返回的是zip对象
|
| Return a zip object whose .__next__() method returns a tuple where
| the i-th element comes from the i-th iterable argument. The .__next__()
| method continues until the shortest iterable in the argument sequence
| is exhausted and then it raises StopIteration.
|
| Methods defined here:
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __iter__(self, /)
| Implement iter(self).
|
| __next__(self, /)
| Implement next(self).
|
| __reduce__(...)
| Return state information for pickling.
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| __new__(*args, **kwargs) from builtins.type # 参数传入的形式有可以是两种,通过元组(*args)和字典(**kargs)形式的进行收集
| Create and return a new object. See help(type) for accurate signature.
- 通过例子来学习:
city = ["shenzhen", "changsha", "xiamen"]
province= ["guangdong", "hunan", "fujian", "zhejiang"]
for k, v in zip(city, province):
print((k, v))
list(zip(city, province))
zip特点
- 每个可迭代的对象依次取出元素自动匹配
- 将多余的项进行抛弃(“zhejiang”)
-
list
中的每个元素为元组tuple
zip函数中能够传入(*iterable)
形式的参数,通过参数收集的方式:
list1 = [(1, 2), (3, 4), (5, 6)]
x, y = zip(*list1)
利用zip函数实现矩阵转置:
list2 = [[1, 2], [3, 4], [5, 6]]
list(zip(*list2))
酷炫的例子:如何快速求出两个列表中的对应位置的较大值?
a = [1, 2, 3, 4, 5]
b = [2, 3, 2, 4, 8]
list(map(lambda x: max(x), zip(a, b)))
运用了lambda,map,zip
三个函数,理解如下:
- map函数的第一个参数是一个求最大值的函数,左边红框
- map函数的第二个参数是zip函数的结果,右边红框
- map函数的含义:第二个参数可迭代对象执行第一个参数即函数的功能
-
zip函数的结果是a和b中对应元素组成的列表,图下所示: