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

Python 2.7
IDE Pycharm 5.0.3


为什么要用Lambda

一句话,因为懒,懒得新建一个一次性使用函数,懒得想函数名,想要更高逼格的pythontic!

比如说,我要实现一个x*y+x的功能,没有lambda之前我要这样做:

#定义一个函数
def Whatever(x,y):
    return x*y+x

#调用函数   
f = Whatever(22,3)
print f
#88

而采用lambda之后呢,一行输出!

print (lambda x,y:x*y+x)(x=22,y=3)

这里解释一下,我理解的x,y相当于定义的变量名字,而“:”之后的一组运算即是lambda将要返回的一个值,有点像列表推导式哈,还可以这样使用lambda

f = lambda x,y:x*y+x
print f(22,3)

为什么要用map

继续上一个例子,用lambda的时候

print (lambda x,y:x*y+x)(x=22,y=3)

这样写是不是很难看呢,如果把(x=22,y=3)这个也能写进一个括号里,那该多好呢,所以就有了map

print map(lambda x,y:x*y+x,[22],[3])
#[88]

其中第一个[22]对应的就是x的取值列表了,而[3]则是y的取值列表,这些都是根据lambda x,y的顺序进行的,如果颠倒呢

print map(lambda y,x:x*y+x,[22],[3])
#[69]

所以说,老老实实按照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字符串的拼接啦就是!

这也就解决了,一个函数传参数只能传一组的尴尬,如果你想测试

def Whatever(x,y):
    return x*y+x

这里的x,y为很多组的时候,怎么办呢,这时候map也就排上用场

print map(Whatever,[22,3," ","MrLevo"],[3,22,3,2])
#[88, 69, '    ', 'MrLevoMrLevoMrLevo']

有几组来几组,老纸一块测了!

注意:赋值要对应,x给了4个,y给3个可不行。
注意:在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce.
注意:当lambda这个function不存在怎么办呢,为None怎么办呢?

print map(None,[22,3," ","MrLevo"],[3,22,3,2])
#[(22, 3), (3, 22), (' ', 3), ('MrLevo', 2)]

其实map就是两个列表中各取一个数放到function里面计算而已


为什么要用reduce

一句话,就是简化递归,迭代等运算
比如说,你要实现n!你选择怎么办呢?

  • 方法一:for循环
def Factorial(n):
    result=1
    for i in range(1,n+1):
        result = result*i
    return result

result = Factorial(5)
print result
#120
  • 方法二,递归法
def Factorial(n):
    if n==1 or n==0:
         return 1
    return n*Factorial(n-1)

result = Factorial(5)
print result
#120

上面的还要写函数,好麻烦呢,怎么办呢,map说,谁爱上谁上,老纸不干了!reduce笑笑不说话,并且抛出了代码

print reduce(lambda x,y:x*y,[1,2,3,4,5])
#120

简单轻松加愉快,这里解释一下reduce的流程,先取第一第二个数作为x,y然后进行计算,计算出来的数呢,赋给x,然后取第三个数赋给y,再用x,y做计算,再算完的数,又当做下一轮的x,再从列表中取一个数当做y,再来,就是不断迭代的过程!

  • 步骤一:x=1,y=2
  • 步骤二:x = xy = 12=2
  • 步骤三:x=2 , 取出y=3
  • 步骤四:x=2*3=6
  • 步骤五:x=6 ,取出y=4
  • 步骤六:x = x*y = 24
  • 步骤七:x=24,取出y=5
  • 步骤八:x = 24*5=120
  • 结束

还是不了解的话可以用visualize进行单步模拟

map表示不服,说道要是阶乘是250!呢,怎么办,不会要这么写到[1,2,3,,,,,,,250]把,于是reduce叫来了列表推导式。。。

print reduce(lambda x,y:x*y,[x for x in range(1,6)])
#120

至于列表推导式是什么,一个例子,还是懒

print [i for i in range(1,6)]
#[1, 2, 3, 4, 5]

它其实相当于这个

result = []
for i in range(1,6):
    result.append(i)
print result
##[1, 2, 3, 4, 5]

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:不行,这个规则太简单,我们,我们,我们来筛选非空白字符['MrLevo', '', '520', None, ' ']把它筛选成['MrLevo', '520']哼!

列表推导式呵呵:print [x for x in ['MrLevo', '', '520', None, ' '] if x and x.strip()]
filter,map,reduce一脸懵逼。。。。。

filter:我,你,我,额。。。


这里写图片描述

列表推导式:算了,这个我不会,你说吧filter。

委屈的filter:

def NoEmpty(x):
    if x and x.strip():
        return x

print filter(NoEmpty,['MrLevo', '', '520', None, ' '])

filter(function, sequence),作用是按照所定义的函数过滤掉列表中的一些元素。删选规则复杂一点,需要用函数定义那种复杂,可以用filter,不然还是列表推导式把,就是对其他程序员可能不太友好如果列表推导式太长的话。


最后

在leetcode上刷到一道题,easy难度,我的方法击败了百分之七的人,哭,,,,,看了击败百分之五十的人的答案,只有两行,哎,要是最强的,估计,一行?复杂度肯定最低。有兴趣的可以看看-290. Word Pattern


致谢

@Alex--Python一些特殊用法(map、reduce、filter、lambda、列表推导式等)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容