Python札记25_reduce、filter、zip

在上一篇[Python札记24_lambda、map]札记中主要学习了lambdamap函数,本文中主要讲解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)

Python札记25_reduce、filter、zip_第1张图片
image.png

官方解释
图片发自App

注意mapreduce的区别

  • map函数得到是列表list
  • reduce得到的是一个值value
list1 = list(range(1, 10))
list2 = list(range(1, 10))[::-1]    #实现一次翻转
list(map(lambda x, y: x+y, list1, list2))   # 将两个列表中的元素上下对应相加
image.png
reduce(lambda x, y: x+y, list1)   # 从1+2+....+9=45
image.png

高斯求和用reduce函数简单实现

list1 = range(1, 101)
reduce(lambda x, y: x+y, list1)
Python札记25_reduce、filter、zip_第2张图片
image.png

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]
Python札记25_reduce、filter、zip_第3张图片
image.png
[list(filter(lambda x: x!="e", "Peter"))]   # 选择不是e的字符串
image.png
list(filter(lambda x: x%10 == 0, range(1,101)))
image.png

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))
Python札记25_reduce、filter、zip_第4张图片
image.png

zip特点

  • 每个可迭代的对象依次取出元素自动匹配
  • 将多余的项进行抛弃(“zhejiang”)
  • list中的每个元素为元组tuple

zip函数中能够传入(*iterable)形式的参数,通过参数收集的方式

list1 = [(1, 2), (3, 4), (5, 6)]
x, y = zip(*list1)
Python札记25_reduce、filter、zip_第5张图片
image.png

利用zip函数实现矩阵转置:

list2 = [[1, 2], [3, 4], [5, 6]]
list(zip(*list2))
image.png

酷炫的例子:如何快速求出两个列表中的对应位置的较大值?

a = [1, 2, 3, 4, 5]
b = [2, 3, 2, 4, 8]
list(map(lambda x: max(x), zip(a, b)))
Python札记25_reduce、filter、zip_第6张图片
image.png

运用了lambda,map,zip三个函数,理解如下:

  • map函数的第一个参数是一个求最大值的函数,左边红框
  • map函数的第二个参数是zip函数的结果,右边红框
  • map函数的含义:第二个参数可迭代对象执行第一个参数即函数的功能
  • zip函数的结果是a和b中对应元素组成的列表,图下所示:


    image.png

你可能感兴趣的:(Python札记25_reduce、filter、zip)