lambda s: s if len(s.strip())>0这样的为什么不行?
filter(lambda s: s if len(s.strip())>0,['test',None,'','str'])
这样为什么不行呢?提示语法错误SyntaxError: invalid syntax
讲解中也有用到if怎么就可以呢?
myabs = lambda x: -x if x < 0 else x
filter(lambda s: s if len(s.strip())>0,['test',None,'','str'])
这样为什么不行呢?提示语法错误SyntaxError: invalid syntax
讲解中也有用到if怎么就可以呢?
myabs = lambda x: -x if x < 0 else x
2017-05-10
我觉得是你缺少else 的表达式
你这种写法,翻译过来就是
if len(s.strip())>0:
return s
但是没有给出else的情况
按if语句的逻辑来讲,如果判断成果,则执行if,判断不成功,则不执行if,而且仅仅是不执行if,并不会自动return None,所以就会出现当if判断不成功时候,filter没有bool类型的返回值用来判断(在Python中,None、空列表[]、空字典{}、空元组()、0等一系列代表空和无的对象会被转换成False。除此之外的其它对象都会被转化成True。),所以会出现语法错误。
你把这句改成 lambda s : s if len(s.strip())>0 else None 就对了,意思就是当len(s.strip())>0时,返回s,否则返回None(bool判断为False)
但是现在给定的列表里['test',None,'','str']有[None],这个None并不是字符串类型,而python不允许有None.strip()这样的执行
所以要么你把列表中的None 删掉,要么就用 s and len(s.stirp())>0来增加对s 的判断
当None 赋值给s时, s本身就False了, False and *** (任何表达)都是False,这样就能同时判断s 和len(s)了
所以 按你的思路可以写成 lambda s: s if s and len(s.strip())>0 else None
而filter 函数本身就可以判断false 和 true
所以其实你直接给出 s and len(s.strip())>0 让filter判断就可以,true 就自动返回了 s ,false 就过滤掉了
我也是刚学到这,粗浅见解,希望大家讨论
举报