Во-первых, я думаю, что в вашем примере кода есть некоторые ошибки.Вы создаете xnew
из x
(вместо xold
), и в конце каждой итерации вы присваиваете xold
для xnew
, а не наоборот.В результате ваш пример представляет собой бесконечный цикл.
Во-вторых, чтобы перейти к актуальной проблеме, давайте сделаем еще более простой пример:
def f(x):
xold = x
while (xold > 0):
xnew = xold - 1
#print("old: %s new: %s" % (xold, xnew))
xold = xnew
return xnew
result = f(x=3.1)
print(result)
Это дает отрицательное число.Чтобы понять почему, давайте раскомментируем оператор print в функции и проверим вывод.Это дает:
old: 3.1 new: 2.1
old: 2.1 new: 1.1
old: 1.1 new: 0.10000000000000009
old: 0.10000000000000009 new: -0.8999999999999999
Проблема состоит в том, что цикл создает тестовый пример, и если этот тестовый случай не выполняется, цикл завершается.Вы возвращаете тестовый случай, а не последний успешный случай.Измените возвращаемый результат на xold
, и он будет работать.
(Также обратите внимание, что написанный код создаст ошибку, если ввод x
меньше 0, потому что xnew
никогда не будет определен вloop.)
Если есть дополнительный критерий, не включенный в оператор while (часто это краевой регистр), вы можете завершить цикл с помощью оператора break
внутри предложения if
:
xold = 3.1
while True:
xnew = xold - 1
if xnew <= 0: # some condition not considered in the while
break
xold = xnew
Опять же, это оставляет xold
последним, прошедшим дополнительный критерий.