2016-11-19 105 views
0

這段代碼爲什麼會像永遠一樣運行?我想這是我在「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) 
+9

因爲你不改變循環內的'y_list'?爲什麼*會停止? – jonrsharpe

+0

'z_list'的含義是什麼?好像也許你想要'y_list = [y * k在y_list中的y]'' –

回答

0

沒有更改y_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 
y_list副本所做的

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


FWIW,這是另一種寫這個的方法。我們使用itertools.count,所以我們不必手動更新k,並且map可以調用測試函數,我已經給出了一個更有意義的名稱。

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]