22

Python 関数で任意の数の引数を渡す方法を学びたいので、単純な sum 関数を次のように再帰的に作成しました。

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'

誰かがこれについて考えを持っていて、それを修正するための手がかりを教えてくれますか?

4

6 に答える 6

15

この行:

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

args[:-1]引数タプルのスライスを返します。あなたの目標は、その引数のスライスを使用して関数を再帰的に呼び出すことだと思います。残念ながら、現在のコードは、単一のオブジェクト (スライス自体) を使用して関数を呼び出すだけです。

代わりにやりたいことは、それらの引数を展開して呼び出すことです。

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

この手法は「引数リストのアンパック」と呼ばれ、アスタリスクは (非公式に) 「splat」演算子と呼ばれることがあります。

于 2012-10-29T16:05:46.513 に答える
2

再帰的に実行したくない場合:

def mySum(*args):
    sum = 0
    for i in args:
        sum = sum + i
    return sum
于 2012-10-29T16:08:34.793 に答える
1

任意の引数はタプル (アスタリスク* 1 つ付き) として関数に渡され (コードに示されているようにリストに変更できます)、for ループを使用してコーディングすることにより、その要素の合計を計算します。Python の sum() メソッドを使いたくない場合。

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)
于 2014-05-10T18:29:26.963 に答える
1

args[:-1]はタプルなので、ネストされた呼び出しは実際にmySum((4,))は であり、ネストされた return はargs[0]タプルを返します。したがって、最後の行が に削減されreturn 3 + (4,)ます。これを修正するには、最後の行を に変更して mySum を呼び出すときにタプルを展開する必要がありますreturn args[-1] + mySum(*args[:-1])

于 2012-10-29T16:05:07.227 に答える
1

あなたのコードでargs[:-1]は、タプルなので、最初の引数として別のタプルを含むタプルmySum(args[:-1])で呼び出されています。ただし、引数に展開して関数を呼び出したい場合は、次の方法で実行できますargsmySumargs[:-1]

mySum(*args[:-1])
于 2012-10-29T16:05:11.070 に答える