[python]:filter,map,reduce函数使用总结

filter(func, seq)

调用一个布尔函数 func 来迭代遍历每个 seq 中的元素; 返回一个使 func 返回值为 ture 的元素的序列

filter 函数为已知的序列的每个元素调用 给定布尔函数。每个 filter 返回的非零(true)值元素添加到一个列表中。返回的对象是一个从原 始队列中“过滤后”的队列

python代码写filter()函数,代码如下:

def filter(bool_func,seq):
    filtered_seq = [] # 存放过滤完元素的列表
    for eachitem in seq:
        if bool_func(each_item): # 如果过滤函数为真,则将元素加入filter_seq列表中
            filtered_seq.append(each_item)
    return filtered_seq

实例:

from random import randint

# 从1~99中取出随机数目奇数

def odd(n):
    if n % 2:
        return n

ALL_NUMS = []

for _ in range(9):
    ALL_NUMS.append(randint(1,99))

print(ALL_NUMS)    

print(list(filter(odd,ALL_NUMS)))

除此,还可以将odd()改换成lambda表达式:

from random import randint

# 从1~99中取出随机数目奇数

def odd(n):
    if n % 2:
        return n

ALL_NUMS = []

for _ in range(9):
    ALL_NUMS.append(randint(1,99))

print(ALL_NUMS)  
print(list[filter(lambda n:n % 2,ALL_NUMS)])

map(func, seq1[,seq2...])

将函数 func 作用于给定序列(s)的每个元素,并用一个列表来提 供返回值;如果 func Nonefunc 表现为一个身份函数,返回 一个含有每个序列中元素集合的n个元组的列表。

python代码写map()函数,代码如下:

def map(func,seq):
    maped_seq = []
    for eachitem in seq:
        maped_seq.append(func(eachitem))
    return maped_seq

map() 处理一个序列

# 构建l列表中每个元素加2的列表
l = [1,2,3,4,5,6,7,8,9]
print(list(map(lambda x : x + 2,l)))
# 对应的列表生成式
print([x + 2 for x in l])
# out: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

# 构建0~9 每个元素的取平方列表
print(list(map(lambda x: x**2,range(10))))
# 对应的列表生成式
print([x**2 for x in range(10)])
# out:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

map() 处理多个序列

map()处理多个序列的受,那么 map()会并行地迭代每个序 列。在第一次调用时, map()会将每个序列的第一个元素捆绑到一个元组中, 将 func 函数作用到 map()上, 当 map()已经完成执行的时候,并将元组的结果返回到 mapped_seq 映射的,终以 整体返回的序列上

# 构建两个列表相同索引上的元素的相加
list0 = [1,3,5]
list1 = [2,4,6]
print(list(map(lambda x, y: x + y, list0, list1)))
# 对应的列表生成式
print([list0[i] + list1[i] for i in range(len(list0))])
# out: [3, 7, 11]

# 构建两个列表同一索引位置上元素的和差
print(list(map(lambda x,y: (x + y,x -y),list0,list1)))
# 对应的列表生成式
print([(list0[i] + list1[i],list0[i] - list1[i]) for i in range(len(list0))])
# out: [(3, -1), (7, -1), (11, -1)]

functools.reduce(function, iterable[, initializer])

将两个参数的 function 从左至右积累地应用到 *iterable* 的条目,以便将该可迭代对象缩减为单一的值。 例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 是计算 ((((1+2)+3)+4)+5) 的值。 左边的参数 x 是积累值而右边的参数 y 则是来自 *iterable* 的更新值。 如果存在可选项 initializer,它会被放在参与计算的可迭代对象的条目之前,并在可迭代对象为空时作为默认值。 如果没有给出 initializer 并且 *iterable* 仅包含一个条目,则将返回第一项

python代码写reduce()函数,代码如下:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

实例:

from functools import reduce

# 求一个序列之和
print(reduce(lambda x,y: x + y,[1,3,5,7,9]))

# 将一个[1,3,5,7,9]中元素合并成一个数13579
print(reduce(lambda x,y: x * 10 + y,[1,3,5,7,9]))

引用
[1]:python核心编程
[2]:https://docs.python.org/zh-cn/3/library/functools.html?highlight=reduce#functools.reduce
[3]:https://www.liaoxuefeng.com/wiki/1016959663602400/1017329367486080

posted @ 2020-07-15 16:46  一番星  阅读(240)  评论(0)    收藏  举报