КОДЕКС
Узнайте, как используются звездочки * в 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)
передает все элементы в weather
list вызову функции 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'}
Что ж, на этом пока все. Пожалуйста, не стесняйтесь оставлять комментарии ниже. Пожалуйста, хлопайте в ладоши, если это вам поможет. Следите за следующей статьей, связавшись со мной.