произвольное количество аргументов в функции python

17

Я хотел бы узнать, как передать произвольное количество аргументов в функции python, поэтому я написал простую функцию суммы рекурсивным образом следующим образом:

def mySum(*args):
  if len(args) == 1:
    return args[0]
  else:
    return args[-1] + mySum(args[:-1])

, но когда я протестировал mySum(3, 4) , я получил эту ошибку:

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

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

    
задан wei 29.10.2012 в 17:00
источник

6 ответов

11

Эта строка:

return args[-1] + mySum(args[:-1])

args[:-1] возвращает кусок кортежа аргументов. Я предполагаю, что ваша цель - рекурсивно вызвать вашу функцию, используя этот фрагмент аргументов. К сожалению, ваш текущий код просто вызывает вашу функцию, используя один объект - сам срез.

Вместо этого вы должны позвонить с тем, что эти аргументы развернуты.

return args[-1] + mySum(*args[:-1])
                        ^---- note the asterisk

Этот метод называется распаковкой списков аргументов "и звездочкой иногда (неофициально) называется оператором «splat».

    
ответ дан voithos 29.10.2012 в 17:05
  • splat (термин) не так часто используется, как я думаю, это должно быть. Некоторые называют это «звездным» оператором, другие - просто «распаковкой» оператора ... Полагаю, у него много имен. –  mgilson 29.10.2012 в 17:15
  • @mgilson: слишком плохо itertools.starmap не был назван itertools.splatmap, :-) –  unutbu 29.10.2012 в 17:47
2

Если вы не хотите делать это рекурсивно:

def mySum(*args):
sum = 0
for i in args:
        sum = sum + i
return sum
    
ответ дан schrobe 29.10.2012 в 17:08
1

args[:-1] - кортеж, поэтому вложенный вызов на самом деле mySum((4,)) , а вложенный возврат args[0] возвращает кортеж. Таким образом, вы заканчиваете тем, что последняя строка уменьшена до return 3 + (4,) . Чтобы исправить это, вам нужно развернуть кортеж при вызове mySum, изменив последнюю строку на return args[-1] + mySum(*args[:-1]) .

    
ответ дан aquavitae 29.10.2012 в 17:05
1

В вашем коде args[:-1] является кортежем, поэтому mySum(args[:-1]) вызывается с args , являющейся кортежем , содержащим другой кортеж в качестве первого аргумента. Вы хотите вызвать функцию mySum с args[:-1] , расширенную до аргументов, что вы можете сделать с помощью

mySum(*args[:-1])
    
ответ дан Otto Allmendinger 29.10.2012 в 17:05
1

Произвольные аргументы передаются в виде кортежа (с одним звездочкой *) в функцию (вы можете изменить его на список, как показано в коде) и вычислить сумму его элементов, путем кодирования себя с помощью цикла for; если вы не хотите использовать метод sum () для python.

def summing(*arg):
    li = list(*arg)
    x = 0
    for i in range((len(li)-1)):
        x = li[i]+x

    return x

#creating a list and pass it as arbitrary argument to the function
#to colculate the sum of it's elements

li = [4, 5 ,3, 24, 6, 67, 1]
print summing(li)
    
ответ дан Maria 10.05.2014 в 20:29
-1

Option1:

def mySum(*args):
    return sum(args)

mySum(1,2,3) # 6
mySum(1,2) # 3

Вариант 2:

mySum2 = lambda *args: sum(args)
mySum2(1,2,3) # 6
mySum2(1,2) # 3
    
ответ дан Chad 03.12.2013 в 02:51