可変長引数
すでに
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)
アスタリスク
*
を使って、任意の数の引数を受け取る独自の関数を定義できます: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