Распаковка аргументов для передачи в функцию Python
Бывают ситуации, когда для функции, требующей отдельных позиционных аргументов, значения этих аргументов уже находятся в списке или кортеже, и для вызова функции должны быть распакованы.
Например, встроенная 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 = " - - .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 = " - - - - .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']
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Функции это объекты
- Функции могут иметь атрибуты
- Функции могут храниться в структурах данных
- Функции могут быть вложенными
- Передача функции в качестве аргумента другой функции
- Область видимости переменных функции
- Операторы global и nonlocal
- Параметры (аргументы) функции
- Ключевые аргументы в определении функции Python
- Значение аргумента по умолчанию в функциях Python
- Варианты передачи аргументов в функцию Python
- Переменные аргументов *args и **kwargs в функции Python
- Распаковка аргументов для передачи в функцию Python
- Как оцениваются аргументы при вызове функции?
- Строгие правила передачи аргументов в функцию Python
- Инструкция return
- Анонимные функции (lambda-выражения)
- Строки документации в функциях Python
- Рекурсия
- Замыкания в функциях Python
- Перегрузка функций
Как передать словарь в функцию в Python?
Наиболее простой способ передать словарь в функцию в Python – это передать его как аргумент:
def my_function(my_dict): print(my_dict) my_dict = 'key1': 'value1', 'key2': 'value2'> my_function(my_dict) # => my_function('key3': 'value3'>) # =>
python: передача в функции параметров в виде словаря и добавление своих значений
подскажите как компактно, красиво и корректно передать в функцию параметры, содержащиеся в словаре + добавить свои параметры если над просто передать значения, то проблем нет:
data = < 'v1': 123, 'v3': 3.1415, 'v2': 'abc' >def func(v1, v2, v3): print(v1, v2, v3, sep='\n') func(**data)
а как быть, если я хочу заменить одно значение другим или добавить новое? в JavaScript можно делать так:
а какой-нибудь короткий и красивый аналог в питоне есть?
Отслеживать
задан 18 мая 2023 в 7:16
37.3k 4 4 золотых знака 28 28 серебряных знаков 72 72 бронзовых знака
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Можете просто добавить именованный аргумент перед словарем **kwargs :
kw = def myfunc(**kwargs): print(kwargs) myfunc(**kw) # myfunc(c=3, **kw) # mydict = myfunc(**mydict, **kw) #
для замены значения можно так:
myfunc(**dict(kw, a=100)) #
Отслеживать
ответ дан 18 мая 2023 в 7:37
25.4k 4 4 золотых знака 20 20 серебряных знаков 36 36 бронзовых знаков
да, вариант работает, причем не важно перед или после ставить новый параметр (вроде как проверил — оба варианта прошли), но вот как быть когда надо ЗАМЕНИТЬ параметр? т.е. в словаре уже есть такой параметр, условно **<'a': 1, 'b': 2>, b=2 — получается ошибка got multiple values for keyword argument , поэтому и привел способ из JS — там это происходит автоматически — если был старый параметр СЛЕВА, то он заменится на параметр, который указан СПРАВА, что очень удобно и компактно'a':>
Как передавать в функцию имя словаря?
Добрый день. Возникла проблема с kwargs в Python, искал в инете, но не нашел ответ. При вызове функции python выдает ошибку от том, что ждет 0 аргументов, а передан 1. Если передаю вместо имени словаря, сам словарь, то ошибок нет, но мне бы хотелось передавать именно имя словаря. Объясните в чём загвоздка. Заранее спасибо 🙂
people = < 'josh': 'man', 'jack': 'man', 'anna': 'woman' >def people(**kwargs): for name, sex in kwargs.items(): print(name + ' is a ' + sex) people(people)
- Вопрос задан более трёх лет назад
- 178 просмотров