Расширение кортежей в аргументы
Описание проблемы:
У меня есть функция следующего вида:
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 нет понимания кортежей?
Список vs кортеж: когда использовать каждый?
Сортировка списка кортежей по второму элементу (целое значение)