Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2016 03:38:34

mrnoob
Зарегистрирован: 2016-02-04
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример из оффсайта

Всем привет.

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

код:

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.
Моя логика где то хромает ??? (((( в туториале тоже молодцы, нихрена не объяснено

Заранее спасибо )

Офлайн

#2 Фев. 4, 2016 04:32:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Пример из оффсайта

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



Офлайн

#3 Фев. 5, 2016 02:06:26

mrnoob
Зарегистрирован: 2016-02-04
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример из оффсайта

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

Правильно?

Отредактировано mrnoob (Фев. 5, 2016 02:25:59)

Офлайн

#4 Фев. 5, 2016 04:27:54

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Пример из оффсайта

mrnoob
не эквивалентен, я не говорил ничего про эквивалентность
логика тут на самом деле другая
выражение

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

читать



Отредактировано FishHook (Фев. 5, 2016 04:33:13)

Офлайн

#5 Фев. 5, 2016 05:43:09

mrnoob
Зарегистрирован: 2016-02-04
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример из оффсайта

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

читать



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

ps а массивы что практически вообще не используются в пайтоне? (в сравнении с тем же пхп в книгах array почти вообще отсутствует, в любой книге по пхп минимум 60% всех примеров с использованием массивов)

Офлайн

#6 Фев. 5, 2016 05:58:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Пример из оффсайта

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



Отредактировано FishHook (Фев. 5, 2016 06:00:05)

Офлайн

#7 Фев. 5, 2016 06:16:30

mrnoob
Зарегистрирован: 2016-02-04
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример из оффсайта

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

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

Офлайн

#8 Фев. 5, 2016 06:42:12

mrnoob
Зарегистрирован: 2016-02-04
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример из оффсайта

В общем как я понял в выражении

a, b = x, y

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

кошмар

Офлайн

#9 Фев. 5, 2016 06:49:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Пример из оффсайта

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 для такой передачи нужно упаковывать его в структуру (что редко делается).



Отредактировано py.user.next (Фев. 5, 2016 06:54:33)

Офлайн

#10 Фев. 5, 2016 06:54:19

mrnoob
Зарегистрирован: 2016-02-04
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Пример из оффсайта

py.user.next
это особенность кортежей ?

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

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

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

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

Получается код работает справа налево что ли?

Отредактировано mrnoob (Фев. 5, 2016 06:56:54)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version