繁体   English   中英

列出理解Python素数

[英]List Comprehension Python Prime numbers

我遇到了一个关于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)。 但是关于堆栈溢出的答案是

[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循环的结果将始终包含许多单个值,并且这些单个值是iterable的一部分

[x +1表示范围(1,5)中的x]
[2、3、4、5]

对于范围(1,10)中的x:print(x + 1)
2
3
4

您可以简单地了解循环理解已经具有值列表,然后它们仅简单地按值有序地输入条件值。 像这样:

[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”对象不可迭代

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

这是列表理解的语法。 在此处输入图片说明

在条件中, if是可选谓词。 我们可以通过遵循x%y==0的规则创建另一个列表理解,即输出表达式和代表输入序列range(2,int(x/2)+1)成员的变量y

all()any()适用于可悲的对象。 例如all([True, True, False, True])返回False 您不能使用any(True) (例如您的示例: any(x%y == 0)

可以将以下语句[x for x in range(2, 20) if all(x % y != 0 for y in range(2, x))]可以转换为以下代码:

res = []
for x in range(2, 20):
    temporary_list = (x%y != 0 for y in range(2,x))
    if all(temporary_list):
        res.append(x)

PS。 我在注释中看到您不确定如何声明y 在python中,除了理解列表以外,还有更多很棒的结构。 其中之一是理解力的产生者-我相信在这种情况下会使用它。

语法allany的可迭代的对象(表,套等)工作。 因此,将其应用于boolean- x%y==0时会出错。

您可以通过以下方式使用任何一种-

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

要么 -

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

就像彼此互补

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM