Python 列出素数
我遇到了一个关于堆栈溢出的解决方案,使用列表理解生成素数。但无法理解内部for循环的作用 我试过类似的东西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
[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)