КОДЕКС

Узнайте, как используются звездочки * в Python за считанные минуты

Это краткое изложение использования звездочек в Python. Всякий раз, когда вам нужно понять, что * делает в вашем коде, вы можете обратиться к этой статье и больше не искать. Он включает 6 основных применений ниже:

Принимать аргументы, содержащие только ключевые слова

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

def my_function(*keys, dictionary, default= None):
   return [
        dictionary.get(key, default)
        for key in keys
    ]

Ожидаемый результат:

>>> my_dict = {'cloudy': 10,'windy': 5,'sunny': 20}
>>> my_function('sunny', 'cloudy', 'smile', dictionary=my_dict,        default='unknown')
>>> [20, 10, 'unknown']

Аргументы dictionary и default идут после *keys, что означает, что их можно только указать как аргументы ключевого слова. Если мы попытаемся указать их позиционно, мы получим ошибку:

>>> my_dict = {'cloudy': 10,'windy': 5,'sunny': 20}
>>> my_function('sunny', 'cloudy', 'smile', my_dict,'unknown')
Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: my_function() missing 1 required keyword-only argument: 'dictionary'

Передача или захват аргументов функции

При вызове функции оператор * может использоваться для распаковки итерации в аргументы в вызове функции:

>>> weather = ['cloudy','windy','sunny']
>>> print(weather[0], weather[1], weather[2])
cloudy windy sunny
>>> print(*weather)
cloudy windy sunny

Эта строка print(*fruits) передает все элементы в weatherlist вызову функции print как отдельные аргументы, без необходимости знать, сколько аргументов находится в списке. * отправляет все элементы в итеративном режиме, поскольку без него отдельные аргументы были бы невозможны.

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

from random import randint  
def roll(*dice):     
   return sum(randint(1, die) for die in dice)
>>> roll(20)
18
>>> roll(6, 6)
9
>>> roll(6, 6, 6)
8

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

>>> my_dict = {'cloudy': 10,'windy': 5,'sunny': 20}
>>> weather_score = [{cloudy}, {windy}, {sunny}].format(**my_dict)
>>> weather_score
'10, 5, 20'

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

def tag(tag_name, **attributes):
    attribute_list = [
        f'{name}="{value}"'
        for name, value in attributes.items()
    ]
    return f"<{tag_name} {' '.join(attribute_list)}>"
>>> tag('a', href="https://medium.com/@rylezhou") 
'<a href="https://medium.com/@rylezhou">'
>>> tag('img', height=1280, width=960, src="asterisks.jpg")
'<img height="1280" width="960" src="asterisks.jpg">'

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

Оператор * теперь также можно использовать при распаковке кортежа:

>>> weather = ['cloudy','windy','sunny'] 
>>> today, tomorrow, *remaining = weather 
>>> remaining
['sunny']
>>> today, *remaining = weather
>>> remaining 
['windy', 'sunny']
>>> today, *tomorrow, last = weather
>>> tomorrow
['windy']

Вы также можете выполнить вложенную распаковку:

>>> weather = ['cloudy','windy','sunny']
>>> ((first_letter, *remaining), *others) = weather
>>> remaining
['l', 'o', 'u', 'd', 'y']
>>> others
['windy', 'sunny']

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

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

def link(sequence):     
   return list(sequence) + list(reversed(sequence))

Теперь, если мы используем *, мы можем переписать его как:

def link(sequence):     
   return [*sequence, *reversed(sequence)]

Распаковать словари в другие словари

Оператор ** может использоваться для выгрузки пар ключ / значение из одного словаря в новый словарь:

>>> date_info = {'year': "2020", 'month': "01", 'day': "01"}
>>> track_info = {'artist': "Beethoven", 'title': 'Symphony No 5'}
>>> all_info = {**date_info, **track_info}
>>> all_info
{'year': '2020', 'month': '01', 'day': '01', 'artist': 'Beethoven', 'title': 'Symphony No 5'}

Что ж, на этом пока все. Пожалуйста, не стесняйтесь оставлять комментарии ниже. Пожалуйста, хлопайте в ладоши, если это вам поможет. Следите за следующей статьей, связавшись со мной.