#python #python-3.x
#python #python-3.x
Вопрос:
Я новичок в Python и пытаюсь изучить Python с помощью самообучения. Я пытался построить ряд Фибоначчи, используя while
цикл. Вот мой код, который не возвращает желаемый результат. Кто-нибудь может объяснить проблему?
a = 0
b = 1
while b<100:
print(b)
a = b
b = a b
Если мы определяем a, b
одновременно, как a, b = b, a b
, это работает отлично. Почему это происходит? Я не понимаю, потому что в обоих случаях я определяю a и b одинаково.
Ответ №1:
Это потому, что языки программирования, такие как Python и многие другие, выполняют инструкции, которые вы пишете, в том порядке, в котором вы их пишете.
Это означает, что ко времени выполнения b = a b
значение a
в предыдущей строке уже изменилось.
Простым способом решить эту проблему было бы использование третьей переменной для временного сохранения результатов.
a = 0
b = 1
c = 1
while c < 100:
print(c)
c = a b
a = b
b = c
Ответ №2:
Вы допускаете одну небольшую ошибку.
Когда вы это делаете a = b
, вы меняете значение a
. После этого, когда вы делаете b=a b
, это фактически эквивалентно b = b b
=> b=2b
.
Чтобы избежать этого, используйте временную переменную temp
и храните в ней значение a
. Затем измените значение a
с помощью a = b
. Затем выполните, a = a b
.
Ниже приведен код:
a=0
b=1
while b<100:
print(b)
temp = a
a = b
b = temp b
Когда вы это делаете a, b = b, a b
, предыдущее значение a
используется для вычисления нового b
, мы проделали аналогичную вещь выше, сохранив предыдущее значение a
в temp
Комментарии:
1. Спасибо за объяснение и предоставление концепции временной переменной
2. Пожалуйста, примите ответ, если он был полезен… Рад помочь! =)
Ответ №3:
Оператор «запятая» ( ,
) в Python используется для создания кортежа, и допускается опускать круглые скобки, которые окружают кортеж. Выражение a, b = b, a b
на самом деле является присвоением одного кортежа другому:
(a, b) = (b, a b)
Этот оператор выполняется путем вычисления конструктора кортежей с правой стороны (b, a b)
. На этом этапе создается новый анонимный кортеж (назовем его c
), и исходные значения a
и b
больше не нужны. Затем кортеж поэлементно присваивается кортежу с левой стороны. Новое значение a
становится c[0]
(то есть прежним b
), а новое значение b
становится c[1]
(то есть бывшим a b
).
Комментарии:
1. Спасибо за концепцию определения кортежа с использованием оператора запятой без круглых скобок
Ответ №4:
Ваш код не работает, потому что вы изменяете значение a
перед вычислением b
. В ряду Фибоначчи требуется предыдущее значение a и b. Вы можете использовать list
, как указано выше, или можете ввести другую переменную для хранения значений.
while True:
temp = a b
if temp >100:
break
print(temp)
a = b
b = temp
Для справки, вот простая реализация с использованием list
:
lst = [0, 1]
while True:
temp = lst[-1] lst[-2]
if temp>100:
break
lst.append(temp)
print(lst)