Similar presentations:
Инструкции присваивания в Python (Лекция 12)
1. Лекция 12 Инструкции присваивания в Python
Присваивание в Python и его каноническая формаКомбинированные инструкции присваивания
Позиционное присваивание
Групповое присваивание одного значения
Выражения присваивания в Python
2. Присваивание в Python и его каноническая форма
• В Python, как и во многих других языкахпрограммирования, каноническая форма
операции присваивания имеет вид a = b,
где слева от оператора присваивания
записывается целевое имя переменной или
компонент объекта, а в качестве правого
операнда выступает произвольное
выражение, которое в результате
вычислений дает объект (см. пример №1).
3. Пример №1. Каноническая форма присваивания.
Пример №1. Каноническаяформа присваивания.
4. Особенности присваивания в Python:
Особенности присваиванияв Python:
• Инструкции присваивания всегда сохраняют ссылки на объекты,
например, в переменных или в элементах структур данных, и никогда
не создают копии присваиваемых объектов. Как следствие,
переменные в Python больше напоминают указатели, чем области
хранения данных.
• Объявлять переменные заранее нельзя, т.к. интерпретатор создает
переменные в момент присваивания им значений (то есть ссылок на
объекты). После инициализации, когда имя переменной будет
встречаться в выражениях, оно будет автоматически замещаться
объектом, на который ссылается данная переменная. Если же
интерпретатор встретит в программе неинициализированную
переменную, он возбудит исключение вместо того, чтобы вернуть
какое-либо значение по умолчанию (такое поведение призвано
облегчить поиск ошибок и опечаток в коде).
• Некоторые инструкции пусть и неявно, но тоже выполняют операцию
присваивания. Примерами могут служить импорт модуля,
определение функции или класса, указание переменной в
цикле for или же передача аргументов функции. В любом случае
результатом явных или неявных инструкций присваивания будет
связывание имен с ссылками на объекты.
5. Комбинированные инструкции присваивания в Python
• В дополнение к базовой инструкции присваиванияв Python имеется и целый ряд комбинированных
инструкций присваивания, которые объединяют
операцию присваивания с другой операцией.
• В общем виде инструкцию присваивания с
комбинированным оператором x operator= y можно
считать сокращенной записью инструкции x = x
operator y.
• Например, x += y является сокращенной записью
инструкции присваивания x = x + y, в которой к
значению переменной x прибавляется значение
переменной y, а результат присваивается
переменной x (см. пример №2).
6. Пример №2. Комбинированная форма присваивания.
Пример №2. Комбинированнаяформа присваивания.
7.
• Таким образом, комбинированная инструкцияприсваивания объединяет в себе выражение и
присваивание, являясь по сути краткой формой
записи кода.
• И хотя, например, инструкции num += 25 и num =
num + 25 дадут один и тот же результат, первая из
них выглядит явно компактнее.
• Кроме того, если объект справа относится к
категории изменяемых объектов и поддерживает
указанную операцию, комбинированная
инструкция присваивания может выполняться даже
быстрее за счет непосредственного изменения
объекта вместо создания и изменения его копии
(см. пример №3).
8. Пример №3. Преимущества комбинированной формы присваивания.
Пример№3. Преимущества
комбинированной
формы присваивания.
Метод time() одноименного
модуля time стандартной
библиотеки Python возвращает
время, выраженное в секундах с
начала эпохи.
9. Основные инструкции присваивания, комбинированные с арифметическими операторами:
• a += b – тоже самое, что и a = a + b;• a -= b – тоже самое, что и a = a - b;
• a *= b – тоже самое, что и a = a * b;
• a **= b – тоже самое, что и a = a**b;
• a /= b – тоже самое, что и a = a / b;
• a //= b – тоже самое, что и a = a // b;
• a %= b – тоже самое, что и a = a % b.
10. Позиционное присваивание в Python
• Еще одной формой присваиванияв Python является позиционное
присваивание, которое связывает объекты
последовательностей справа от оператора
присваивания с именами, перечисляемыми
слева от него. При этом присваивание
выполняется слева направо согласно
местоположениям имен и соответствующих
им объектов (см. пример №4).
11. Пример №4. Позиционное присваивание (часть 1).
Пример №4. Позиционноеприсваивание (часть 1).
12.
• Как видим, данная форма присваиванияпозволяет смешивать последовательности
разных типов. Здесь главное, чтобы
количество присваиваемых значений
совпадало с количеством переменных,
которым эти значения будут присваиваться.
• Но и эта проблема может быть решена за
счет имеющейся возможности
использования в присваивании
расширенного синтаксиса распаковывания
последовательностей (см. пример №5).
13. Пример №5. Позиционное присваивание (часть 2).
Пример №5. Позиционноеприсваивание (часть 2).
14.
• Благодаря наличию имени со звездочкой вселишние значения автоматически помещаются в
соответсвующий список именно так, как и
ожидается.
• Однако нужно не забывать, что можно
использовать только одну переменную со
звездочкой, а сама переменная должна
принадлежать последовательности даже в том
случае, если она будет одна (поставив запятую в
инструкции *c, = [1, 2] мы автоматически получили
кортеж и смогли избежать ошибки).
• Следует добавить, что расширенная операция
распаковывания последовательностей может
использоваться не только в случаях явного
присваивания значений, но также и в заголовках
циклов, вызовах функций и других операциях
неявного присваивания значений.
15. Групповое присваивание одного значения в Python
• В случае группового присваивания объект,расположенный справа, присваивается
всем переменным группы (см. пример №6).
В результате несколько отдельных
инструкций присваивания могут быть
заменены одной эквивалентной и более
компактной инструкцией.
16. Пример №6. Присваивание одного значения группе переменных (часть 1).
Пример №6. Присваивание одногозначения группе переменных
(часть 1).
17.
• Следует иметь в виду, что при групповомприсваивании в памяти создается всего лишь один
объект, разделяемый всеми переменными группы.
• Поэтому такая форма присваивания будет полезна
для неизменяемых объектов, например, чисел или
строк. А вот при использовании изменяемых
объектов типа списков или словарей нужно быть
осторожными, т.к. изменение объекта через одну
из переменных группы будет оказывать влияние и
на другие переменные (см. пример №7).
• Это связано с тем, что переменные в Python хранят
не сами объекты, а ссылки на них. А раз так, то даже
после изменения объекта через одну из ссылок все
остальные по-прежнему будут указывать на тот же,
пусть и модифицированный, объект.
18. Пример №7. Присваивание одного значения группе переменных (часть 2).
Пример №7. Присваивание одногозначения группе переменных
(часть 2).
Таким образом, во
избежание проблем с
изменяемыми объектами,
их инициализацию лучше
производить в отдельных
инструкциях, как было
показано в первой части
примера №6.
19. Выражения присваивания в Python
• Все рассмотренные нами формы присваиванияотносятся к инструкциям. Но их запрещено
использовать в выражениях, что иногда может быть
весьма полезным. Поэтому начиная с версии Python
3.8 было решено ввести новую конструкцию NAME
:= expr с возможностью использования в
выражениях (см. пример №8).
• Конструкция получила название выражение
присваивания или же именованное выражение, а
оператор := стал неофициально
называться моржовым оператором.
20. Пример №8. Использование выражений присваивания (часть 1).
Пример №8. Использованиевыражений присваивания (часть 1).
Использовать выражение присваивания в коде верхнего уровня без
скобок запрещается. Например, инструкция x = y := 5 не пройдет,
нужно использовать скобки: x = (y := 5). И вообще, использование
скобок с моржовым оператором следует сразу же взять на
вооружение, т.к. это поможет избежать многих досадных ошибок.
21. Пример №9. Использование выражений присваивания (часть 2).
Пример №9. Использованиевыражений присваивания (часть 2).
Подробнее о выражениях присваивания
можете почитать на официальном сайте в
документации к PEP 572 – Assignment
Expressions.
programming