Произвольное количество аргументов в функции 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'
Есть ли у кого-нибудь идея об этом и дать какой-нибудь ключ, чтобы исправить это?
Ответы
Ответ 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