最简单的理解lambda,map,reduce,filter,列表推导式

JessicaTrom 8年前
   <h2><strong>为什么要用Lambda</strong></h2>    <p>一句话,因为懒,懒得新建一个一次性使用函数,懒得想函数名,想要更高逼格的pythontic!</p>    <p>比如说,我要实现一个 x*y+x 的功能,没有lambda之前我要这样做:</p>    <pre>  <code class="language-python">#定义一个函数  def Whatever(x,y):      return x*y+x    #调用函数     f = Whatever(22,3)  print f  #88</code></pre>    <p>而采用lambda之后呢,一行输出!</p>    <pre>  <code class="language-python">print (lambda x,y:x*y+x)(x=22,y=3)</code></pre>    <p>这里解释一下,我理解的x,y相当于定义的变量名字,而“:”之后的一组运算即是lambda将要返回的一个值,有点像列表推导式哈,还可以这样使用lambda</p>    <pre>  <code class="language-python">f = lambda x,y:x*y+x  print f(22,3)</code></pre>    <h2><strong>为什么要用map</strong></h2>    <p>继续上一个例子,用lambda的时候</p>    <pre>  <code class="language-python">print (lambda x,y:x*y+x)(x=22,y=3)</code></pre>    <p>这样写是不是很难看呢,如果把 (x=22,y=3) 这个也能写进一个括号里,那该多好呢,所以就有了 <strong> map </strong></p>    <pre>  <code class="language-python">print map(lambda x,y:x*y+x,[22],[3])  #[88]</code></pre>    <p>其中第一个[22]对应的就是x的取值列表了,而[3]则是y的取值列表,这些都是根据lambda x,y的顺序进行的,如果颠倒呢</p>    <pre>  <code class="language-python">print map(lambda y,x:x*y+x,[22],[3])  #[69]</code></pre>    <p>所以说,老老实实按照lambda的规则来咯,还有就是map强大就在于,它返回的是一个列表,你可以把它想成一个for循环,它不断从列表中取值,然后交给lambda,然后得到结果后返回列表存储,莱格利兹</p>    <pre>  <code class="language-python">print map(lambda x,y:x*y+x,[22,3," ","MrLevo"],[3,22,3,2])  #[88, 69, '    ', 'MrLevoMrLevoMrLevo']</code></pre>    <p>很厉害对不对, <strong> 字符串,空格,都是可以传递的对象 </strong> ,比如拿MrLevo来说,相当于x=MrLevo,y=2,所以经过计算,MrLevo*2+MrLevo=MrLevoMrLevoMrLevo字符串的拼接啦就是!</p>    <p>这也就解决了,一个函数传参数只能传一组的尴尬 ,如果你想测试</p>    <pre>  <code class="language-python">def Whatever(x,y):      return x*y+x</code></pre>    <p>这里的x,y为很多组的时候,怎么办呢,这时候map也就排上用场</p>    <pre>  <code class="language-python">print map(Whatever,[22,3," ","MrLevo"],[3,22,3,2])  #[88, 69, '    ', 'MrLevoMrLevoMrLevo']</code></pre>    <p>有几组来几组,老纸一块测了!</p>    <p><strong>注意:</strong>赋值要对应,x给了4个,y给3个可不行。</p>    <p><strong>注意:</strong>在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce.</p>    <p><strong>注意:</strong>当lambda这个function不存在怎么办呢,为None怎么办呢?</p>    <pre>  <code class="language-python">print map(None,[22,3," ","MrLevo"],[3,22,3,2])  #[(22, 3), (3, 22), (' ', 3), ('MrLevo', 2)]</code></pre>    <p>其实map就是两个列表中各取一个数放到function里面计算而已</p>    <h2><strong>为什么要用reduce</strong></h2>    <p>一句话,就是简化递归,迭代等运算</p>    <p>比如说,你要实现n!你选择怎么办呢?</p>    <ul>     <li> <p>方法一:for循环</p> </li>    </ul>    <pre>  <code class="language-python">def Factorial(n):      result=1      for i in range(1,n+1):          result = result*i      return result    result = Factorial(5)  print result  #120</code></pre>    <ul>     <li> <p>方法二,递归法</p> </li>    </ul>    <pre>  <code class="language-python">def Factorial(n):      if n==1 or n==0:           return 1      return n*Factorial(n-1)    result = Factorial(5)  print result  #120</code></pre>    <p>上面的还要写函数,好麻烦呢,怎么办呢,map说,谁爱上谁上,老纸不干了!reduce笑笑不说话,并且抛出了代码</p>    <pre>  <code class="language-python">print reduce(lambda x,y:x*y,[1,2,3,4,5])  #120</code></pre>    <p>简单轻松加愉快,这里解释一下reduce的流程,先取第一第二个数作为x,y然后进行计算,计算出来的数呢,赋给x,然后取第三个数赋给y,再用x,y做计算,再算完的数,又当做下一轮的x,再从列表中取一个数当做y,再来,就是不断迭代的过程!</p>    <ul>     <li> <p>步骤一:x=1,y=2</p> </li>     <li> <p>步骤二:x = x <em>y = 1</em> 2=2</p> </li>     <li> <p>步骤三:x=2 , 取出y=3</p> </li>     <li> <p>步骤四:x=2*3=6</p> </li>     <li> <p>步骤五:x=6 ,取出y=4</p> </li>     <li> <p>步骤六:x = x*y = 24</p> </li>     <li> <p>步骤七:x=24,取出y=5</p> </li>     <li> <p>步骤八:x = 24*5=120</p> </li>     <li> <p>结束</p> </li>    </ul>    <p>map表示不服,说道要是阶乘是250!呢,怎么办,不会要这么写到[1,2,3,,,,,,,250]把,于是reduce叫来了列表推导式。。。</p>    <pre>  <code class="language-python">print reduce(lambda x,y:x*y,[x for x in range(1,6)])  #120</code></pre>    <p><strong>至于列表推导式是什么,一个例子,还是懒</strong></p>    <pre>  <code class="language-python">print [i for i in range(1,6)]  #[1, 2, 3, 4, 5]</code></pre>    <p>它其实相当于这个</p>    <pre>  <code class="language-python">result = []  for i in range(1,6):      result.append(i)  print result  ##[1, 2, 3, 4, 5]</code></pre>    <h2><strong>Filter表示不服</strong></h2>    <p>你们一个个都传值,有能耐做筛选啊,用能耐来传布尔啊,来选一组数的奇数,有谁不服?不用多,就[1,2,3,4,5]那小子,就筛你!</p>    <p>列表推导式笑了:拿好不谢</p>    <pre>  <code class="language-python">print [x for x in range(1,6) if x%2==1]  #[1, 3, 5]</code></pre>    <p>filter,map,reduce一脸懵逼。。。。。</p>    <p>filter:不行,这个规则太简单,我们,我们,我们来筛选非空白字符 ['MrLevo', '', '520', None, ' '] 把它筛选成 ['MrLevo', '520'] 哼!</p>    <p>列表推导式呵呵: print [x for x in ['MrLevo', '', '520', None, ' '] if x and x.strip()]<br> filter,map,reduce一脸懵逼。。。。。</p>    <p>filter:我,你,我,额。。。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/124431f8b2184256a36098ead70d1fd0.jpg"></p>    <p style="text-align:center">这里写图片描述</p>    <p>列表推导式:算了,这个我不会,你说吧filter。</p>    <p>委屈的filter:</p>    <pre>  <code class="language-python">def NoEmpty(x):      if x and x.strip():          return x    print filter(NoEmpty,['MrLevo', '', '520', None, ' '])</code></pre>    <p>filter(function, sequence),作用是按照所定义的函数过滤掉列表中的一些元素。删选规则复杂一点,需要用函数定义那种复杂,可以用filter,不然还是列表推导式把,就是对其他程序员可能不太友好如果列表推导式太长的话。</p>    <h2><strong>最后</strong></h2>    <p>在leetcode上刷到一道题,easy难度,我的方法击败了百分之七的人,哭,,,,,看了击败百分之五十的人的答案,只有两行,哎,要是最强的,估计,一行?复杂度肯定最低。</p>    <p> </p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/07737690901e</p>    <p> </p>