[英]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.