Python 列出素数

Python 列出素数,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,我遇到了一个关于堆栈溢出的解决方案,使用列表理解生成素数。但无法理解内部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

我遇到了一个关于堆栈溢出的解决方案,使用列表理解生成素数。但无法理解内部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()中的条件是如何工作的,因为如果范围(2,x)是迭代的,并且y得到的值反过来用于计算(x%y),则应该遵循all()中的条件。y在赋值之前如何使用。

语法
all
any
适用于iterable对象(列表、集合等)。因此,当您将其应用于布尔值-
x%y==0
时,会出现一个错误

你可以以下列方式使用任何

[x表示范围(5,20)内的x,如果没有([x%y==0表示范围(2,int(x/2)+1)])]

或-

作为任意和所有相互补充。

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

此语句
[x表示范围(2,20)中的x,如果所有(x%y!=0表示范围(2,x))中的y)]
可以转换为以下代码:

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)

另外,我在评论中看到,您不确定如何声明
y
。在python中,有比理解列表更多的优秀结构。其中一个是理解的生成器——我相信在这个例子中会用到它

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

您可能会发现,列表理解的结果总是一个
列表
,而
for
循环的结果总是许多单个值,这些单个值是
可编辑的一部分

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

对于范围(1,10)内的x:打印(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”对象不可编辑

因为
任何
都需要一个iterable,例如生成器表达式或
**列表**
,如@meowgoestedog所述。巧合的是,列表就是关于列表理解的。然而,为了更好地利用列表理解,您需要理解它。有时我也会遇到这种情况,在你的例子中,范围(2,int(x/2)+1)中y的
作为
的正常
循环工作

这是列表理解的语法。


在条件
if
中,它是可选谓词。我们可以按照规则创建另一个列表理解,其中
x%y==0
是输出表达式,变量
y
表示输入序列
范围的成员(2,int(x/2)+1)
x
y
不是可数,它们是单整数<代码>任何
都需要一个iterable,例如生成器表达式或列表。此外,您尝试中的逻辑将留下非素数整数。同意,但为什么是x%y=即使y在其值被使用后得到一个值,0也不会抛出错误。对于素数,我们有一个for循环,后跟一个for循环,然后是一个if条件来计算余数(x%y)。无法理解all()@meowgoes的执行如果您遇到了基于它的数学集合生成器符号,则DogList理解更具可读性。此外,每个列表理解都可以写成for循环。您是如何翻译代码的。我的意思是你能分享一些资源吗?我是根据我的经验知道的。只需阅读理解列表。一旦熟悉了它们,理解这样的代码就容易多了。
for x in range(5,20):
    for y in range(2,int(x/2)+1):
        if any(x%y == 0):
            print(x)