Бывают ситуации, когда для функции, требующей отдельных позиционных аргументов, значения этих аргументов уже находятся в списке или кортеже, и для вызова функции должны быть распакованы.
Например, встроенная range()
функция ожидает отдельные аргументы start
и stop
. Если они не доступны отдельно, то можно распаковать аргументы из списка list
или кортежа tuple
, вызвав функцию с переменной этого списка/кортежа, а впереди нее поставить символ одной звездочки *
:
# обычный вызов с отдельными аргументами >>> list(range(3, 6)) # [3, 4, 5] >>> args = [3, 6] # вызов с аргументами, распакованными из списка >>> list(range(*args)) # [3, 4, 5]
Таким же образом, из словаря dict
в функцию можно передать ключевые аргументы, только в этом случае, перед переменной словаря ставится два символов звездочки **
:
>>> def parrot(voltage, state='a stiff', action='voom'): ... print("-- This parrot wouldn't", action, end=' ') ... print("if you put", voltage, "volts through it.", end=' ') ... print("E's", state, "!") ... >>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"} >>> parrot(**d) # -- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demis
Следует запомнить:
*
- распаковывают последовательности в качестве элементов которых одно значение (списки, кортежи, множества)**
- распаковывают последовательности в качестве элементов которых имеется ключ и значение (словари)date_inf = {'year': "2020", 'month': "12", 'day': "06"} f_name = "{year}-{month}-{day}.txt".format(**date_inf) print(f_name) # 2020-12-06.txt fruits = ['lemon', 'orange', 'banana', 'tomato'] print(*fruits) # lemon orange banana tomato
Распаковку аргументов можно использовать несколько раз в функции:
date_info = {'year': "2020", 'month': "01", 'day': "01"} track_info = {'artist': "Beethoven", 'title': 'Symphony No 5'} filename = "{year}-{month}-{day}-{artist}-{title}.txt".format(**date_info, **track_info) print(filename) # 2020-01-01-Beethoven-Symphony No 5.txt
Распаковка итерируемых объектов в переменные:
fruits = ['lemon', 'orange', 'banana', 'tomato'] first, second, *orher = fruits print(orher) # ['banana', 'tomato'] first, *orher = fruits print(orher) # ['orange', 'banana', 'tomato'] first, *middle, last = fruits print(middle) # ['orange', 'banana']