2016-11-19 4 views
0

Почему этот код работает как всегда? Я хочу, чтобы это остановить, когда все числа в y_list находятся рядом с целым числом, как я определил в «DEF С (у)»Почему это не работает?

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 в y_list]' –

ответ

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] 
Смежные вопросы