Python 関数の引数 位置引数 キーワード引数 デフォルト引数

Python学習【365日チャレンジ!】49日目のマスターU(@Udemy11)です。

Pythonを学習し始めてから、エクセルの関数でできることをVBAを使ってできないかなと考えるようになりました。

繰り返しの作業はもちろんのこと、一度だけで済むことも、データが多いと関数を入れてコピペをするより、VBAで処理したほうが処理は早いし、すべてのセルに関数が入るわけじゃないので、ファイルサイズが小さくなります。

関数定義やforループなどは記載の仕方が、違ってきますが、処理の流れは似ているので、VBAの理解がかなり進んだような気がします。

Pythonを学習しているのなら、ぜひVBAも並行して使ってみてはどうでしょうか?

それでは、今日もPython学習を始めていきましょう!

昨日の復習

昨日は、関数の引数と返り値に関する注意事項について学習しました。

引数にタイプは指定できるけど、指定したタイプ以外が入力されてもエラーにはならないということでした。

昨日は、int(整数)を指定して、str(文字列)を入力したら、文字列が出力されましたね。

今日は反対に、str型を指定して、int型を入力してみましょう。

def plus_num(a: str, b: str) -> str:
     return a + b
 
r = plus_num(10, 34)
print(r)

出力結果

44

文字列に指定しているので、本来なら、タイプが違うので、エラーを返すはずですが、普通に足し算をして、44が出力されました。

返り値のタイプは、【->】で指定しましたね。

通常はこのような記載はしないようなので、あまり見かけることはないかもしれませんが、一応こんな使い方ができるということを知っておいたほうがいいでしょう。

それでは、今日のPython学習を始めましょう!

キーワード引数

キーワード引数は、その名のとおり、引数にキーワードを指定して使う引数で、代入する値の順番が違ってもきちんと判断してくれます。

def info(country, pref, city):
    print(country, pref, city)
 
info(city='Habikino', country='Japan', pref='Osaka')

出力結果

Japan Osaka Habikino

関数infoの中にキーワードを指定して値を代入していますが、最初の関数定義は、country,pref,cityの順番です。

一方で、関数の実行の際には、キーワードの順番は、city,country,prefの順番に代入していますが、きちんとdef文で定義したキーワードに値が代入されています。

このように、キーワードを指定したキーワード引数は、実行する際の値の順番が違っても、キーワード引数にきちんと代入されます。

位置引数

キーワード引数を設定していても、実行時にキーワードを指定しなければ、順番(位置)が優先されて値を代入することになります。

これまでも、キーワードを指定することはなかったので、自然と順番どおりに代入されることは理解できると思います。

def info(country, pref, city):
    print(country, pref, city)
 
info(Japan, Hokkaido, Sapporo)

出力結果

Japan Hokkaido Sapporo

位置引数は、これまたその名のとおり、位置に値が代入される引数です。

キーワードを指定した関数でも、実行時にキーワードを指定していなければ、位置(順番)が優先されて代入されます。

当たり前ですが、値を元に、どのキーワードに該当するかを判断してくれるわけではなく、位置が優先されるということですね。

デフォルト引数

デフォルト引数は、指定したキーワードにデフォルトの値を入れたものになります。

def info(country='Japan', pref='Fukuoka', city='Kitakyushu'):
    print(country, pref, city)
 
info()

出力結果

Japan Fukuoka Kitakyushu

デフォルトの値を指定しているので、関数の実行時に引数を指定しなくてもデフォルトの値が入るため、出力は、デフォルトで指定しているJapan Fukuoka Kitakyushuになります。

デフォルト以外の値を入力したい場合は、位置引数で代入するか、キーワード引数で代入することができます。

どれか一つのキーワードを指定して実行すると、他のキーワードにはデフォルト引数が適用されます。

def info(country='Japan', pref='Fukuoka', city='Kitakyushu'):
    print(country, pref, city)
 
info(city='Dazaifu')

出力結果

Japan Fukuoka Dazaifu

位置引数も同じように一つの値だけ指定しても他の引数はデフォルト引数が適用されますが、位置引数の場合は、言うまでもなく、位置が同じところに代入されるため、一つの場合は最初のキーワードに値が入力されます。

def info(country='Japan', pref='Fukuoka', city='Kitakyushu'):
    print(country, pref, city)
 
info('China')

出力結果

China Fukuoka Dazaifu

国、県、市というキーワードなので、最初だけChinaに変えるとおかしな出力担ってしまいますが、キーワードを指定せずに、値を一つだけ入れて実行すると、位置引数として、最初のキーワードに代入されるということです。

合わせて使うときは注意が必要

紹介したキーワード引数と位置引数、デフォルト引数は組み合わせて使うことが可能です。

デフォルトで指定されていいれば、実行時に値が指定されなくてもデフォルトの値が代入されますし、キーワードが指定されていなければ、位置を判断して、値が代入されます。

注意しなければならないのは、位置引数は最初から続けてしか使えないということです。

def info(country='Japan', pref='Fukuoka', city='Kitakyushu'):
    print(country, pref, city)
 
info('China', pref='Shandong', city='Qingdao')

出力結果

China Fukuoka Dazaifu

位置引数は、基本的に最初の位置からしか指定することはできません。

例えば、1番目、2番めの位置にキーワードの値を指定して実行する場合、3番めの位置に、キーワードを指定せずに値だけを入れるとエラーになってしまいます。

実行時にエラーになる並び

info(country='China', pref='Shandong', 'Qingdao')
info(country='China', 'Shandong', 'Qingdao')
info('China', pref='Shandong', 'Qingdao')
info(country='China', 'Qingdao', pref='Shandong')
info('China', country='Shandong', city='Qingdao')

初心者的な考えでは、位置引数というくらいなので、位置があっていれば問題ないように思ってしまいますが、実行時にキーワードを指定しない場合は、最初の位置から指定しない値を続ける必要があります。

途中でキーワードを指定した場合はその後の値もキーワードを指定しなければいけません。

柔軟性のあるPythonですが、このあたりのことはきちんとルールにしたがって、コードを書くようにしましょう。

レベルアップ

少しずつレベルアップした学習内容になってきているので、ちょっと気を抜くと理解できなくなってしまいます。

酒井さんの講座は、解説のスピードが早いので、理解できないときは、巻き戻して確認しないといけません。

そんなときはやはり、Udemyって便利だな〜と思うんです。

15秒巻き戻したり15秒進めたりできるので、繰り返し同じ解説を聴くことができます。
このあたりの利便性は、リアルな講座と違って、何度も同じところを復習できるので、Udemyがもっとも得意とするところです。

もう、何度紹介しているか忘れてしまいましたが、現在学習している酒井さんのPython講座は、基本から丁寧に解説してくれているので、これからPythonを学習しようと考えている人にとっては最適の講座です。

ぜひ一度受講してみてください。

Udemy講師 酒井さん プログラミング Python

それでは明日もGood Python!