Как я могу взорвать кортеж, чтобы он мог быть передан как список параметров?

18

Предположим, у меня есть определение метода следующим образом:

def myMethod(a, b, c, d, e)

Затем у меня есть переменная и кортеж:

myVariable = 1
myTuple = (2, 3, 4, 5)

Есть ли способ, которым я могу пройти, взорвать кортеж, чтобы я мог передавать его члены в качестве параметров? Что-то вроде этого (хотя я знаю, что это не сработает, так как весь кортеж считается вторым параметром):

myMethod(myVariable, myTuple)

Я хотел бы избежать ссылки на каждый член кортежа индивидуально, если это возможно ...

    
задан froadie 07.07.2010 в 21:38
источник
  • Возможный дубликат Расширения кортежей в аргументах –  Ken Syme 21.07.2017 в 12:43

2 ответа

35

Вы ищете распаковку аргументов оператор * :

myMethod(myVariable, *myTuple)
    
ответ дан unutbu 07.07.2010 в 21:39
источник
  • Также работает для списков (в интересах ОП) –  Wayne Werner 07.07.2010 в 21:41
  • Также работает для итераторов. –  unutbu 07.07.2010 в 21:45
  • Приятно, спасибо! (Я думал, что прочитал о методе ... все еще довольно новый для Python, хотя и не был уверен, как его искать.) –  froadie 07.07.2010 в 21:47
  • @froadie: Правильно, раньше существовала функция, называемая apply, которая может служить той же цели, что и звезды и операторы с двумя звездами. Но применение устарело в пользу * и **. (См. Docs.python.org/library/functions.html#apply) –  unutbu 08.07.2010 в 00:57
  • Также работает для итераций, что противоречит руководству, в котором говорится, что это должна быть последовательность. –  Philipp 08.07.2010 в 16:14
7

В документации Python :

  

Обратная ситуация возникает, когда   аргументы уже находятся в списке или   но необходимо распаковать   вызов функции, требующий отдельного   позиционные аргументы. Например,   функция встроенного диапазона () ожидает   отдельные аргументы запуска и остановки. Если   они не доступны отдельно,   напишите вызов функции с помощью   * -оператор для распаковки аргументов из списка или кортежа:

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]
  

Таким же образом словари могут   доставить аргументы ключевых слов   ** - оператор:

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     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' demised !
    
ответ дан Escualo 07.07.2010 в 21:46
источник