Python/filter、map、reduce的应用

Python中filter、map、reduce应用


一、理解迭代器

  迭代器迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

1.1、map()

  返回一个迭代器,该迭代器将函数应用于iterable的每一项,生成结果。如果传递了额外的可迭代参数,函数必须接受那么多参数,并并行地应用于所有可迭代的项。对于多个迭代器,当最短的迭代器耗尽时,迭代器停止。对于函数输入已经安排为参数元组的情况,可能看了以上解释,乍一眼看上去,可能狗屁不通,后续会介绍迭代器、生成器以及可迭代对象的一些概念。

1.2、map()的用法

  在使用map之前,首先了解iterable是什么意思。 其实我们在这里可以把iterable当做一个列表,现在只需要知道iterable是一个列表,一个序列就可以了,它能自动的把序列中的每一个值映射到相应的函数中,最后得到值。接下来看看map在python中的语法:

map(function, iterable, ...)
例1:

  例如,现在有一个列表,那么列表就是一个序列,可以理解为:iterable,在map语法中是 map(function, iterable)现在就知道map(function, 列表) 的这么一个语法。目前有一个numbers的列表 其中有1、3、5、7、9 数字。 要求把13579变成246810 最后传入到新的列表并输出如下:

numbers = [1, 3, 5, 7, 9] # 定义一个列表中有1、3、5、7、9
result_numbers = [] # 定义一个空的列表,来接收最后的结果
for i in numbers: # 通过for i in 循环 numbers 列表 得到每一个数字
    number = i + 1 # 每一个数字都+1 赋值给新的number变量 
    result_numbers.append(number) # 通过result_numbers.append 添加到新的列表

print(result_numbers)  # 最后输出打印结果
>>> [2, 4, 6, 8, 10]
通过map来实现:
numbers = [1, 3, 5, 7, 9]  # 定义一个列表中有1、3、5、7、9
def add(x): # 定义一个add函数,x为值
    return x + 1 # 返回一个 x + 1

print(list(map(add, numbers))) # map(add:函数的功能, numbers:一个序列,列表)
>>> [2, 4, 6, 8, 10]

  首先定义了一个numbers的列表里面有1、3、5、7、9 接下来定义了一个函数为add 在后面括号中添加一个值。首先我们在调用函数的时候,我们要传一个值得时候我们需要在函数参数中定义一个值,如果两个就定义两个值。此函数的功能就是x + 1 那么x就是一个值,那么这个值来源于numbers列表中的值。当我们使用map方法,第一个参数为function也就是函数,第二个参数为序列也可以理解为列表。 完全可以理解,将numbers列表中的值,一一的取到add函数中 最后通过x + 1的功能得出最后的结果。

map例2:
name = ("yankerp", "zhangsan", "lisi")
def upt(x):
    return x.upper()

print(tuple(map(upt, name)))
>>> ('YANKERP', 'ZHANGSAN', 'LISI')

2.1、filter()

  简单理解,filter就是一个过滤的意思,也就是添加一些筛选条件,从iterable的那些元素构造一个迭代器,函数返回true。iterable可以是序列,支持迭代的容器,也可以是迭代器。如果功能是None,同样的函数被假定,那就是,所有的元素迭代是假的被删除。filter语法如下:

filter(function, iterable)

例如:我们在一个列表中有很多不同的数字。要求找到大于50 小于 70的数字。如下:

my_list = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16] # 定义一个数字列表
numbers = [] # 定义一个numbers空列表
for i in my_list: # 循环空列表的每一个值
    if 50 < i < 70: # 附加判断条件
        numbers.append(i) # 将条件成立的加入到新的列表中
        
print(numbers) # 最后输出结果
>>> [56, 67]
通过filter来实现:
my_list = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16] # 定义一个数字列表
def judge(x): # 定义一个judge函数,添加x参数
    if 50 < x < 70: # 定义判断条件
        return True # 若条件成立返回True 无找到就返回None

print(list(filter(judge, my_list))) # 输出最后的结果
>>> [56, 67]
filter例2:
name = ["yankerp", "yankai", "yanzan", "zhangsan", "lisi", "wangwu"]
import re
def seach(x):
    if re.search("yan", x):
        return True
print(list(filter(seach, name)))
>>> ['yankerp', 'yankai', 'yanzan']

3.1、reduce()

  是减少 缩小 降低的意思,应用功能的两个参数来累计的项目序列,从左至右,这样的顺序,以减少单个值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])计算((((1+2)+3)+4)+5)。左参数x是累加值,右参数y是序列的更新值。如果存在可选的初始值设定项,则它将位于计算中序列的项之前,并在序列为空时用作默认值。如果未给出初始化程序且序列仅包含一个项目,则返回第一个项目。
例如:目前有一个数字列表,需要把每个数字都+ - * / 如下:

from functools import reduce
numbers = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16]
Count = 0
for i in numbers:
    Count+=i
print(Count)
>>> 405
reduce例1:
from functools import reduce
numbers = [2, 3, 23, 34, 45, 56, 67, 88, 21, 22, 13, 15, 16]
def add(x, y):
    return x+y
reduce(add, numbers)
>>> 405
reduce例2:
from functools import reduce
numbers = ['a','b','x']
def add(x, y):
    return x+y
reduce(add, numbers)
>>> 'abx'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章