1.lambda()---匿名函数,可以把函数压缩在一行里搞定:
- 平常的作法:
def add(x):
x+=3
return x
numbers=range(10)
new_numbers=[]
for i in numbers:
new_numbers.append(add(i))
print(new_numbers)
>>>
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
# 或者这么做
numbers=[i+3 for i in range(10)]
print(numbers)
>>>
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
- 使用lambda():
lam=lambda x:x+3
#lam=lambda x:x+=3 这种语法是错的
numbers=range(10)
new_numbers=[]
for i in numbers:
new_numbers.append(lam(i))
print(new_numbers)
>>>
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
- 或者这样:
add=lambda x,y:x+y
print(add(3,4))
>>>7
# 看样子,还是赋值给变量看起来比较舒服
print((lambda x:x**2)(5))
>>>25
- lambda()使代码看起来更简洁:
squares=[lambda x:x,lambda x:x**2,lambda x:x**3,lambda x:x**4]
for i in squares:
print(i(5))
>>>
5
25
125
625
记住,lambda是一个单行的函数.之前也有这样的单行函数:
def function():pass
2.map(func,seq)---把seq序列的值依次取出来,塞进函数func里面,再返回func计算的结果:
def add(x):
x+=3
return x
numbers=[1,2,3,4,5,6,7]
#print(list(map(add,numbers)))
print(list(map(lambda x:x+3,numbers)))
>>>
[4, 5, 6, 7, 8, 9, 10]
在应用中,map的所能实现的,也可以用别的方式实现。比如:
>>> items = [1,2,3,4,5]
>>> squared = []
>>> for i in items:
... squared.append(i**2)
...
>>> squared
[1, 4, 9, 16, 25]
>>> def sqr(x): return x**2
...
>>> map(sqr,items)
[1, 4, 9, 16, 25]
>>> map(lambda x: x**2, items)
[1, 4, 9, 16, 25]
>>> [ x**2 for x in items ] # 推荐这个,一般情况下速度足够快,而且可读性强
[1, 4, 9, 16, 25]
- 如果参数很多,则对那些参数并行执行function:
>>> lst1 = [1, 2, 3, 4, 5]
>>> lst2 = [6, 7, 8, 9, 0]
>>> map(lambda x, y: x + y, lst1, lst2) #将两个列表中的对应项加起来,并返回一个结果列表
[7, 9, 11, 13, 5]
- 上面这个例子如果用for循环来写,还不是很难,如果扩展一下,下面的例子用for来改写,就要小心了:
>>> lst1 = [1, 2, 3, 4, 5]
>>> lst2 = [6, 7, 8, 9, 0]
>>> lst3 = [7, 8, 9, 2, 1]
>>> map(lambda x,y,z: x+y+z, lst1, lst2, lst3)
[14, 17, 20, 15, 6]
这才显示出map的简洁优雅。
总而言之,map()---优雅处理序列和函数的映射关系
zip()---用来处理序列和序列之间关系的
3.reduce()---横向逐个运算,map()是上下运算:
# reduce
>>> from functools import reduce
>>> reduce(lambda x,y:x+y,[1,2,3,4,5])
15
>>> list1=[1,2,3,4,5]
>>> list2=[5,4,3,2,1]
>>> list(map(lambda x,y:x+y,list1,list2))
[6, 6, 6, 6, 6]
4.filter()---过滤器:
filter(function or None, iterable) --> filter object
传入函数和序列,筛选出需要的数据(这里的函数当作过滤的规则)
>>> number=range(-5,5)
# 筛选大于0的数据
>>> list(filter(lambda x:x>0,number))
[1, 2, 3, 4]
# 筛选除了"i"的所有字母
>>> list(filter(lambda x:x!='i','qiwsir'))
['q', 'w', 's', 'r']
网友评论