Найти - Пользователи
Полная версия: Пример из оффсайта
Начало » Python для новичков » Пример из оффсайта
1 2
mrnoob
Всем привет.

Прошу прощения за вероятно нубский вопрос, но в интернете внятного для себя ответа не нашел

код:
a, b = 0, 1
while b < 10:
    print(b)
    a, b = b, a+b

именно не понял, чем отличается multiple assessment a, b = b, a + b от обычного a = b
b = a + b? потому что по пуску кода разница видна, но в чем логика?

если следить за процессом присвоения переменных, то ведь получается
a, b = b, a + b
0) a = 0 b = 1
1) a = b (1) b = a + b (1 + 1 = 2)
2) a = b (2) b = a + b (2 + 2 = 4)
и так далее…
но результат программы другой 1 1 2 3 5 8
Такие значения могут получиться, только если переменная “а” не изменяется с прошлого действия цикла, но ведь после print(b) следует a, b = b, a+b что по идее изменяет ее значение в последовательности с лева на право а = b и за тем b = a + b.
Моя логика где то хромает ??? (((( в туториале тоже молодцы, нихрена не объяснено

Заранее спасибо )
FishHook
mrnoob
a = b
b = a + b?
Без промежуточной переменной у вас получится ерунда. Во второй строке у вас a УЖЕ равно b, поэтому вы получите
a = b
b = b + b
а вот этот код
a, b = b, a + b
аналогичен вот такому
temp = a
a = b
b = temp + b
mrnoob
FishHook
mrnoob
a = b
b = a + b?
Без промежуточной переменной у вас получится ерунда. Во второй строке у вас a УЖЕ равно b, поэтому вы получите
a = b
b = b + b
а вот этот код
a, b = b, a + b
аналогичен вот такому
temp = a
a = b
b = temp + b
Блин.. я не понимаю. В каком порядке происходит присвоения значений переменной в множественном присвоении.
Ведь
a, b = 1, 0

print(a, b)

у нас получится 1, 0

Можете объяснить принцип? никакой промежуточной переменной в выражении a, b = 1, 0 нет

ps я понял сам процесс, что значения переменных обновляются после действия в правой части, но не понял логики - почему (((

По той же логике код

a, b = a+b, b+a

эквивалентен

temp1 = a
temp2 = b
a = a + temp2
b = b + temp1

Правильно?
FishHook
mrnoob
не эквивалентен, я не говорил ничего про эквивалентность
логика тут на самом деле другая
выражение
a, b = x, y
это распаковка кортежа. В питоне кортеж определяется не скобками, как думают многие, а запятой.
Эквивалентное выражение вот такое
a, b = (x, y)
или такое
t = x, y
a, b = t

читать
mrnoob
FishHook
mrnoob
не эквивалентен, я не говорил ничего про эквивалентность
логика тут на самом деле другая
выражение
a, b = x, y
это распаковка кортежа. В питоне кортеж определяется не скобками, как думают многие, а запятой.
Эквивалентное выражение вот такое
a, b = (x, y)
или такое
t = x, y
a, b = t

читать



ОФИГЕТЬ! спасибо! вон что придумали… только начал учить, после пышки довольно непривычно ))

ps а массивы что практически вообще не используются в пайтоне? (в сравнении с тем же пхп в книгах array почти вообще отсутствует, в любой книге по пхп минимум 60% всех примеров с использованием массивов)
FishHook
Питон - полностью объектно ориентированный язык, это значит, что в нем ВСЁ является объектом.
Массивы - это не объекты. Из этого следуют некоторые особенности, например, невозможно узнать размер произвольного массива. Просто попробуйте поработать с классическими массивами в Си. В ПХП называют массивом то, что массивом не является. В питоне сущность выполняющая роль массива - список (list) и используется она очень широко.
mrnoob
FishHook
Питон - полностью объектно ориентированный язык, это значит, что в нем ВСЁ является объектом.
Массивы - это не объекты. Из этого следуют некоторые особенности, например, невозможно узнать размер произвольного массива. Просто попробуйте поработать с классическими массивами в Си. В ПХП называют массивом то, что массивом не является. В питоне сущность выполняющая роль массива - список (list) и используется она очень широко.

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

a, b = x, y

a, b - первым действием интерпретируется как имя переменной
эта переменная содержит значения x, y
далее она замыкается на себе, как система

кошмар
py.user.next
mrnoob
чем отличается multiple assessment a, b = b, a + b от обычного a = b
b = a + b?
Если выполнишь по отдельности каждый вариант, то получишь разные результаты.

>>> a, b = 1, 2
>>> a, b
(1, 2)
>>> a = b
>>> b = a + b
>>> a, b
(2, 4)
>>>

>>> a, b = 1, 2
>>> a, b
(1, 2)
>>> a, b = b, a + b
>>> a, b
(2, 3)
>>>

Сначала в правой части присваивания всё вычисляется и только потом присваивается.

FishHook
Просто попробуйте поработать с классическими массивами в Си.
Там, кстати, не классические массивы, классические массивы - в бейзике и паскале. Поэтому там можно передавать массив целиком в функцию, а в C для такой передачи нужно упаковывать его в структуру (что редко делается).
mrnoob
py.user.next
это особенность кортежей ?

допустим в коде

а, b, c = (a + b), (b + c), (a + c)

если это будет стоять в цикле и ранее переменным присвоены значения, вначале будет производиться расчет и только потом меняться значение? и дальше по кругу?

а в списках так же?

Получается код работает справа налево что ли?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB