[英]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中,除了理解列表以外,还有更多很棒的结构。 其中之一是理解力的产生者-我相信在这种情况下会使用它。
语法all
和any
的可迭代的对象(表,套等)工作。 因此,将其应用于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.