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]))