Ребята, я пытаюсь напечатать первые 8 элементов последовательности Фибоначчи и просто хочу понять один фрагмент кода. При выполнении операции присваивания в одной строке (n1,n2 = n2, n1+ n2) код работает нормально, но при разбиении той же операции присваивания на отдельные строки, например (n2 = n1+n2 и n1=n2), я получаю разные результаты и код не работают должным образом, пожалуйста, объясните мне, почему?
def generate_fibonacci():
n1 = 0
n2 = 1
while True:
yield n1
n1,n2 = n2, n1+ n2 // this piece of code doesn't work properly when separating it
# n2 = n1 + n2
# n1 = n2
seq = generate_fibonacci()
for i in range(8):
print(next(seq))
4 ответа
Попробуй это:
def generate_fibonacci():
n1 = 0
n2 = 1
while True:
yield n1
n1,n2 = n2, (n1+ n2)
n2 = n1 + n2
n1 = n2
Используя этот код, n1
и n2
получают одно и то же значение — сумму исходных n1
и n2
.
n1,n2 = n2, n1+ n2
Используя этот код, n1
получает исходное значение n2
, а n2
получает сумму исходного n1
и n2
.
Когда вы выполняете n1,n2 = n2,n1+n2
, Python сохраняет значения справа во временной памяти перед выполнением назначений. Таким образом, n1+n2
вычисляется до изменения n1 (таким образом избегая помех в процессе присваивания).
Если вы сделаете это в две строки, вы потеряете исходное значение одной из переменных. Но из-за характера последовательности Фибоначчи вы можете компенсировать это и получить исходное значение:
def generate_fibonacci():
n1 = 0
n2 = 1
while True:
yield n1
n2=n1+n2 # n2 gets a new value
n1=n2-n1 # recover original value of n2
Если вы измените n2
перед n1
, тогда n1
изменится на новое значение n2
, а не на исходное значение, поэтому они оба будут иметь одинаковое значение.
Точно так же изменение n1
сначала сделает значение n2
неверным.
Если вы хотите разделить код, есть два варианта. Первый работает в любом случае и заключается в сохранении исходного значения одной переменной в другой переменной:
temp = n2
n2 = n1 + n2
n1 = temp
Второй вариант работает только в этом случае и заключается в вычислении значения n1
с учетом того факта, что значение n2
изменилось:
n2 = n1 + n2
n1 = n2 - n1
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.
n1,n2 = n2, n1+ n2
Используя этот код,n1
присваивается исходному значениюn2
.