初めに
たまに見かける*args。「引数になんでもとれるようにこう書くもの」ぐらいの理解でとどまっていたが、pythonのドキュメントで*numbersという表記を目にしたので、*argsを理解するきっかけになるかなと思い、実装してみる。
問題のコード
def sum(*numbers):
s = 0
for n in numbers:
s += n
return s
sum(1,2,3,4)
内容
sumという関数を定義する。ここで問題の*numbersが登場。(「引数には、複数の数値をとるんだろうな」というぐらいにして、先に進む)
↓
for文でsを足していく
↓
足し合した値を返り値として設定
↓
関数を呼び出すときに、引数として1~4の4つの数字を渡す。
もちろん、結果は、10。
*の後は、なんでも良いのでは
上の例から、「数字であれば、なんでも引数にとれるよ」ということを明示するために、*numbersという表記になったんだろうという仮説を得た。
仮説の立証をするために、以下のようなコードを実行してみた。
def join(*vowels):
word = ''
for v in vowels:
word += v
return word
join('a','i','u','e','o')
内容
「母音であればなんでもいいよ」という意味で、*vowelsを引数に設定。
↓
for文でvを足していく
↓
足し合した値を返り値として設定
↓
関数を呼び出すときに、引数としてaiuoeの5つの母音(文字列)を渡す。
出力結果
仮説立証!
まとめ
やはり、当初の*argsの意味は、「引数になんでもとれるように」という理解は間違っていなかったと思う。デフォルトにも名前を付けてあげるあたりが、人にやさしい設計と言えるのだが、「そういうものなんだ」と腹落ちできない性分のぼくのような人間にとっては、余計に難しくしてしまう設計かもしれない。知識のないうちは、「そういうものなんだ」と理解半分にしておく賢さは、いつになったら身につくのやら。。