Переменные и вывод информации¶
Настало время приступить к изучению непосредственно Python, ведь по прошествии пары лекций об языке программирования и не говорили вовсе! Начнем со знакомой всем по школьным карандашам формулы \(E=mc^2\) . По ней можно вычислить полную энергию физического объекта \(E\) с помощью известной массы объекта \(m\) и константы \(c\) . Эта постоянная, указывающая на скорость света в вакууме, используется настолько часто, что для нее выделили отдельное обозначение в виде буквы латинского алфавита, как и для многих других аналогичных величин. Если в формуле встречается \(c\) (в известном контексте), то вы всегда уверены, что именно нужно подставить при расчетах.
Этот пример полностью описывает концепцию в языках программирования, и Python не исключение. Запись \(x = 3\) означает, что везде по тексту далее под иксом подразумевается именно тройка, и ничего другого (пока не будет введено новое определение). Этой же логике подчиняется Python. Сначала указывается имя переменной, а затем – ассоциируемое с ней значение.
Пример кода выше иллюстрирует сразу несколько базовых концепций, которые нужно запомнить:
- В объявлении переменной нет ничего сложного. Синтаксис и правила интуитивно понятны: это можно делать как в физике/математике, как в учебниках и статьях.
- # означает комментарий, то есть произвольный текст, который не воспринимается Python (все кода полностью игнорируется). Служит исключительно для создания подсказок в коде, объяснения происходящего, то есть для удобства.
- Числа могут быть . Разряды в целых числах для удобства визуального восприятия можно разделять нижней чертой.
- , то есть являться производной от других переменных (как \(E\) , ведь это результат перемножения). На самом деле значение вычисляется в момент объявления переменной (при сложной формуле расчета процесс может занимать некоторое время).
- Операция возведения в степень реализуется с помощью ** .
- В качестве названия переменных можно использовать и , а также некоторые символы. Однако .
- Переменные можно переопределять (и даже менять тип). Однако . В данном примере после выполнения последней строчки нельзя установить, чему было равно \(m\) до того, как переменной было присвоено значение дюжины.
Если говорить менее строго и более абстрактно, то (или коробка), в котором что-то лежит, и на самой коробке на приклеенном листочке бумаги указано содержимое. Чем понятнее надпись, тем легче найти и использовать объект (поэтому переменные с названием из одной буквы воспринимаются плохо, особенно если таких переменных очень много).
[Объявить переменную — значит положить объект в коробку с подписью](https://stevenpcurtis.medium.com/what-is-a-variable-3447ac1331b9)
Типы переменных¶
В листинге кода выше важно заметить, что существует разница между двумя типами численных переменных: и . При сугубо математических расчетах и арифметических операциях тип переменной не имеет значения. Однако для некоторого функционала нужно быть аккуратным. Поговорим подробно об этом в следующих лекциях, а пока стоит запомнить, что вещи, которые необходимо посчитать – в том числе и чего-то счетного – должны быть целочисленными (как и в жизни: первый, второй, третий . ).
Целочисленный тип называется (от Integer ), вещественный – . Эти типы можно переводить из одного в другой. При переводе вещественного числа в целое теряется часть информации.
– и это относится не только к числам, но и к объекту – можно узнать с помощью функции type . Для вывода информации используется функция print . Что именно представляет собой функция рассмотрим в более поздних лекциях, пока стоит думать об этом как о некотором объекте, который зависит (рассчитывается) от других объектов и выдает некоторый результат. Для передачи аргументов используются круглые скобки (аналогично математике: \(y = F(x)\) ). Давайте скомбинируем эти знания и рассмотрим пример:
Внимательно проанализируйте код выше – в нем продемонстрирован базовый синтаксис и .
Легко увидеть подтверждение высказанных ранее тезисов: second_variable действительно потеряла часть информации (дробную часть числа), которую нельзя вернуть, если преобразовать переменную обратно во float . Преобразование типов в языках программирования называется (типов, то есть привести одно к другому, а не из-за страшилок про духов).
Арифметические операции с числами¶
Математика Python максимально близка к естественной: + , — , * и ** (рассмотренное ранее возведение в степень) работают в точности как ожидается. С делением / есть нюанс: .
Обратите внимание, что операции не изменяют переменную саму по себе (то есть операция a + b не меняет ни a , ни b ). Чтобы сохранить получаемое значение, нужно присвоить его некоторой переменной (в примере выше это c ). Если хотите изменить непосредственно саму переменную, то можно переприсвоить ей значение на основе расчета: a = a + b или c = c + 12 .
Даже несмотря на то, что пример с делением числа на само себя очевиден (всегда получается единица, кроме деления на нуль), будет выведено вещественное значение. Сами же вещественные значения можно складывать, вычитать, умножать и возводить в степень как с целыми, так и с вещественными числами (и наоборот). Если в таком выражении используется хотя бы одна float -переменная, то и результат будет не целочисленным. Однако:
Это практически все тонкости, которые необходимо знать, чтобы не совершать базовые ошибки.
Скорее всего, появился вопрос относительно расстановки пробелов в коде. Обязательно ли соблюдать такой синтаксис? Нужно ли ставить пробелы до и после знаков операций? На самом деле нет: это делается исключительно для удобства чтения кода и . Код ниже выполнится без ошибок, однако ухудшается читаемость:
Строковые переменные¶
Разобрались в том, как описывать и хранить числа, как производить арифметические расчеты. Базовый математический язык освоен, но хочется общаться словами! Конечно, Python позволяет это делать. Благодаря можно хранить и соединять текстовую информацию:
В примере рассмотрено три способа создания текстовых переменных. Первые два не отличаются между собой с точки зрения Python , то есть неважно, используются одинарные кавычки ‘ или двойные » . Однако стоит понимать, что если строка содержит в себе такой символ, то кавычка должна быть изменена:
Механизм ошибки таков, что Python неясно: строчка намеренно закончена и дальше идет какая-то команда, или же строчка продолжается. В обоих случаях – и тогда все будет хорошо:
Если необходимо сохранить какой-либо объемный текст или сообщение, можно воспользоваться мультистрочным объявлением переменной, как в первом примере блока.
Строки можно объединять для удобства вывода информации. Склеивание строк называется .
- Обратите внимание на пробел между числом и точкой в первом случае. Они добавлены автоматически функцией print – это сделано для того, чтобы разные объекты при последовательном выводе не «склеивались» друг с другом. Во втором случае этого не происходит, так как напрямую склеиваются строки и только затем передается результат конкатенации на печать в print .
Будьте аккуратны со сложением строк. Объединение строк «3» и «5» даст результат «35» , а не 8 – и тип результирующего значения . : получите ошибку и никакого приведения типов не произойдет. Здесь возникнет двусмысленность – нужно привести число к строке и затем сконкатенировать или же строку к числу (а вдруг это невозможно?), после чего сложить.
Попробуйте в объединить строковые, целочисленные и вещественные переменные в разных комбинациях. Разберитесь, что означает ошибка, которая будет выведена в случае, если не делать приведение типов (то есть без str в str(result) ).
Но на практике это не совсем удобно, поэтому в Python придумали f -строки. Их суть в том, что переменная из кода напрямую подставляется (с автоматическим приведением типа к строке) в саму строку! Вот:
Для объявления f -строки нужно
- использовать одинаковые кавычки на концах текста
- указать литеру f перед самой строкой
- обрамить название конкретной переменной ( result в данном случае) в фигурные скобки.
Когда переменная одна, а также нет текста после её использования, то выгода F -строк не так очевидна (относительно простого print(some_string, some_variable) ). Однако представьте, что нужно вывести координаты точки в трехмерном пространстве, значение времени, параметры системы и значение некоторой функции от всех переменных выше!
Изучение Python: от нуля до мастера
![]()
Первым делом спросим себя, что такое Python? Создатель языка, Гвидо ван Россум, описывает его следующим образом:
“Язык программирования высокого уровня, главная идея которого — это простая читабельность и синтаксис, который позволяет программистам выражать концепцию программы парой строк кода”
Лично для меня, первой причиной изучать Python было то, что это очень красивый язык программирования, выражать мысли в котором просто и естественно.
Следующей причиной было то, что Python мультизадачный. Мы можем его использовать для анализирования данных, разработки сайтов, машинного обучения. Quora, Pinterest и Spotify используют именно Python для своего back-end’а. Хорошая мотивация, чтобы узнать чуть больше об этом.
Основы
1. Переменные
Вы можете думать о переменных, как о словах, что держат в себе какое-то значение. Очень просто.
В Python нет ничего проще, чем определить переменную и присвоить ей какое-то значение. Представьте, что мы ходим сохранить число 1 в переменной, которую назовём “one”. Это будет выглядеть следующим образом
Что может быть проще? И при этом вы только что присвоили значение 1 для переменной “one”.
И таким образом вы можете присвоить любое значение любой переменной. И как видно в примере кода повыше, переменная “two” хранит числовое значение 2, а переменная “some_number” хранит значение 10,000.
Помимо числовых значений, мы также можем использовать логические (true/false, в переводе истинно/ложно), строки, десятичные числа и много других типов.
2. Контролирование потока: условные состояния
Ключевое слово “if” используется для ситуаций, когда нам нужно выполнить разные действия при положительных или отрицательных условиях. При значении “истинно” будет выполняться описанный после слова “if” блок, например:
2 больше, чем 1, поэтому выполняется “print”-команда.
Блок “else” выполнится при условии, если условие “if” ложно.
Так как 1 не больше 2, то выполняется в блоке “else”.
Также можно использовать “elif” условие:
3. Циклы / итерации
В Python, можно создавать циклы различными способами. Мы расскажем о двух: while и for.
Цикл While: до тех пор, пока условие истинно, код внутри цикла будет выполняться. Таким образом, следующий код напишет числа от 1 до 10.
Циклу while нужно “условие повтора”. Если оно остаётся истинным, итерации продолжаются. В приведённом примере, когда значение num становится 11, условие цикла становится ложным.
Ещё один небольшой пример, чтобы лучше понять цикл while:
Условие цикла(loop condition) установлено в True, поэтому цикл будет выполняться до тех пор, пока мы не переключим его в значение False.
Цикл for: в цилке for мы назначаем переменную “num” для самого цикла, который в свою очередь будет увеличивать значение этой переменной. Следующий код напишет числа от 1 до 10 точно так же, как и цикл while:
Видите? Очень просто. Цикл начинается с 1 и продолжается до 11 элемента.
Списки: коллекция, массив, структура данных
Представьте что вы хотите сохранить значение 1 в переменной. или может теперь вы хотите сохранить 2. А ещё 3, 4, 5…
Есть ли иной способ хранить все числа, что нам нужны, не имея при этом, не создавая при этом миллионы переменных? Как оказывается, есть иной способ хранить их всех.
Список(массив) это коллекция, которая может быть использована для хранения нескольких значений(в нашем случае чисел). Используется он следующим образом:
Это действительно просто. Мы создали список и сохранили его в my_integers.
Но затем мы спросим себя: “А как нам получить нужное значение из списка?”.
Хороший вопрос. В списках есть концепция, которая зовётся номером(индексом). Номером первого элемента в списке является 0, следующий получает 1 и так далее.
Чтобы донести это проще, мы можем представить список, у которого каждый элемент подписан своим номером. Как на следующей картинке:
Используя синтаксис Python не сложно понять и следующее:
Представьте, что мы больше не хотим хранить числа. Вместо этого мы хотим составить список имён наших знакомых. Мой выглядел бы следующим образом:
Это работает точно так же, как и с числами. Неплохо.
Только что мы выучили, как работают индексы в списках. Но мне всё ещё нужно показать вам, как добавить новый элемент в список.
Самая простая функция, которую можно использовать для этого — зовётся append. Работает она следующим образом:
Функция append донельзя проста. Вам всего лишь нужно использовать новый элемент(в примере выше это “The Effective Engineer”) как значение это функции.
Ну что же, достаточно о списках. Перейдём к следующей структуре данных.
Словарь: структура данных в виде ключ-значение
Теперь мы знаем, что списки пронумерованы числовыми значениями. Но что, если мы не хотим использовать числа для идентификации элемента? Некоторые виды структур данных могут использовать числа, строки, или другие виды идентификации.
Одним из таких типов является словарь. Словарь это коллекция пар ключ-значение. Вот так это выглядит:
Ключ указывает на значение. Чтобы получить доступ к какому-либо значению — нам нужно обратиться к его ключу. Делается это следующим образом:
Я создал словарь о себе. Моё имя, никнейм и национальность. Эти атрибуты ключи в словаре.
Похожим образом на то, как мы получаем элемент из списка по его номеру, точно так же мы получаем значения словарей по их ключам.
В примере я написал предложение о себе используя значения, которые хранятся в словаре. Довольно просто, не правда ли?
Ещё одной хорошей особенностью словарей является то, что мы можем использовать что угодно в качестве значения. В том словаре, что я создал, я хочу добавить новый ключ “age”(возраст) и числом мой реальный возраст в качестве значения:
Здесь у нас пара из ключа(age) и значения(24). При этом ключ это строка, а значение это число.
Точно также как со списками, давайте научимся добавлять новый элемент в словарь. Ключ указывающий на значение — главная особенность словаря. И это же одна из особенностей при добавлении нового элемента в словарь:
Нам просто нужно дописать значение для существующего ключа в словаре. Ничего сложного, не так ли?
Итерации: циклы для структур данных
Как описывалось выше — итерации в списках довольно просты. Обычно Python-разработчики используют цикл for. Давайте посмотрим как это выглядит:
Таким образом, за каждую книгу на книжной полке(bookshelf) мы вызываем функцию print. Достаточно просто и интуитивно. Это Python.
Для хэш-структуры данных мы используем тот же цикл for, но в качестве счётчика выступает key:
Это пример того как мы используем этот цикл. За каждый ключ в словаре, мы используем print для вывода ключа и его значения.
Также есть другой способ сделать это используя функцию iteritems.
Мы назвали наши параметры как key и value, но в этом нет необходимости. Мы можем назвать их как угодно. Давайте проверим это:
В данном примере мы использовали attribute, как параметр для ключей словаря. Как видим, всё работает корректно. Отлично!
Классы и объекты
Немного теории:
Объекты это представление предметов из реальной жизни, например машин, собак, велосипедов. У объектов есть две основных характеристики: данные и поведение.
У машин есть данные, например количество колёс или сидячих мест. Также у них есть поведение: они могут разгоняться, останавливаться, показывать оставшееся количество топлива и другое.
В объектно-ориентированном программировании мы идентифицируем данные как атрибуты, а поведение как методы. Ещё раз:
Данные → Атрибуты; Поведение → Методы
Класс это как чертёж, из которого создаются уникальные объекты. В реальном мире есть множество объектов с похожими характеристиками. Например, машины. Все они имеют какую-то марку или модель(точно так же как и двигатель, колёса, двери и так далее). Каждая машина была построена из похожего набора чертежей и деталей.
Активировать объектно-ориентированный режим Python
Python, как объектно-ориентированный язык программирования, имеет следующие концепции: классы и объекты.
Класс — это чертёж, модель для его объектов.
Ещё раз, класс — это просто модель, или способ для определения атрибутов и поведения(о которых мы говорили в теории выше). Например, класс машины будет иметь свои собственные атрибуты, которые определяют какие объекты являются машинами. Количество колёс, тип топлива, количество сидячих мест и максимальная скорость — всё это является атрибутами машин.
Держа это в уме, давайте посмотрим на синтаксис Python для классов:
Мы определяем классы class-блоком и на этом всё. Легко, не так ли?
Объекты это экземпляры классов. Мы создаём экземпляр тогда, когда даём классу имя.
Здесь car это объект(экземпляр) класса Vehicle.
Помните, что наш класс машин имеет следующие атрибуты: количество колёс, тип топлива, количество сидячих мест и максимальная скорость. Мы задаём все атрибуты когда создаём объект машины. В коде ниже, мы описываем наш класс таким образом, чтобы он принимал данные в тот момент, когда его инициализируют:
Мы используем метод init. Мы называем этот конструктор-методом. Таким образом, когда мы создаём объект машины, мы можем ещё и определить его атрибуты. Представьте, что нам нравится модель Tesla S и мы хотим создать её как наш объект. У неё есть четыре колеса, она работает на электрической энергии, есть пять сидячих мест и максимальная скорость составляет 250 км/ч. Давайте создадим такой объект:
Четыре колеса + электрический “вид топлива” + пять сидений + 250 км/ч как максимальная скорость.
Все атрибуты заданы. Но как нам теперь получить доступ к значениям этих атрибутов? Мы посылаем объекту сообщению с запросом атрибутов. Мы называем это метод. Это поведение объекта. Давайте воплотим эту идею:
Это реализация двух методов: number_of_wheels и set_number_of_wheels. Мы называем их получатель и установщик. Потому что получатель принимает значение атрибута, а установщик задаёт ему новое значение.
В Python мы можем реализовать это используя @property для описания получателя и установщика. Посмотрим на это в коде:
Далее мы можем использовать методы как атрибуты:
Это немного отличается от описания методов. Эти методы работают как атрибуты. Например, когда мы задаём количество колёс, то не применяем два как параметр, а устанавливаем значение двойки для number_of_wheels. Это один из способ написать получать и установщик в Python.
Ещё мы можем использовать методы для других вещей, например создать метод “make_noise”(пошуметь).
Когда мы вызовем этот метод, он просто вернётся строку “VRRRRUUUUM”.
Инкапсуляция: сокрытие информации
Инкапсуляция — это механизм, который ограничивает свободный доступ к данным и методам объекта. Но в то же время, это упрощает доступ к данным(методам объекта).
“Инкапсуляция может использоваться для сокрытия данных и функций. Под определением инкапсуляции имеется ввиду то, что внутреннее представление объекта сокрыто от просмотра вне определения объекта.” — Википедия
Вся внутренняя реализация объекта недоступна извне. Только сам объект может взаимодействовать со своими внутренними данными.
Для начала нам нужно понять как работают публичные и не-публичные переменные и методы.
Публичные экземпляры данных
Для Python-класса мы можем инициализировать публичный экземпляр переменной внутри нашего конструктор-метода. Давайте посмотрим:
Здесь мы применяем значение first_name как аргумент для публичного экземпляра переменной.
Здесь нам не нужно применять first_name как аргумент, а все экземпляры объектов будут иметь заранее прописанный атрибут класса. В нашем случае first_name будет заполнено строкой “ТК.
Круто. Теперь мы узнали как можно использовать публичные экземпляры переменных и атрибуты класса. Ещё одна интересная особенность публичных данных в том, что мы можем управлять значениями переменных. Что я имею в виду под этим? Наш объект может управлять значением переменной: получать и устанавливать значения переменной.
Помня о классе person зададим значение для переменной first_name
Вот и всё. Мы просто задали другое значение(kaio) экземпляру переменной first_name и оно обновилось. И всё на этом. Поскольку это публичная переменная, то мы можем делать это так.
Не-публичные экземпляры данных
Мы не используем термин “приватный”, поскольку в Python нет действительно приватных атрибутов(если только не задаваться тяжёлой целью создать их). — PEP 8
Точно так же, как с публичными экземплярами переменных, мы можем объявить и не-публичные экземпляры. Оба внутри конструктор-метода или внутри класса. Синтаксис несколько отличается: не-публичные экземпляры переменных должны начинаться с нижнего подчёркивания(“_”) перед именем переменной.
“‘Приватный’ экземпляр данных, доступ к которому открыт только изнутри, не существует в Python. Тем не менее, есть условность, которая выполняется в большей части Python-кода: имена с префиксом “_”(например, “_spam”) должны обрабатываться как не-публичные части API(будь то функция, метод или какие-то данные)” — Python Software Foundation
Увидели переменную email? Вот так мы описываем не-публичную переменную:
Мы имеем доступ и может обновить это. Не-публичные переменные это условность, при которой эти переменные обрабатываются как не-публичная часть API.
Таким образом мы создаём метод, который позволяет нам вносить изменения внутри определения класса. Давайте реализуем два метода(email и update_email), чтобы понять это:
Теперь мы имеем доступ и можем обновить значения не-публичных переменных используя эти методы. Посмотрим:
- Мы объявили новый объект, в котором first_name заполнено строкой “ТК” и email заполнено строкой “tk@mail.com”
- Выводим email получая доступ к не-публичной переменной через метод
- Пробуем задать новый email извне нашего класса
- Нам нужно обращаться в не-публичной переменной как к не-публичной части API
- Обновляем нашу не-публичную переменную с нашим методом экземпляра
- Успех! Мы можем обновить это внутри нашего метода с помощью метода-помощника
Публичные методы
Публичные методы мы тоже можем использовать вне класса:
Давайте протестируем это:
Прекрасно. Мы можем использовать это без каких-либо проблем.
Не-публичные методы
Но не-публичные методы мы не можем использовать так просто. Давайте реализуем тот же класс Person, но теперь метод show_age станет не-публичным с нижним подчёркиванием.
А теперь попробуем вызвать этот не-публичный метод с помощью нашего объекта:
У нас есть доступ и мы можем обновить это. Не-публичные методы это просто условность, при которых они обрабатываются как не-публичная часть API.
Здесь пример того, как мы можем использовать это:
Здесь у нас есть не-публичный метод _get_age и публичный метод show_age. show_age может использоваться нашим объектом(вне класса), в то время как _get_age используется только внутри определения нашего класса(внутри метода show_age). Но опять же, в виду условностей.
Вывод об инкапсуляции
С помощью инкапсуляции мы можем убедиться, что наша внутренняя реализация объекта сокрыта от внешних манипуляций.
Наследование: поведение и характеристики
Разные объекты могут иметь некоторую схожесть, обладать поведением и характеристиками.
Например, я унаследовал какие-то характеристики и поведение от своего отца. Я получил его глаза и волосы в качестве своих характеристик, а его нетерпеливость и интровертность в качестве своего поведения.
В объектно-ориентированном программировании классы могут наследовать простые характеристики(данные) и поведение(методы) от других классов.
Давайте посмотрим другой пример и реализуем его в Python.
Представьте машину. Количество колёс, сидячих мест и максимальная скорость — всё это атрибуты машины. Мы можем сказать, что класс электромашины наследует эти схожие характеристики от обычного класса машины.
Наш класс машины реализует:
Один раз реализовав, мы можем использовать все созданные экземпляры переменных. Неплохо.
В Python, мы применяем класс-родитель к нашему классу-наследнику как параметр. Класс электромашины может наследоваться от класса машины.
Вот так просто. Нам не нужно реализовывать какой-либо другой метод, потому что этот класс уже имеет его(унаследовав от класса машины). Давайте докажем это:
Инструкции присваивания в Python
В Python , как и во многих других языках программирования, каноническая форма операции присваивания имеет вид a = b , где слева от оператора присваивания записывается целевое имя переменной или компонент объекта, а в качестве правого операнда выступает произвольное выражение, которое в результате вычислений дает объект (см. пример №1 ).
Пример №1. Каноническая форма присваивания.
Как видим, присваивание действительно выполняется достаточно просто. Однако при этом хотелось бы обратить внимание на следующие особенности присваивания в Python :
- Инструкции присваивания всегда сохраняют ссылки на объекты, например, в переменных или в элементах структур данных, и никогда не создают копии присваиваемых объектов. Как следствие, переменные в Python больше напоминают указатели, чем области хранения данных.
- Объявлять переменные заранее нельзя, т.к. интерпретатор создает переменные в момент присваивания им значений (то есть ссылок на объекты). После инициализации, когда имя переменной будет встречаться в выражениях, оно будет автоматически замещаться объектом, на который ссылается данная переменная. Если же интерпретатор встретит в программе неинициализированную переменную, он возбудит исключение вместо того, чтобы вернуть какое-либо значение по умолчанию (такое поведение призвано облегчить поиск ошибок и опечаток в коде).
- Некоторые инструкции пусть и неявно, но тоже выполняют операцию присваивания. Примерами могут служить импорт модуля, определение функции или класса, указание переменной в цикле for или же передача аргументов функции. В любом случае результатом явных или неявных инструкций присваивания будет связывание имен с ссылками на объекты.
Ну, и в конце пункта еще раз напомним, что в программировании знак равно ( = ) обычно означает не равенство двух величин, а присваивание значения переменной. Если же нужно указать на равенство двух значений, то используется комбинация символов из двух знаков равно ( == ).
Комбинированные инструкции присваивания
В дополнение к базовой инструкции присваивания в Python имеется и целый ряд комбинированных инструкций присваивания, которые объединяют операцию присваивания с другой операцией. В общем виде инструкцию присваивания с комбинированным оператором x operator= y можно считать сокращенной записью инструкции x = x operator y . Например, x += y является сокращенной записью инструкции присваивания x = x + y , в которой к значению переменной x прибавляется значение переменной y , а результат присваивается переменной x (см. пример №2 ).
Пример №2. Комбинированная форма присваивания.
Таким образом, комбинированная инструкция присваивания объединяет в себе выражение и присваивание, являясь по сути краткой формой записи кода. И хотя, например, инструкции num += 25 и num = num + 25 дадут один и тот же результат, первая из них выглядит явно компактнее. Кроме того, если объект справа относится к категории изменяемых объектов и поддерживает указанную операцию, комбинированная инструкция присваивания может выполняться даже быстрее за счет непосредственного изменения объекта вместо создания и изменения его копии (см. пример №3 ).
Пример №3. Преимущества комбинированной формы присваивания.
Метод time() одноименного модуля time стандартной библиотеки Python возвращает время, выраженное в секундах с начала эпохи. В операционных системах Unix , например, за начало эпохи принимается 1 января 1970 , 00 : 00 : 00 ( UTC ). Но поскольку в программах в основном используются интервалы времени между двумя событиями, а не время, прошедшее с начала эпохи, знать дату начала эпохи какой-либо конкретной операционной системы вовсе необязательно, т.к. разница между двумя временными точками для всех платформ получается совершенно одинаковой.
Давайте еще раз и в одном месте перечислим основные инструкции присваивания, комбинированные с арифметическими операторами:
- 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 .
Позиционное присваивание
Еще одной формой присваивания в Python является , которое связывает объекты последовательностей справа от оператора присваивания с именами, перечисляемыми слева от него. При этом присваивание выполняется слева направо согласно местоположениям имен и соответствующих им объектов (см. пример №4 ).
Пример №4. Позиционное присваивание (часть 1).
Как видим, данная форма присваивания позволяет смешивать последовательности разных типов. Здесь главное, чтобы количество присваиваемых значений совпадало с количеством переменных, которым эти значения будут присваиваться. Но и эта проблема может быть решена за счет имеющейся возможности использования в присваивании расширенного синтакиса распаковывания последовательностей (см. пример №5 ).
Пример №5. Позиционное присваивание (часть 2).
Благодаря наличию имени со звездочкой все лишние значения автоматически помещаются в соответсвующий список именно так, как и ожидается. Однако нужно не забывать, что можно использовать только одну переменную со звездочкой, а сама переменная должна принадлежать последовательности даже в том случае, если она будет одна (поставив запятую в инструкции *c, = [1, 2] мы автоматически получили кортеж и смогли избежать ошибки).
Следует добавить, что расширенная операция распаковывания последовательностей может использоваться не только в случаях явного присваивания значений, но также и в заголовках циклов, вызовах функций и других операциях неявного присваивания значений.
Групповое присваивание одного значения
В случае группового присваивания объект, расположенный справа, присваивается всем переменным группы (см. пример №6 ). В результате несколько отдельных инструкций присваивания могут быть заменены одной эквивалентной и более компактной инструкцией.
Пример №6. Присваивание одного значения группе переменных (часть 1).
Следует иметь в виду, что при групповом присваивании в памяти создается всего лишь один объект, разделяемый всеми переменными группы. Поэтому такая форма присваивания будет полезна для неизменяемых объектов, например, чисел или строк. А вот при использовании изменяемых объектов типа списков или словарей нужно быть осторожными, т.к. изменение объекта через одну из переменных группы будет оказывать влияние и на другие переменные (см. пример №7 ). Это связано с тем, что переменные в Python хранят не сами объекты, а ссылки на них. А раз так, то даже после изменения объекта через одну из ссылок все остальные по-прежнему будут указывать на тот же, пусть и модифицированный, объект.
Пример №7. Присваивание одного значения группе переменных (часть 2).
Таким образом, во избежание проблем с изменяемыми объектами, их инициализацию лучше производить в отдельных инструкциях, как было показано в первой части примера №6 .
Выражения присваивания в Python
Все рассмотренные нами формы присваивания относятся к инструкциям. Но их запрещено использовать в выражениях, что иногда может быть весьма полезным. Поэтому начиная с версии Python 3.8 было решено ввести новую конструкцию NAME := expr с возможностью использования в выражениях (см. пример №8 ). Конструкция получила название или же , а оператор := стал неофициально называться .
Пример №8. Использование выражений присваивания (часть 1).
Использовать выражение присваивания в коде верхнего уровня без скобок запрещается. Например, инструкция x = y := 5 не пройдет, нужно использовать скобки: x = (y := 5) . И вообще, использование скобок с моржовым оператором следует сразу же взять на вооружение, т.к. это поможет избежать многих досадных ошибок.
Возможно, кто-то сочтет такое нововведение нецелесообразным, ведь выражения порой и так бывают довольно громоздкими, чтобы вводить туда еще и дополнительные конструкции с набором ограничений. Но ситуации бывают разные как, например, в примере №9 .
Пример №9. Использование выражений присваивания (часть 2).
Подробнее о выражениях присваивания можете почитать на официальном сайте в документации к PEP 572 – Assignment Expressions.
Краткие итоги параграфа
- В Python инструкции присваивания всегда сохраняют ссылки на объекты, например, в переменных или в элементах структур данных, и никогда не создают копии присваиваемых объектов.
- Классическая форма присваивания имеет вид NAME = expr , что соответствует синтаксису многих других языков программирования. Однако в Python доступны и другие формы инструкций присваивания: комбинированные инструкции присваивания (например, y **= 3 ), позиционное присваивание (например, x, y = [3, 5] или x, *y = ‘abcdef’ ), а также групповое присваивание одного значения (например, a = b = c = 33 ).
- При групповом присваивании одного значения в памяти создается всего лишь один объект, разделяемый всеми переменными группы. Поэтому такая форма присваивания будет полезна для неизменяемых объектов, например, чисел или строк. А вот при использовании изменяемых объектов типа списков или словарей нужно быть осторожными, т.к. изменение объекта через одну из переменных группы будет оказывать влияние и на другие переменные.
- Поскольку в Python запрещается использовать инструкции в выражениях, начиная с версии 3.8 была введена специальная конструкция NAME := expr , получившая название выражения присваивания и предназначенная для присваивания значений внутри выражений, например, a = (b := 3) + (c := 5) .
Вопросы и задания для самоконтроля
1. Перечислите основные формы инструкций присваивания в Python . Показать решение.
Ответ. Классическая форма NAME = expr , комбинированные инструкции присваивания NAME operator= expr , позиционное присваивание NAME_1, . NAME_n = expr_1, . expr_n , а также групповое присваивание одного значения NAME_1 = . = NAME_n = expr .
2. Имеются две инициализированные переменные a = ‘one’ и b = ‘two’ . Поменяйте значения переменных местами, использовав позиционную форму инструкции присваивания. Показать решение.
Ответ. Так как в процессе позиционного присваивания интерпретатор создает временный кортеж, где сохраняются оригинальные значения переменных справа, данная форма присваивания может использоваться для реализации обмена значений переменных без создания временной переменной. Таким образом, кортеж справа автоматически запоминает предыдущие значения переменных.
3. О чем следует помнить, когда трем переменным присваивается один и тот же изменяемый объект? Показать решение.
Ответ. Если, например, выполнить присваивание следующим образом: a = b = c = [] , то все три переменные будут ссылаться на один и тот же объект. Поэтому непосредственное изменение объекта с помощью одной переменной (например, A.append(5) ) отразится и на других. Однако это справедливо только для изменений, производимых непосредственно в изменяемых объектах, таких как списки или словари. Для неизменяемых объектов, вроде чисел и строк, такой проблемы не возникает.
4. Какие из представленных фрагментов кода содержат ошибки: a, b = [3, ‘3’] ; x, *y = 1, 2, 3 ; *x, = 1, 2, 3 ; *x, y, *z = 1, 2, 3, 4 ? Объясните ответ. Показать решение.
Ответ. Все фрагменты кода, кроме последнего, верны. А вот последняя инструкция содержит две переменные со звездочкой, что расширенным синтаксисом распаковывания последовательностей не допускается.
Python как присвоить значение переменной









- Теория
- Stepik.org
Переменные в Python
Переменная — именованная область памяти, предназначенная для хранения значения. Переменную можно представить в виде коробочки, в которую вы можете хранить одно значение. Зная имя коробки, вы всегда можете обратиться к ее содержимому или заменить его другим значением
Создать переменную в Python очень просто — нужно придумать имя переменной(идентификатор) и присвоить ему значение при помощи оператора присваивания «=».
Каждая переменная включает в себя 3 составляющие
- 1 Имя переменной (идентификатор)
- 2 Значение переменной
- 3 Тип переменной (тип объекта, который хранится в переменной)
Имя переменной
Существует ряд правил, которых следует придерживаться при выборе имени переменной.
- Имена переменных не могут содержать пробелов
- Имена переменных могут состоять только из букв, цифр и нижнего подчёркивания
- Регистр символов имеет значение
- Имя переменной не может начинаться с цифры
- Нельзя использовать ключевые слова
Переменная — ссылка на объект
Перед тем, как обращаться к содержимому переменной, необходимо сперва создать переменную, присвоив ей значение. В примере ниже мы обращаемся к несоздаенной переменной b и получаем ошибку NameError
Переменная (то есть имя или индификатор как например имя а в примере выше), создается автоматически, когда в программе ей впервые присваивается некоторое значение. Все последующие операции присваивания просто изменяют значение, ассоциированное с уже созданным именем.
Переменные не имеют никакой информации о типе или ограничениях, связанных с ним. Понятие типа присуще объектам, а не именам. Переменные являются всего лишь ссылками на конкретные объекты в определенные моменты времени.
Когда переменную используют в выражении, вместо ее имени подставляется объект, на который она в настоящий момент ссылается, независимо от того, что это за объект.
Тип значения определяет объект, а не переменная
Для проверки типа значения используется функция type(). Если ей передать переменную, она покажет к какому типу данных относится объект, на который ссылается переменная.