Расширение кортежей в аргументы
Описание проблемы:
У меня есть функция следующего вида:
def myfun(a, b, c):
return (a * 2, b + c, c + b)
Я определил кортеж:
some_tuple = (1, "foo", "bar")
Как мне использовать some_tuple для вызова функции myfun? Ожидаемый результат должен быть (2, "foobar", "barfoo").
Я понимаю, что мог бы изменить определение myfun, чтобы оно принимало кортеж напрямую, но мне нужно вызвать уже существующую функцию myfun.
Кто-нибудь подскажет, как это сделать?
2 ответ(ов)
Обратите внимание, что вы также можете развернуть часть списка аргументов:
myfun(1, *("foo", "bar"))
В этом примере мы передаем значение 1 как первый аргумент функции myfun, а затем развертываем кортеж ("foo", "bar"), чтобы передать его элементы в качестве следующих аргументов функции. Таким образом, вызов myfun(1, *("foo", "bar")) эквивалентен вызову myfun(1, "foo", "bar").
Подобно ответу @Dominykas, приведённый код представляет собой декоратор, который преобразует функции, принимающие несколько аргументов, в функции, принимающие кортежи. Вот пример реализации:
apply_tuple = lambda f: lambda args: f(*args)
Пример 1:
def add(a, b):
return a + b
three = apply_tuple(add)((1, 2))
В данном примере мы определяем функцию add, которая складывает два числа. Затем мы применяем декоратор apply_tuple, чтобы вызвать add с кортежем (1, 2).
Пример 2:
@apply_tuple
def add(a, b):
return a + b
three = add((1, 2))
В этом примере мы используем декоратор @apply_tuple непосредственно перед определением функции add. Это позволяет нам вызывать add, передавая кортеж (1, 2) непосредственно. В обоих случаях результатом будет сумма чисел, равная 3.
В чем разница между списками и кортежами?
Почему в Python нет понимания кортежей?
Сортировка списка кортежей по второму элементу (целое значение)
Следует ли добавлять запятую после последнего аргумента в вызове функции? [закрыто]
Почему строки и кортежи в Python являются неизменяемыми?