Ребята, я пытаюсь напечатать первые 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))
0
Zohrab 19 Янв 2022 в 20:04
Если вы разделите эту строку, то во второй части будет использоваться новое значение переменной из первой части, а не старое значение.
 – 
jasonharper
19 Янв 2022 в 20:08
Когда вы разделяете строки, берется последнее значение n2 (n1 + n2) и присваивается n1
 – 
Anand Sowmithiran
19 Янв 2022 в 20:08
n1,n2 = n2, n1+ n2 Используя этот код, n1 присваивается исходному значению n2.
 – 
John Gordon
19 Янв 2022 в 20:08

4 ответа

Попробуй это:

def generate_fibonacci():
    n1 = 0
    n2 = 1
    while True:
        yield n1
        n1,n2 = n2, (n1+ n2)
0
XxJames07- 19 Янв 2022 в 20:18
n2 = n1 + n2
n1 = n2

Используя этот код, n1 и n2 получают одно и то же значение — сумму исходных n1 и n2.

n1,n2 = n2, n1+ n2

Используя этот код, n1 получает исходное значение n2, а n2 получает сумму исходного n1 и n2.

0
John Gordon 19 Янв 2022 в 20:20

Когда вы выполняете 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
0
Alain T. 19 Янв 2022 в 20:30

Если вы измените n2 перед n1, тогда n1 изменится на новое значение n2, а не на исходное значение, поэтому они оба будут иметь одинаковое значение.

Точно так же изменение n1 сначала сделает значение n2 неверным.

Если вы хотите разделить код, есть два варианта. Первый работает в любом случае и заключается в сохранении исходного значения одной переменной в другой переменной:

temp = n2
n2 = n1 + n2
n1 = temp

Второй вариант работает только в этом случае и заключается в вычислении значения n1 с учетом того факта, что значение n2 изменилось:

n2 = n1 + n2
n1 = n2 - n1
0
Lecdi 19 Янв 2022 в 20:38
1
Нет возможности разделить? Существуют ли какие-либо официальные ссылки на Python, касающиеся таких особых ситуаций?
 – 
Zohrab
19 Янв 2022 в 20:17
Я обновил ответ, включив в него несколько возможных способов разделения кода.
 – 
Lecdi
19 Янв 2022 в 20:38