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