簡體   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