Две звезды в питоне

coding

К примеру, что делает * (астериск) в следующем коде:
print(*min(p for p in counter.items() if p[1] == max_count))
print(*team, *coef)
seasons = [datetime(*args) for args in [ (Y, 1, 1), # winter (Y, 3, 1), # spring (Y, 6, 1), # summer (Y, 9, 1), # autumn (Y, 12, 1) # winter ]]def lcm(*args): «»»Least common multiple.»»» return reduce(lambda a, b: a * b // gcd(a, b), args)
async def watchdog(loop, last_activity_time, timeout, func, *args): «Run *func(*args)* if more than *timeout* seconds since *last_activity_time*.» while (loop.time() — last_activity_time()) >> f(1,’a’) (1, ‘a’)
Для именованных параметров используются две звёздочки
def g(a, b, *args, name=’default’, **kwargs): print(a, b, args, name, kwargs)
здесь g() принимает два обязательных аргумента и произвольное (ноль или более) количество других аргументов:
>>> g(1, b=2, c=3) 1 2 () default
kwargs—это словарь дополнительных аргументов, переданных по имени (c в данном случае). А args это пустой кортеж (), так как дополнительных позиционных аргументов не было передано.
После * все параметры обязаны передаваться по имени, пример
def min_item(items, *, key=lambda x: x): .
При вызове, если задан, key обязан быть указан по имени: min([1,2,-3], key=abs)
Принятие произвольного количества аргументов может быть полезно при создании функций-обёрток:
def my_print(*args, **kwargs): flush = kwargs.pop(‘flush’, True) # flush unless overriden print(*args, flush=flush, **kwargs)
При множественном наследовании **kwargs помогает реализовать требование совместимости параметров для методов базовых классов, так как kwargs позволяет передать произвольные именованные аргументы.
Видно, что звёздочку можно использовать и при вызове функции
L = [1, 2, 3] s = «abc» print(*L, *s) # iterable unpacking: print(1, 2, 3, ‘a’, ‘b’, ‘c’) # -> 1 2 3 a b c
произвольные коллекции (iterable в общем случае) L, s распаковываются и каждый их элемент передаётся в виде отдельного агрумента в вызываемую функцию (print()).
Можно использовать и при явном присваивании:
>>> first, *middle, last = L >>> first, middle, last (1, [2], 3)
в этом случае первый и последний аргументы из списка L распаковываются в явно приведённые имена (first, last), а остаток ноль или более элементов в виде списка помещаются в middle
Звёздочку можно использовать и при задании списков, кортежей, наборов и словарей в исходном коде, используя соответствующий синтаксис (tuple, list, set, and dictionary displays):
>>> *range(4), 4 (0, 1, 2, 3, 4) >>> [*range(4), 4] [0, 1, 2, 3, 4] >>> >>> > # dictionary unpacking inside dictionary display
Тонкий момент: запятая в Питоне создаёт кортеж—скобки нужны только для пустого кортежа (). Поэтому первая строчка равнозначна: (*range(4), 4)
Так же как и при вызове функций, звёздочка распаковывает коллекцию здесь и действует как будто каждый элемент был передан отдельно в соответствующие конструкторы.
Таким образом можно сложить два словаря или произвольные отображения (Mapping):
>>> a = >>> b = >>> <**a, **b> >>> <**b, **a>
При наличии дублирующих ключей, более поздние значения побеждают, как обычно: ==
Знание, что делает звёздочка полезно, чтобы объяснить как zip(*matrix) транспонирует квадратную матрицу или как обойти итератор по ровно n элементов за раз: zip(*[iterator]*n)
Помимо указанных значений, звёздочка может присутствовать в имени файла для создания шаблона (wildcard), к примеру
from pathlib import Path
print(*Path().glob(‘*.py’)) print(*Path().glob(‘**/*.py’))
Первый print() печатает через пробел все (ноль или более) имена файлов в текущей директории с расширением .py. Подобный (*.py) синтаксис популярен, так как он используется в командной строке (shell). Второй print() с двумя звёздочками (‘**/*.py’) выводит имена Питон-файлов во всем дереве директорий (включая вложенные директории).
В регулярных выражениях * означает повторение ноль или более раз:
import re
if re.fullmatch(r’x*’, text): print(‘текст пустой или содержит только `x`’)

Читайте также:  Javascript string with length

† умножение натуральных чисел n*m можно рассматривать как повторение сложения (ноль или более) раз. Аналогично, возведение в степень n**m можно рассматривать как повторение умножения:
2 * 3 == 2 + 2 + 2 2 ** 3 == 2 * 2 * 2 [2] * 3 == [2, 2, 2]

Источник

Две звезды в питоне

Звездочка (*), известная как оператор умножения, — широко используемый символ во всех программах. В большинстве случаев нам достаточно использовать его просто как оператор умножения. Однако, если вы серьезно собираетесь стать экспертом по Python-у, то для вас пришло время узнать, насколько полезна и мощна звездочка в Python-е.

Этот статья покажет 5 примеров использования звездочек с достаточно понятными примерами, от самых элементарных до продвинутых.

Применение 1: Оператор умножения или возведения в степень

Самое простое применение — использовать звездочку в качестве инфиксного оператора:

Применение 2: Получение неограниченного количества аргументов

Функция не обязательно должна получать фиксированное количество аргументов. Если вам нужна большая гибкость или вы не уверены, сколько аргументов будет передано в функцию, вы можете передать в неё неограниченное количество аргументов. Время шоу звездочек.

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

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

Условно мы определяем функцию следующим образом, если число ее аргументов может быть не определено:

Применение 3: Использование ключевых аргументов функции

Действительно замечательная возможность использования звездочек — это указать функции принимать только ключевые аргументы.

Пример говорит больше тысячи слов:

Как показано в приведенном выше примере, единственная звёздочка * ограничивает все следующие аргументы; они должны быть переданы в качестве ключевых аргументов.

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

Применение 4: Итеративная распаковка

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

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

Очевидно, что мы можем использовать цикл for для итерации по всем элементам и дальнейшем добавления их в новый список один за другим:

Мы можем таким образом выполнить нашу миссию, но код выглядит очень длинным и не очень “питонистским”.

Более лучшим методом является использование list comprehensions:

Мы уменьшили цикл с трёх строчек, записав его в виде одной строки. Это уже в стиле Python, но это не самый простой способ!

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

Как было сказано выше, мы можем использовать звездочку как префикса для итерируемых объектов для распаковки их элементов.

Кстати, если мы используем одну звёздочку * в качестве префикса словаря, его ключи будут распакованы. Если мы используем двойные звездочки ** в качестве префикса, будут распакованы его значения. Однако мы обязаны использовать ключи, для распаковывания значений. Из-за этого неудобства не принято извлекать элементы словаря звездочками.

Применение 5: Расширенная итеративная распаковка

Этот синтаксис распаковки был введен PEP 3132, чтобы сделать наш код более элегантным.

Этот PEP предлагает изменение синтаксиса итеративной распаковки, позволяя указать «перехватывающее» имя, которое будет присвоено всем элементам списка, не связанных с “обычным” именем.

Вывод

Звездочка — один из наиболее часто используемых операторов в программах. Помимо использования в качестве оператора умножения, в Python существует несколько элегантных и мощных его применений, которые помогут нашему коду стать более “питонистическим”.

Источник

Оцените статью