簡體   English   中英

為什么不停止運行?

[英]why doesn't this stop running?

為什么這段代碼永遠運行? 我希望當y_list中的所有數字都接近我在“ def C(y)”中定義的整數時停止

y_list=[1.0, 3.4 ]
k=1

def C(y):
    return abs(y-round(y)) < 0.15

while not all(C(y) for y in y_list):
    z_list = [y*k for y in y_list]
    k+=1
    print(z_list)

您不需要更改y_list (並且您不想更改它!)。 並且由於您正在while循環條件下測試靜態y_list ,因此該循環將永遠不會結束。 但是您正在更改z_list因此需要測試z_list滿足您的條件。

並且為了使while測試不會在第一個循環上失敗,您需要在循環開始之前將z_list復制為y_list

y_list = [1.0, 3.4 ]

# Copy the original data
z_list = y_list[:]

def C(y):
    return abs(y-round(y)) < 0.15

k = 1
while not all(C(y) for y in z_list):
    z_list = [y*k for y in y_list]
    k+=1
    print(z_list)

產量

[1.0, 3.4]
[2.0, 6.8]
[3.0, 10.2]
[4.0, 13.6]
[5.0, 17.0]

請注意,通過執行以下操作,我將z_list復制為y_list

z_list = y_list[:]

如果我只是做了

z_list = y_list

那么z_list只是與y_list相同的列表對象的另一個名稱,您不會得到兩個單獨的列表。


FWIW,這是另一種寫法。 我們使用itertools.count因此我們不必手動更新kmap到調用測試函數,我給它起了一個更有意義的名稱。

from itertools import count

y_list = [1.0, 3.4 ]
z_list = y_list[:]

def almost_int(y):
    return abs(y - round(y)) < 0.15

for k in count(2):
    print(z_list)
    if all(map(almost_int, z_list)):
        break
    z_list = [y*k for y in y_list]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM