Подтвердить что ты не робот

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

Я хотел бы узнать, как передать произвольное количество аргументов в функции 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'

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

4b9b3361

Ответ 1

Эта строка:

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

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

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

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

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

Ответ 2

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

def mySum(*args):
sum = 0
for i in args:
        sum = sum + i
return sum

Ответ 3

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

Ответ 4

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

mySum(*args[:-1])

Ответ 5

Произвольные аргументы передаются в виде кортежа (с одним звездочкой *) в функцию (вы можете изменить его на список, как показано в коде) и вычислить сумму его элементов, путем кодирования себя с помощью цикла 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 elements

li = [4, 5 ,3, 24, 6, 67, 1]
print summing(li)

Ответ 6

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