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

菜鸟提问: lambda 后接if

# 我们说lambda后面只能接一个表达式,不是说if不能接吗?例子里面的

myabs = lambda x: -x if x < 0 else x
# 为啥可以呢?这个if怎么算?是赋值语句的if,而不是lambda 的?

# 我这样写就报错了诶:
print filter(lambda s: s if len(s.strip()) > 0, ['test', None, '', 'str']


正在回答

5 回答

跟   if  没有关系啊,filter(a,b)

函数里边只有ab两部分,你在a中加上if,不符合定义的啊

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

慕粉4083696 提问者

非常感谢!
2016-10-08 回复 有任何疑惑可以回复我~

我刚开始也是不明白,仔细想了想,其实是对filter()函数没搞清楚,其实在fiiter()函数里面那个判断函数f()只是用来返回true或者False。当为True时,则保留该元素;当为False时,则不保留该元素。所以,一定要记住filter()高阶函数里面的那个判断函数f()返回的只是True或者False,

(1)print filter(lambda s: s and len(s.strip()) > 0, ['test', None, '', 'str']) # 正确使用

(2)print filter(lambda s: s if len(s.strip()) > 0, ['test', None, '', 'str'])  # 报错

(3)myabs = lambda x: -x if x < 0 else x  # 正确使用

这三条语句里面,第三条语句正确是理所当然的,至于第二条语句为什么错,根本原因不是因为什么if,and,而是filter()这个高阶函数,作为这个高阶函数里的判断函数,本应该返回true或false,结果第二条语句直接返回了列表里的一个元素,所以肯定报错啊!至于第一条为什么正确,是因为lambda s: s and len(s.strip()) > 0这个匿名函数中的s=(s and len(s.strip()) > 0)


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

print filter(lambda x:x if len(x.strip())>0 else x,['a',' ','b','','c'])

['a', ' ', 'b', 'c']

#==============

对这个问题也很迷惑。但是通过上面的例子猜测,不能用if的原因大概是由于if语句不完整

求大神指导。

0 回复 有任何疑惑可以回复我~
print filter(lambda s: s and len(s.strip()) > 0, ['test', None, '', 'str']) # 正确使用
print filter(lambda s: s if len(s.strip()) > 0, ['test', None, '', 'str'])  # 报错
myabs = lambda x: -x if x < 0 else x  # 正确使用

所以对lambda 里面的if有点懵逼。。。。


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

python的语法就是这样的,如果你要写成一行,if 是放到后边的,连起来看简洁一点

lambda只能有一个表达式的意思是,只有一个print,后边没有return,返回值就是结果,

不是说不能接别的语句了

你这个filter函数内部的前部分应该需要定义的吧,


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

慕粉4083696 提问者

print filter(lambda s: s if len(s.strip()) > 0, ['test', None, '', 'str']) 这样是报错的,但是 print filter(lambda s: s and len(s.strip()) > 0, ['test', None, '', 'str']) 是可以的,我觉得if的问题诶
2016-10-07 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

菜鸟提问: lambda 后接if

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