可変長引数

すでにprint()zip()のように、引数の数が可変な関数を見てきました。しかし、自分でそのような関数を作ったことはありません。では、引数の数を柔軟に扱える関数をどのように書けばよいでしょうか?
要素を出力する際、print()関数には好きなだけ引数を渡すことができ、すべてを出力してくれます:
print('Hi')                   # Hi
print('Hi', 'how', 'are', 1)  # Hi how are 1
print(1, 2, 3, 8)             # 1 2 3 8
公式のPythonドキュメントprint()の関数シグネチャを見てみると、最初の引数が実際には渡された全ての(キーワードではない)引数のリストを受け取っていることがわかります。zip関数も同様です:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
zip(*iterables, strict=False)
Source: https://docs.python.org/3/library/functions.html
アスタリスク*を使って、任意の数の引数を受け取る独自の関数を定義できます:
def income(*purchases):
    total = 0
    for purchase in purchases:
        total += purchase
    return total

print(income(1, 2, 3, 4, 10))  # 20
ここでは、purchasesは数値のリストとして扱えます。len()で長さを取得したり、forループで要素を繰り返し処理できます。

チャレンジ

渡された引数の数を返す関数num_args()を実装してください。
関数の例:
def num_args(*args):
    ...

print(num_args(1, 2, 3))  # 3
print(num_args())         # 0
print(num_args('Anna'))   # 1
 
プロのコツ 😎: 単純なリストを*argsに変換することもできます:
a = [1, 2, 3, 'hello']
print(*a)

# これは次と同等です
print(1, 2, 3, 'hello')
これでリストを簡単に出力できる方法を知りました。
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue