鱼C论坛

 找回密码
 立即注册
查看: 1489|回复: 9

[已解决]请教关于filter结合lambda以及三元运算符的使用问题

[复制链接]
发表于 2021-5-9 13:11:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
比如说有个题目,要求用filter结合lambda,求1-10之间(不含10)的能被2整除的数
答案如下:
  1. >>> list(filter(lambda x : x if x % 2 == 0 else None,range(1,10)))
  2. [2, 4, 6, 8]
复制代码


在lambda中,用了三元运算符,变得复杂了。如果x被2除余数为0,则返回x值,如果余数不为0,则返回None.
也就是说,x为2,4,6,8时,返回2,4,6,8,而x为1,3,5,7,9时返回None
可对于filter来说,第一个参数为None的时候,会把第二个参数中所有为True的值筛选出来,也就是应该把1,3,5,7,9也显示出来

但最终结果只有2,4,6,8,并没有显示1,3,5,7,9

请教是哪一步理解错误呢?先谢谢啦!
最佳答案
2021-5-9 13:46:43
O2H2O 发表于 2021-5-9 13:37
就是说如果参数不是None时,要看第一个参数的运行结果。只有结果是True,才会将该元素取出。比如说把第一 ...

对,把else None去掉也一样,甚至没必要用三元运算符,只返回真或假就行了,filter并不关心第一个参数返回的具体值是什么,只管真假。
  1. a=list(filter(lambda x :not x % 2,range(1,10)))
  2. print(a)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-9 13:17:51 | 显示全部楼层
本帖最后由 柿子饼同学 于 2021-5-9 13:21 编辑


个人理解,None就是不返回东西,然后跳过继续下一个
有错误请指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-9 13:23:38 | 显示全部楼层
噗,第一个参数是那个函数对象,不是它的返回值啊..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-9 13:25:33 | 显示全部楼层
qiuyouzhi 发表于 2021-5-9 13:23
噗,第一个参数是那个函数对象,不是它的返回值啊..

那它是怎么运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-9 13:27:27 From FishC Mobile | 显示全部楼层
可对于filter来说,第一个参数为None的时候,会把第二个参数中所有为True的值筛选出来,也就是应该把1,3,5,7,9也显示出来
filter第一个参数不是None,是lambda x : x if x % 2 == 0 else None
第一个参数是None时,filter会筛选出第二个参数中可以看做True的元素
第一个参数不是None时,filter会将第二个参数中的每个元素逐个代入第一个参数运算取其结果,结果为True则将该元素选出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-9 13:33:40 | 显示全部楼层

遍历第二个参数(一个可迭代对象),
然后对它的每个元素调用传入的func(为None则不调用),
然后判断True/False。
自己写了个较为简陋的filter,你可以看看
  1. def filter(func, seq):
  2.     for each in seq:
  3.         tmp = func(each) if func else each
  4.         if tmp: yield tmp
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-9 13:37:16 | 显示全部楼层
hrp 发表于 2021-5-9 13:27
filter第一个参数不是None,是lambda x : x if x % 2 == 0 else None
第一个参数是None时,filter会筛选出 ...

就是说如果参数不是None时,要看第一个参数的运行结果。只有结果是True,才会将该元素取出。比如说把第一个参数函数里的 else None 改为 else False 或者  else 0  ,反正不让它返回 True
  1. >>> list(filter(lambda x : x if x % 2 == 0 else False,range(1,10)))
  2. [2, 4, 6, 8]
  3. >>> list(filter(lambda x : x if x % 2 == 0 else 0,range(1,10)))
  4. [2, 4, 6, 8]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-9 13:38:13 | 显示全部楼层
O2H2O 发表于 2021-5-9 13:37
就是说如果参数不是None时,要看第一个参数的运行结果。只有结果是True,才会将该元素取出。比如说把第一 ...

是的。
但None其实就为False,所以不用改。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-9 13:43:20 | 显示全部楼层
大概明白了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-9 13:46:43 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
O2H2O 发表于 2021-5-9 13:37
就是说如果参数不是None时,要看第一个参数的运行结果。只有结果是True,才会将该元素取出。比如说把第一 ...

对,把else None去掉也一样,甚至没必要用三元运算符,只返回真或假就行了,filter并不关心第一个参数返回的具体值是什么,只管真假。
  1. a=list(filter(lambda x :not x % 2,range(1,10)))
  2. print(a)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 17:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表