【Python 雑談・雑学】 関数への引数の渡し方 - 複数の個別の引数を取るのなら、ちゃんとアンパックして渡しましょう - 投稿一覧へ戻る
Published 2020年6月6日12:19 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
ちょっとうっかり、的話題です。
次のような関数があります。
単純ですね。1つ以上の int もしくは float の引数を受け取り、それらの積を返します。
呼び出しは次の通りです。
さて、答えは?
期待通りでしたか?
えっ、違いました!?何故でしょう?
multiply(*args) は、例えば mutiply(3, 5, 2) というような引数を期待しています。
ですが、total = multiply(inputs) は mutiply((3, 5, 2)) を呼び出しています。
別々の数値を期待している関数に、1つのタプルを渡しているだけです。
結局のところ 1 * (3, 5, 2) が返ってきているだけですね。
ここでは、inputs 変数に入っているタプルの要素を個別に渡してあげなければなりません。
個別に渡すには、そうですね、アンパックして渡してあげればいいわけです。
ですから...
が正解です。
何てことないことですけど、たまに見落としがちではないでしょうか。
次のような関数があります。
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
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)
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
print(total) # 30
が正解です。
何てことないことですけど、たまに見落としがちではないでしょうか。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -