Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回もPython初心者・入門者に向けた引数についての解説です。
「今回も」と書いたのは少し前に、「Pythonの関数の引数の種類について。仮引数と実引数の違いを解説」という記事で、Pythonの引数には、仮引数と実引数の2つに区別されると書きました。
仮引数と実引数の区別は、乱暴にいってしまえば「どこに書くか、その書かれる場所」の違いです。
しかし、今回の位置引数とキーワード引数という区別は、「引数の内容・性質」の違いによる区別です。
両者の区別は乱暴にいってしまえば、引数にキーワードを設定するかどうかです。設定するのがキーワード引数。そしてキーワード引数以外が位置引数です。よってまずはキーワード引数を先に見ていきましょう。
Contents
さていきなりですが、みなさん高校数学で習った「複素数」というものを覚えていますか?虚数単位である記号「i」を使った数字です。たとえば、「3+5i」というやつです。「iの二乗は-1」です。
複素数は、基本的に「a+bi」という形になりますが、「+」の前が実部、後が虚部と言われます。
「3+5i」ならば、、3が実部、5iが虚部です。またこの虚部は、「実数x虚数単位i」という構造になっています。
この複素数を作り出す関数がPythonには標準で用意されています。それがcomplex()関数です。今回はこの関数を使って具体的にキーワード引数とはどんなものかを見ていきます。
まず次のコードを見てください。
complex(real = 3, imag = 5) # 結果:(3+5j)
引数のうち、
となります。
そして実はこのreal、imagはともに、Pythonで最初から「その名前(文字列)を使え」と設定されていますので、他の名前、たとえば、「rea」・「ima」にするとエラーになります。
次に上と同じ結果になる書き方として、次のものがあります。
complex(**{'real': 3, 'imag': 5}) # 同じ結果:(3+5j)
書き方1のコードでは、
変数 = XXXXX
と、イコールを使った代入になっていましが、その下のコードでは辞書を使った書き方ですので、
'変数' = XXXXX
という書き方になっているのに注意してください。{}があるので辞書だと明示されているので辞書の書き方だとわかりやすいと思いますが。
そして、さらに具体例2では、辞書の前に「**」(アスタリスクが2つ)ついています。
関数(**辞書)
このように、辞書の前にアスタリスクを2つつける形にすることで、辞書の要素を自動的に上手く処理して関数の引数として使えるという機能(辞書のアンパック)がPythonには備わっています。
書き方1にしろ2にしろ、複素数を作るために必要な実部(realというキーワード)と虚部(imagというキーワード)にそれぞれ何を対応させるのかをはっきり明示していますよね。
ようするに、キーワード引数は、
ということさえ、それら両者の対応関係さえ、しっかりと設定できていればいいのです。
よって、基本的には引数のどこに書かれているのかは問題になりません。実際に、キーワード引数の順番を入れ替えてみましょう。
以下の結果は全て同じ「3+5j」となります。
complex(real = 3, imag = 5)
complex(imag = 5, real = 3)
complex(**{'real': 3, 'imag': 5})
complex(**{'imag': 5, 'real': 5})
このようにキーワード引数を使うと、基本的にはその順番を入れ替えても同じ結果になります。大事なのは、「引数の場所(順番)」ではなく、「キーワードとその中身との対応関係」だからですね。
後者がしっかりと明示されていれば、あとはPythonが自動的に上手に処理してくれるというわけです。
では、最後に簡単な次の例も見てください。
def foo(p1, p2, p3):
print(p1, p2, p3)
foo(p1=100, p2=20, p3='Tom') # 結果:100 20 Tom
foo(p3='Tom', p1=100, p2=20) # 順番入れ替えても同じ結果:100 20 Tom
このように自分が定義した関数でも、キーワードを使って指定すれば引数の順番を変更しても同じ結果となります。
上述のように、キーワード引数はキーワードとその中身との対応関係が明示されていたので、引数の順番は決定的に重要なものではありませんでした。
それでは、それらの対応関係を明示しない位置引数の場合はどうなるでしょうか?
そうです、引数を書く位置・順番が決定的に重要になります。
同じくcomplex()関数と位置引数を使ったコードを見てみましょう。
complex(3, 5) # 結果:3+5j
complex(5, 3) # 結果:5+3j
キーワードは何も設定・指定しないので、位置引数としての用法・書き方になっています。
上と下で引数の順番が違うこと、それにより結果も異なっていることがわかってもらえるでしょう。
これは、そもそもcomple()関数においては、
1番目の引数 | 2番目の引数 |
実部 | 虚部 |
というルールが最初から定められているので、数字の順番を変えれば結果も変わるわけです。
もちろん、ふつうにみなさんがdefによる関数を定義するときも、
def 関数(引数1, 引数2, 引数3, ・・・):
処理
引数1に何が入るか、引数2に何が入るかは重要になります。たとえば、
引数1 | 引数2 | 引数3 |
身長 | 体重 | 血圧 |
188 | 85 | 120 |
というデータの場合、その数字の順番を入れ替えると・・・かなり危険な健康状態の人になってしまいますよね。身長→体重→血圧という順番を指定している以上は、その順番どおりに対応する情報を設定しなくてはなりません。
なお、これら位置引数とキーワード引数は、関数の引数の中で両方とも混在させて使うことが可能です。
しかし、その場合は、どちらを先に書くかなどルールが決まっています。今回の解説ではその説明を省きますが、下の公式ドキュメントで確認してみてください。
3.10.0b2 Documentation:項目「parameter(仮引数)」
プログラミングを学びIT業界へ転職するなら現役エンジニアから学べるプログラミングスクールTechAcademy [テックアカデミー]でオンライン講座を受講するのが良いと思います。1人で悩みながら学習を進めるよりもわかりやすく、費やす時間も少なく合理的・効率的に学習できるからです。
など各種の講座が用意されています。無料で体験できるテックアカデミー無料体験も用意されています。