使用reducer函数python感受_[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为 None, func 表现为一个身份函数,返回 一个含有每个序列中元素集合的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]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值