为了账号安全,请及时绑定邮箱和手机立即绑定

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

正在回答

3 回答

filter()函数中有两个参数,第一个参数应该是bool类型,s if len(s.strip())>0这样返回的是一个s,不是bool类型。

3 回复 有任何疑惑可以回复我~
#1

Junelan 提问者

soga 感谢
2017-05-11 回复 有任何疑惑可以回复我~
#2

SuperDi 回复 Junelan 提问者

按你这种分析把判断条件s and len(s.strip()) > 0改为len(s.strip()) > 0 应该也是一样的,但是没有输出结果了,Why?
2017-06-26 回复 有任何疑惑可以回复我~
#3

迷途归来 回复 SuperDi

我按照你的改法 lambda: x:len(x.strip())>0 是可以输出正确的结果的啊
2017-07-04 回复 有任何疑惑可以回复我~
#4

慕哥2502477 回复 SuperDi

如果改为len(s.strip()) > 0 ,会提示有错误因为None(把list里的None删除了的话没问题)。加入s and之后可以把None这个情况处理掉。
2017-07-12 回复 有任何疑惑可以回复我~
查看1条回复

语法错误是因为你没有写else语句,谢谢

0 回复 有任何疑惑可以回复我~

我觉得是你缺少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 就过滤掉了


我也是刚学到这,粗浅见解,希望大家讨论

4 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

lambda s: s if len(s.strip())>0这样的为什么不行?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信