gpt4 book ai didi

python - 列表理解Python素数

转载 作者:行者123 更新时间:2023-11-28 20:55:43 25 4
gpt4 key购买 nike

我在 Stack Overflow 上发现了一个使用列表理解生成素数的解决方案。但是无法理解内部 for 循环的作用。

我试过类似的东西

[x for x in range(5,20) for y in range(2,int(x/2)+1) if any(x%y == 0)]

它抛出一个错误:'bool' 对象不可迭代

我知道我的语法是错误的,但从逻辑上讲,对于素数,我们有一个 for 循环,然后是一个 for 循环,然后是一个 if 条件来计算余数 (x%y)。但是 Stack Overflow 上的答案是

[x for x in range(2, 20) if all(x % y != 0 for y in range(2, x))]

我理解为什么使用 all 的原因,但我无法了解 all() 中的条件是如何工作的,如果 range(2,x) 被迭代并且 y 得到的值是依次用于计算(x%y)。 y 在赋值之前如何使用。

最佳答案

如果它能像 for 循环一样正常工作,这就是列表推导的妙处,人们不会创建它,因为 for 循环更具可读性和易理解性。

你可能会发现列表理解的结果总是一个list,而for循环的结果总是有很多单值,这些单值是一部分可迭代

[x +1 for x in range(1,5)]
[2, 3, 4, 5]

for x in range (1,10): print(x+1)
2
3
4
5

你可以简单地理解为循环理解已经有了值列表,然后它们只是简单地逐个值地有序地馈送到条件中。像这样:

[1+1 , 2+1 , 3+1 , 4+1]

你的代码是错误的,因为你从普通的 for 循环中继承了太多。你用 for 循环编写的代码应该是这样的:

for x in range(5,20):
for y in range(2,int(x/2)+1):
if any(x%y == 0):
print(x)

结果显然是:

TypeError: 'bool' object is not iterable

因为 any 需要一个可迭代对象,例如生成器表达式或 **list**,正如上面 @meowgoesthedog 所提到的。巧合的是,列表只是关于列表理解。但是,您需要理解它才能很好地利用列表理解。有时我也会遇到这种情况,在您的情况下,for y in range(2,int(x/2)+1) 用作普通的 for 循环。

这是列表理解的语法。 enter image description here

在条件 if 旁边,它是可选的谓词。我们可以通过以下规则创建另一个列表推导式,其中 x%y==0 是输出表达式,变量 y 代表输入序列的成员 range(2 ,int(x/2)+1)

关于python - 列表理解Python素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com