为什么这不停止运行?

时间:2016-11-19 22:39:42

标签: python loops while-loop

为什么这段代码会像永远一样运行?我希望它在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)

1 个答案:

答案 0 :(得分:0)

您没有更改y_list(并且您想要更改它!)。而且因为您正在测试y_list循环条件中的静态while,所以该循环将永远不会结束。但是 正在更改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,因此我们不必手动更新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]