Star-args, Kwargs, упаковка аргументов, распаковка кортежей и многое другое

Инфикс против префикса / постфикса

Прежде чем мы рассмотрим использование звездочки в Python, полезно рассмотреть разницу между инфиксными и префиксными / постфиксными операторами. Как правило, все сводится к тому, где находится оператор по отношению к операнду и применяется ли оператор к более чем одному операнду.

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

Префиксные и постфиксные операторы применяются до или после одного операнда. На некоторых языках (не на Python) вы можете привыкнуть к тому, что они используются для таких вещей, как увеличение или уменьшение счетчика или другой переменной с помощью a++ или ++a.

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

Оператор умножения

Начиная с самого простого использования звездочки в Python, мы рассмотрим оператор умножения, который является инфиксным оператором. Это просто ваш основной вид умножения. Но, как ни странно, оператор умножения можно использовать с нечисловыми типами для получения интересных результатов.

Оператор умножения можно использовать с любым классом, реализующим метод __mul__ dunder. Если вы не знакомы с методами dunder, можете прочитать здесь.



Мультипликативное присвоение

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

Оператор возведения в степень

Затем у нас есть оператор возведения в степень, который, как и следовало ожидать, возводит первый операнд в степень второго операнда 2**3 = 8. Оператор возведения в степень может быть добавлен для любого класса путем реализации метода __pow__ dunder.

Экспоненциальные присвоения

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

Упаковка аргументов

Упаковка аргументов используется при определении функций, чтобы дать вам больше контроля над тем, что ваша функция может принимать. Как правило, вы можете расширить определение своей функции, разрешив ей принимать либо позиционные аргументы, либо аргументы ключевого слова. Обычно при определении функции вы используете ключевое слово / позиционные аргументы, поскольку каждый аргумент, который вы разрешаете передавать в вашу функцию, имеет имя, привязанное к области действия функции, однако они также могут быть предоставлены позиционно. Использование аргументов ключевого слова дает вам некоторую гибкость, поскольку позволяет передавать аргументы с соответствующими ключевыми словами или без них, что может привести к более чистому коду в некоторых случаях и более легкому пониманию кода в других.

Звездные аргументы

Во время объявления функции одна звездочка может использоваться для обозначения неограниченного числа позиционных аргументов функции. Это может быть полезно, когда вы хотите определить функцию, не имеющую связанного количества позиционных аргументов. Аргументы такого типа часто называют «звездообразными аргументами», потому что они начинаются с префикса * и не могут использоваться после аргументов ключевого слова.

Ключевые слова аргументы

Вы также можете расширить объявление функции, чтобы принять неограниченное количество аргументов ключевого слова, следующих за вашими именованными аргументами. Такие аргументы обычно называются «kwargs» и начинаются с префикса **.

Аргументы только для ключевых слов с позиционными аргументами

В Python 3 также есть синтаксис, разрешающий позиционные аргументы и требующий для некоторых аргументов использовать ключевые слова. Для этого перед последним аргументом в функции, которая может быть указана как позиционный аргумент, помещается *; для всех следующих за ним аргументов потребуются ключевые слова.

Аргументы только для ключевых слов без позиционных аргументов

То же самое функционально может быть достигнуто без использования каких-либо позиционных аргументов, указав единственный * в качестве первого аргумента в определении функции.

Распаковка списка / кортежа

Помимо определения аргументов функции, звездочки в Python также используются для распаковки. Распаковка списков / кортежей была введена в Python 3 как часть PEP-3132. Это упрощает извлечение значений из списков или кортежей в отдельные переменные или подсписки, а также позволяет нам распаковывать список в отдельные аргументы позиционной функции.

Список литералов

В python 3.5 PEP-448 представил возможность использовать * как сокращение для выгрузки типа последовательности в новый список. Один из примеров, который мне нравится, - это работа со словарными элементами. Если вы когда-либо вызывали dict.values() или dict.keys(), вы, вероятно, были удивлены, обнаружив, что, хотя это последовательности значений (например, список), они не поддерживают некоторые стандартные функции последовательности, такие как индексирование. Вместо того, чтобы заключать эти последовательности в list(), теперь вы можете использовать новый синтаксис звездочки для создания нового списка / набора.

Это также можно использовать для быстрого объединения нескольких списков / кортежей / наборов в одну последовательность.

Словарные литералы

Подобно звездочкам в литералах списка, их также можно использовать для создания нового словаря или быстрого объединения нескольких словарей.

Заключение

Надеюсь, теперь очевидно, что со звездочками в Python можно сделать больше, чем просто умножение. Звездочки могут улучшить то, как вы проектируете свои сигнатуры функций, и могут быть особенно полезны при создании библиотек, которые принимают широкий спектр возможных входных данных.

Привет, я Эндрю Скотт, разработчик программного обеспечения и создатель Охрона. Ochrona фокусируется на улучшении безопасности Python, предоставляя понимание зависимостей вашего проекта и делая это с упором на опыт разработчика (DX).

Зарегистрируйтесь для получения нашей рассылки.