城中城 发表于 2020-6-29 18:04:26

lambda和filter的问题

print(list(filter(lambda n : not(n%3), range(1, 100))))
打印:

print(list(filter(lambda n : not(n%3), range(100))))
打印:

print(list(filter(lambda x : None if x % 3 else x, range(101))))
打印:

为什么第三个和第一个有什么不同吗?   为什么没有打印0出来

Twilight6 发表于 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 了



城中城 发表于 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

Twilight6 发表于 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 而过滤掉哈

小甲鱼的铁粉 发表于 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 语句写出来是什么样的{:10_257:}

Twilight6 发表于 2020-6-29 19:59:06

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

list(range(3,101,3))
页: [1]
查看完整版本: lambda和filter的问题