2016-11-19 41 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]