【Python 雑談・雑学】 関数への引数の渡し方 - 複数の個別の引数を取るのなら、ちゃんとアンパックして渡しましょう - 投稿一覧へ戻る

Tags: miscellaneous , unpack , python

Published 2020年6月6日12:19 by T.Tsuyoshi

ちょっとうっかり、的話題です。


次のような関数があります。


from typing import Union

def multiply(*args: Union[int, float]):
if len(args) == 0:
raise ValueError('少なくとも1つの引数が必要です')

total = 1
for arg in args:
total *= arg

return total



単純ですね。1つ以上の int もしくは float の引数を受け取り、それらの積を返します。


呼び出しは次の通りです。


inputs = (3, 5, 2)
total = multiply(inputs)



さて、答えは?


print(total) # (3, 5, 2)



期待通りでしたか?
えっ、違いました!?何故でしょう?


multiply(*args) は、例えば mutiply(3, 5, 2) というような引数を期待しています。


ですが、total = multiply(inputs) は mutiply((3, 5, 2)) を呼び出しています。


別々の数値を期待している関数に、1つのタプルを渡しているだけです。


結局のところ 1 * (3, 5, 2) が返ってきているだけですね。


ここでは、inputs 変数に入っているタプルの要素を個別に渡してあげなければなりません。


個別に渡すには、そうですね、アンパックして渡してあげればいいわけです。


ですから...


total = multiply(*inputs)
print(total) # 30



が正解です。


何てことないことですけど、たまに見落としがちではないでしょうか。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)