2015-06-29 3 views
4

Я нашел пример последовательности Фибоначчи, которая выглядит следующим образом:Shorthand код и Fibonnaci Последовательность

def fib(n): 
    a, b = 0, 1 
    while b < n: 
     print (b) 
     a, b = b, a+b 

fib(20) 

Так вот что я не понимаю:

a, b = 0, 1 # is just a shortcut for writing 
a = 0 
b = 1 

правильно?

Теперь, следуя той же логике

a, b = b, a+b #should be the same as writing 
a = b 
b = a+b 

Но это не потому, что если я пишу это так, то выход отличается. Мне сложно понять, почему. Есть предположения?

ответ

3

Да, это не совсем то же самое, потому что когда ты пишешь -

a, b = b, a+b 

Значение a и b в момент выполнения оператора считается, позволяет сказать, что до этого заявления, a=1, b=2 , затем вычисляется первая правая часть, поэтому вычисляется b=2 и вычисляется a+b=3. Затем выполняется присвоение, то есть a присвоено значение 2 и b присвоено значение 3.

Но когда вы пишете -

a = b 
b = a+b 

Назначение происходит вместе с расчетом, что первый b=2 вычисляется, затем присваивается, поэтому становится 2, то а + Ь вычисляется (с изменившейся значение a), поэтому a+b=4 и присвоено b, поэтому b становится 4, и, следовательно, разница.

a,b = b, a 

Это сокращение для замены значений a и b Пожалуйста, обратите внимание, что если вы хотите поменять местами значения без использования этого обозначения, вам нужно будет временной переменной.

Внутренне, как это работает, что правая рука с.и.д. сделана в кортеж, а затем значения распечатываются, простой тест, чтобы увидеть это -

>>> a = 5 
>>> b = 10 
>>> t = a, b 
>>> t 
(5, 10) 
>>> b, a = t 
1

a, b = c, d является не стенографии для следующее:

a = c 
b = d 

это на самом деле сокращение для этого:

a, b = (c, d) 

I.e., вы создаете кортеж (c, d), кортеж со значениями c и d, который затем unpacked в целевой список a, b. Кортеж со своими значениями создается до того, как значения будут распакованы в целевой список. На самом деле - это одна атомная * операция, а не сокращение для нескольких операций. Поэтому не имеет значения, имеет ли одна из переменных в целевом списке правая часть операции присваивания.

* Не «атомный» в смысле базы данных ACID, но все же не отдельные утверждения.

1

Это не то же самое.

x, y = y, x

равна:

т = х
х = у
у = т

Это фактически использует временную переменную для замены x и y.

Итак, на a, b = b, a+b. Это выражение равно:

m = a; п = б

а = п

Ь = т + п