map()
映射,内置函数map()可以将一个函数依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果,map对象中每个元素是原序列中元素经过该函数处理后的结果,该函数不对原序列或迭代器对象做任何修改。
要注意,我们调用完map之后得到的结果不是一个list而是一个迭代器,我们想要获得完整的内容需要将它转化成list类型。
1、语法:
map(function, iterable, …)
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
2、案例:
2.1、提供了两个列表,对相同位置的列表数据进行相加
>>> result = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
>>> print(list(result))
[3, 7, 11, 15, 19]
2.2、单参数函数
>>> def add5(x):
return x+5
>>> list(map(add5, range(10))) #把单参数函数映射到一个序列的所有元素
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
2.3、接收2个参数的函数
>>> def add(x, y):
return x+y
>>> list(map(add, range(5), range(5,10))) #把双参数函数映射到两个序列上
[5, 7, 9, 11, 13]
>>> list(map(lambda x, y: x+y, range(5), range(5,10)))
[5, 7, 9, 11, 13]
3、应用场景:
1-10,对每个数字求平方
>>> result = map(lambda x:x**2,range(1,11))
>>> for n in result:
print(n)
reduce()
标准库functools中的函数reduce()可以将一个接收2个参数的函数以迭代累积的方式从左到右依次作用到一个序列或迭代器对象的所有元素上,并且允许指定一个初始值。
例如,
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
计算过程为((((1+2)+3)+4)+5),第一次计算时x为1而y为2,再次计算时x的值为(1+2)而y的值为3,再次计算时x的值为((1+2)+3)而y的值为4,以此类推,最终完成计算并返回((((1+2)+3)+4)+5)的值。
和map不同的是,reduce最后得到一个结果,而不是一个迭代器或者是list。
1、语法:
reduce(function, iterable[, initializer])
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
python3中将 reduce 放在functools模块中了
2、案例:
2.1、提供了两个列表,对相同位置的列表数据进行相加
from functools import reduce
>>> result = reduce(lambda x, y: x+y, [1,2,3,4,5])
>>> print(result)
15
2.2、两种方式对比
from functools import reduce
>>> def add(x, y):
return x+y
>>> seq = list(range(1, 10))
>>> reduce(add, seq)
45
>>> reduce(lambda x, y: x+y, seq) #使用lambda表达式实现相同功能
45
3、应用场景:
计算1-100的和
from functools import reduce
>>> result = reduce(lambda x, y: x + y, range(1, 101))
>>> print(result)
filter()
filter的英文是过滤,它的用法和map有些类似,通过编写一个函数来判断元素是否合法。通过调用filter,会自动将这个函数应用到容器当中所有的元素上,最后只会保留运行结果是True的元素,而过滤掉那些是False的元素。
1、语法:
filter(function, iterable)
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回True 或 False,最后将返回 True 的元素放到新列表中。
2、案例
得到列表中的奇数
#可以
>>> def is_odd(n):
return n % 2 == 1
>>> newlist = filter(is_odd, [1, 3, 2, 4, 5, 8])
>>> for n in newlist:
print(n)
1
3
5
#还可以
>>> arr = [1, 3, 2, 4, 5, 8]
>>> [i for i in arr if i % 2 > 0 ]
[1, 3, 5]
#最后可以使用filter 更方便
>>> list(filter(lambda x: x % 2 > 0, arr))
3、应用场景:
{“a”,”ab”,”abc”,”bc”,”cd”}输出含有C字符的元素
>>> result = filter(lambda x: "c" in x, {"a", "ab", "abc", "bc", "cd"})
>>> for n in result:
print(n)
bc
abc
cd