Python 2.7 为什么要用Lambda
比如说,我要实现一个 #定义一个函数def Whatever(x,y): return x*y+x#调用函数 f = Whatever(22,3)print f#88
而采用lambda之后呢,一行输出!
这里解释一下,我理解的x,y相当于定义的变量名字,而“:”之后的一组运算即是lambda将要返回的一个值,有点像列表推导式哈,还可以这样使用lambda f = lambda x,y:x*y+xprint f(22,3)
为什么要用map继续上一个例子,用lambda的时候
这样写是不是很难看呢,如果把 print map(lambda x,y:x*y+x,[22],[3])#[88]
其中第一个[22]对应的就是x的取值列表了,而[3]则是y的取值列表,这些都是根据lambda x,y的顺序进行的,如果颠倒呢
所以说,老老实实按照lambda的规则来咯,还有就是map强大就在于,它返回的是一个列表,你可以把它想成一个for循环,它不断从列表中取值,然后交给lambda,然后得到结果后返回列表存储,莱格利兹 print map(lambda x,y:x*y+x,[22,3,' ','MrLevo'],[3,22,3,2])#[88, 69, ' ', 'MrLevoMrLevoMrLevo']
很厉害对不对,字符串,空格,都是可以传递的对象,比如拿MrLevo来说,相当于x=MrLevo,y=2,所以经过计算,MrLevo*2+MrLevo=MrLevoMrLevoMrLevo字符串的拼接啦就是! 这也就解决了,一个函数传参数只能传一组的尴尬,如果你想测试
这里的x,y为很多组的时候,怎么办呢,这时候map也就排上用场 print map(Whatever,[22,3,' ','MrLevo'],[3,22,3,2])#[88, 69, ' ', 'MrLevoMrLevoMrLevo']
有几组来几组,老纸一块测了! 注意:赋值要对应,x给了4个,y给3个可不行。
其实map就是两个列表中各取一个数放到function里面计算而已
map(lambda x,y:(x,y*2),[('a',1)],[('b',2),('c',3)])# [(('a', 1), ('b', 2, 'b', 2)), (None, ('c', 3, 'c', 3))]
为什么要用reduce一句话,就是简化递归,迭代等运算
def Factorial(n): if n==1 or n==0: return 1 return n*Factorial(n-1)result = Factorial(5)print result#120
上面的还要写函数,好麻烦呢,怎么办呢,map说,谁爱上谁上,老纸不干了!reduce笑笑不说话,并且抛出了代码
简单轻松加愉快,这里解释一下reduce的流程,先取第一第二个数作为x,y然后进行计算,计算出来的数呢,赋给x,然后取第三个数赋给y,再用x,y做计算,再算完的数,又当做下一轮的x,再从列表中取一个数当做y,再来,就是不断迭代的过程!
还是不了解的话可以用visualize进行单步模拟 map表示不服,说道要是阶乘是250!呢,怎么办,不会要这么写到[1,2,3,,,,,,,250]把,于是reduce叫来了列表推导式。。。 print reduce(lambda x,y:x*y,range(1,6))#120
至于列表推导式是什么,一个例子,还是懒
它其实相当于这个 result = []for i in range(1,6): result.append(i)print result##[1, 2, 3, 4, 5]
关于列表推导式,还可以传多个参数组成的元组集合,注意多元素的时候相当于嵌套循环,几个元素就几层循环 l1 = [(i,j) for i in range(4) for j in range(3) if j not in [1]]print l1# [(0, 0), (0, 2), (1, 0), (1, 2), (2, 0), (2, 2), (3, 0), (3, 2)]l2 = [[i,j] for i in range(3) for j in range(3) if j not in [1]]print l2# [[0, 0], [0, 2], [1, 0], [1, 2], [2, 0], [2, 2]]l3 = [i+j for i in [1,2,3,4] for j in [5,6,7,8] ]print l3# [6, 7, 8, 9, 7, 8, 9, 10, 8, 9, 10, 11, 9, 10, 11, 12]
对于轻量级循环,可尽量使用列表推导式,熟练使用列表推导式可以很多情况下代替map,filter等
Filter表示不服你们一个个都传值,有能耐做筛选啊,用能耐来传布尔啊,来选一组数的奇数,有谁不服?不用多,就[1,2,3,4,5]那小子,就筛你! 列表推导式笑了:拿好不谢 print [x for x in range(1,6) if x%2==1]#[1, 3, 5]
filter,map,reduce一脸懵逼。。。。。 列表推导式呵呵: filter:我,你,我,额。。。 列表推导式:算了,这个我不会,你说吧filter。 委屈的filter:
最后在leetcode上刷到一道题,easy难度,我的方法击败了百分之七的人,哭,,,,,看了击败百分之五十的人的答案,只有两行,哎,要是最强的,估计,一行?复杂度肯定最低。有兴趣的可以看看-290. Word Pattern 致谢 |
|