ぺーぱーの日々

上機嫌でいること、夢中でいることを目標に、今日も色んなことに手を出します。

MENU

たまに見かける*args

初めに

たまに見かける*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の意味は、「引数になんでもとれるように」という理解は間違っていなかったと思う。デフォルトにも名前を付けてあげるあたりが、人にやさしい設計と言えるのだが、「そういうものなんだ」と腹落ちできない性分のぼくのような人間にとっては、余計に難しくしてしまう設計かもしれない。知識のないうちは、「そういうものなんだ」と理解半分にしておく賢さは、いつになったら身につくのやら。。