【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
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
が正解です。
何てことないことですけど、たまに見落としがちではないでしょうか。
こちらの投稿にも興味があるかもしれません...
- 【Python 雑談・雑学】 関数への引数の渡し方・受け取り方 - *args、**kwargs を利用した引数の渡し方、パラメータの受け取り方、総復習 -
- 【Python 雑談・雑学 + coding challenge】Unicode の正規化処理 ( normalization ) を利用して、diacritical marks ( 発音区別符号 ) を取り除こう! テキスト解析の前処理としても重要です!
- 【Python 雑談・雑学 + coding challenge】文字列中の数字を抜き出して桁区切りをつけよう! 正規表現 (regular expression ) を使うと「えっ!?」っていうくらい簡単ですょ。lookahead と negative lookahead を使います。
- 【Python 雑談・雑学 + coding challenge】sorted 組み込み関数の key パラメータをうまく使って、カスタムオブジェクトを簡単にソートしよう! __getitem__、__len__ 特殊関数 ( special methods, dunder methods ) を実装すれば立派なシーケンス ( sequence ) です
0 comments
コメントはまだありません。
コメントを追加する(不適切と思われるコメントは削除する場合があります)