鱼C论坛

 找回密码
 立即注册
查看: 1168|回复: 5

[已解决]lambda和filter的问题

[复制链接]
发表于 2020-6-29 18:04:26 | 显示全部楼层 |阅读模式

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

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

x
print(list(filter(lambda n : not(n%3), range(1, 100))))
打印: [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

print(list(filter(lambda n : not(n%3), range(100))))
打印:[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

print(list(filter(lambda x : None if x % 3 else x, range(101))))
打印:[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

为什么第三个和第一个有什么不同吗?   为什么没有打印0出来
最佳答案
2020-6-29 18:09:57
本帖最后由 Twilight6 于 2020-6-29 18:12 编辑

第三个:filter(lambda x : None if x % 3 else x, range(101))


这个lambda 匿名函数中用了三元运算符  如果条件成立,那么返回 None 反之 返回 x 的值,而 None 可以看成 bool 类型值的 False 所以会将条件 x % 3 成立的元素过滤掉


第一个:filter(lambda n : not(n%3), range(1, 100))


not 可以认为是反转真假,如果为真那么 not 后就为假 反之 为假 not 后为真 ,则这里只要 n%3 不为 0 都为 False ,导致 filter 过滤掉这些元素,只有 n%3 = 0 的时候 条件为 True,保留下元素来

而第一个和第三个最终过滤效果是一样的,而 0 为什么没有保留下来,我们先看第三个  

filter(lambda x : None if x % 3 else x, range(101))  这里  0%3 = 0 条件成立 但是 0 的布尔类型值为 False 被 filter 判断时候为 False 就直接过滤掉了

而第一个也是同理,而且第一个还不从 0 开始 更不可能会有 0 了



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-29 18:09:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-29 18:12 编辑

第三个:filter(lambda x : None if x % 3 else x, range(101))


这个lambda 匿名函数中用了三元运算符  如果条件成立,那么返回 None 反之 返回 x 的值,而 None 可以看成 bool 类型值的 False 所以会将条件 x % 3 成立的元素过滤掉


第一个:filter(lambda n : not(n%3), range(1, 100))


not 可以认为是反转真假,如果为真那么 not 后就为假 反之 为假 not 后为真 ,则这里只要 n%3 不为 0 都为 False ,导致 filter 过滤掉这些元素,只有 n%3 = 0 的时候 条件为 True,保留下元素来

而第一个和第三个最终过滤效果是一样的,而 0 为什么没有保留下来,我们先看第三个  

filter(lambda x : None if x % 3 else x, range(101))  这里  0%3 = 0 条件成立 但是 0 的布尔类型值为 False 被 filter 判断时候为 False 就直接过滤掉了

而第一个也是同理,而且第一个还不从 0 开始 更不可能会有 0 了



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 18:14:51 | 显示全部楼层
本帖最后由 城中城 于 2020-6-29 18:18 编辑

第一个:
print(list(filter(lambda x : None if x % 3 else x, range(101))))

第二个:
a = []
for i in range(100):
    if i % 3:
        None
    else:
        a.append(i)

print(a)


这里 我想问一下   为什么第一个和第二个输出的结果不同
少了一个0

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 18:19:13 | 显示全部楼层
城中城 发表于 2020-6-29 18:14
第一个:
print(list(filter(lambda x : None if x % 3 else x, range(101))))

因为 0 为布尔类型值的 False  当 filter 判断 0 的时候会因为判断条件为 False 而过滤掉哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 19:51:36 | 显示全部楼层
Twilight6 发表于 2020-6-29 18:09
这个lambda 匿名函数中用了三元运算符  如果条件成立,那么返回 None 反之 返回 x 的值,而 None 可以 ...
print(list(filter(lambda x : None if x % 3 else x, range(101))))

这个句子如果使用简单的for 和 if 语句写出来是什么样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 19:59:06 | 显示全部楼层
小甲鱼的铁粉 发表于 2020-6-29 19:51
这个句子如果使用简单的for 和 if 语句写出来是什么样的

list(range(3,101,3))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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