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 #接受的初始值