Python filter,map,lambda,reduce,列表解析

filter用法 filter(func,seq)

将seq的元素逐一代入func,通过func的返回值来判断是保留还是过滤

1 >>> def foo(x):
2     return x>3
3 
4 >>> filter(foo,range(6))
5 [4, 5]

>>> filter(lambda x:x>3,range(6))
[4, 5]

6 #注意只需要写函数名,不带参数

map用法map(func/lambda,seq)

通过函数对队列中的每个元素进行操作,元素替换成返回值,注意是生成一个新的序列,原来的序列不会变化

>>> map(lambda x:x*2,range(6))
[0, 2, 4, 6, 8, 10]
 #同样的,这里要么是lambda表达式,要不就是是个函数名
>>> a
[1, 2, 3, 4, 5, 6]
>>> map(foo,a)
[False, False, False, True, True, True]
>>> a
[1, 2, 3, 4, 5, 6]
#foo是判断x是否大于三,是返回True,否返回false
对多个序列的操作

>>> map(lambda x,y:x+y,range(4),range(5))


Traceback (most recent call last):
File "<pyshell#84>", line 1, in <module>
map(lambda x,y:x+y,range(4),range(5))
File "<pyshell#84>", line 1, in <lambda>
map(lambda x,y:x+y,range(4),range(5))
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
>>> map(lambda x,y:x+y,range(4),range(4))
[0, 2, 4, 6]

 

列表解析

[表达式/函数,for循环]

>>> [x**2 for x in range(6)]
[0, 1, 4, 9, 16, 25]
>>> [a**2 for x in range(6)]
[1, 1, 1, 1, 1, 1]
>>> #可见当你写一个for循环中无关的变量时,它仅仅重复表达式的结果
>>> [foo(x) for x in range(6)]
[False, False, False, False, True, True]
#这里的函数要带括号,foo同上
>>> [lambda x:x**2 for x in range(6)]
[<function <lambda> at 0x01DE8870>, <function <lambda> at 0x01DE8830>, <function <lambda> at 0x01DE88F0>, <function <lambda> at 0x01DE8930>, <function <lambda> at 0x01DE8970>, <function <lambda> at 0x01DE89B0>]
>>> [(lambda x:x**2)(x) for x in range(6)]
[0, 1, 4, 9, 16, 25]
#同样你需要把lambda看作是函数名,或者返回值
>>> [x**2 for x in range(6) if x**2>9]
[16, 25]
>>> [(x**2,y**3) for x in range(4) for y in range(3) if x>0 and y>0]
[(1, 1), (1, 8), (4, 1), (4, 8), (9, 1), (9, 8)]
>>> #将后面的for看成嵌套的,还有前面的表达式记得加括号

reduce 对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用

>>> reduce(lambda x,y:x+y,range(1,101))
5050
>>> #reduce一定是接受一个二元函数,比如上面就是 (((1+2)+3)+4)+...
>>> reduce(lambda x,y:x+y,range(1,101),100)
5150
#接受的初始值
原文地址:https://www.cnblogs.com/dream-for/p/5197501.html