当サイトは、アフィリエイト広告を利用しています
Pythonの関数では引数の渡し方に
の2種類がある。
それぞれの記法と使いどころについて
調べたので忘備録として残す。
Python 3.11で動作を確認する
関数に対して、上記の「位置引数」か「キーワード引数 」の「位置引数・キーワード引数混在」どれで呼び出すかは
関数の呼び出し側で指定する。
※デフォルト引数だけ少し違うので後述する。
位置引数で呼び出す
# 関数定義def func(name,age):print(F"私は{name}です。{age}歳です")# 位置引数指定で呼び出しfunc("tuji","23")func("23","tuji")func()# 実行結果# 私はtujiです。23歳です# 私は23です。tuji歳です# TypeError: func() missing 2 required positional arguments: 'name' and 'age'
位置で設定してるので、nameとageを入れ替えるとそのまま設定されてしまう
また引数を指定しなかった場合は当然エラーになる
キーワード引数で呼び出す
# 関数定義def func(name,age):print(F"私は{name}です。{age}歳です")# キーワードで呼び出しfunc(name="tuji",age="23")func(age="23",name="tuji")func()# 実行結果# 私はtujiです。23歳です# 私はtujiです。23歳です# TypeError: func() missing 2 required positional arguments: 'name' and 'age'
キーワードで設定してるので、nameとageを入れ替えても問題なく表示される
同じく引数を指定しなかった場合は当然エラーになる
位置引数・キーワード引数混在で呼び出すこともできる。
# 関数定義def func(name,age):print(F"私は{name}です。{age}歳です")# 位置引数・キーワード引数混在で呼び出しfunc("tuji",age="23")# 実行結果# 私はtujiです。23歳です
位置引数とキーワード引数の値が被ってしまうとエラーになる
関数の引数の順を入れ替えてみる
# 関数定義def func(age,name):print(F"私は{name}です。{age}歳です")# 位置引数・キーワード引数混在で呼び出しfunc("tuji",age="23")# 実行結果# TypeError: func() got multiple values for argument 'age'
位置引数でageに"tuji"を設定し、キーワード引数でageに"23"を設定しているため
引数重複エラーになる
上記でも書いたが、で位置引数はキーワード引数の前に指定する必要がある
# 関数定義def func(name,age):print(F"私は{name}です。{age}歳です")# 位置引数・キーワード引数混在で呼び出しfunc(age="23","tuji")# 実行結果# SyntaxError: positional argument follows keyword argument
VScodeを使ってる場合は実行前にエディタでエラーを教えてくれる
デフォルト引数は上記の「位置引数」や「キーワード引数」と違い
関数定義時に関数側で設定する
呼び出し側は位置引数、キーワード引数、混在のどの呼び出し方もできる
# 関数定義def func(name="hajime",age="99"):print(F"私は{name}です。{age}歳です")# キーワード引数で呼び出しfunc(name="tuji",age="23") # 私はtujiです。23歳です# 位置引数で呼び出し①func("tuji","23") # 私はtujiです。23歳です# 位置引数で呼び出し②func("44","shimada") # 私は44です。shimada歳です# 位置・キーワード混在# 位置引数を先に書書かないとエラーfunc("kyogoku",age="68") # 私はkyogokuです。68歳です# 位置引数でnameのみ指定func("saikawa") # 私はsaikawaです。99歳です# キーワード引数でnameのみ指定func(name="makita") # 私はmakitaです。99歳です# キーワード引数でageのみ指定func(age="55") # 私はhajimeです。55歳です# 引数なしfunc() # 私はhajimeです。99歳です
デフォルト値を持つ引数と持たない引数を混在させることもできる
# 関数定義def func(name,age="99"):print(F"私は{name}です。{age}歳です")# 位置引数でnameのみ指定func("saikawa") # 私はsaikawaです。99歳です# キーワード引数でnameのみ指定func(name="moe") # 私はmoeです。99歳です# キーワード引数でageのみ指定func(age="99") # TypeError: func() missing 1 required positional argument: 'name'
ただこの場合、デフォルト値を設定していないnameは必須となる。
またデフォルト値を使った関数を定義する時、デフォルト値を持つ引数と
持たない引数を混在させる場合は、デフォルト値が持たない引数を先に書かないとエラーになる
これもPythonの文法上のルール。
def func(name="hajime",age):print(F"私は{name}です。{age}歳です")# 実行結果# SyntaxError: non-default argument follows default argument
これもVScodeを使っているとエディタが教えてくれる
位置引数とキーワード引数の使い分けについて整理する。
デフォルト引数についてはデフォルト値を持たせたいか、持たせたくないかだけの
話なので使い分けとかはない。
位置引数の利点としては下記がある
呼び出す時にシンプルに呼び出せる
※ただし、引数の意味がわかりやすいような簡単な関数に限る
キーワード引数の利点としては下記がある
関数を呼び出す際に、各引数が何を表しているかが明確になるため、コードの可読性が向上する
個人的には基本はキーワード引数をつかっておいて問題ないかと思う。
上記では位置引数を使うか、キーワード引数を使うかは関数の呼び出し側が決めるといったが 関数定義側で呼び出し側に位置引数またはキーワード引数を強制する方法もある
を使う
関数側から呼び出し側に位置引数を強制する
# 関数定義def func(name,/,age):print(F"私は{name}です。{age}歳です")# 位置引数でnameを指定func("saikawa",age="33") # 私はsaikawaです。33歳です# キーワード引数でnameを指定func(name="saikawa",age="33") # TypeError: func() got some positional-only arguments passed as keyword arguments: 'name'
関数側から呼び出し側にキーワード引数を強制する
# 関数定義def func(*,name,age):print(F"私は{name}です。{age}歳です")# キーワード引数で指定func(name="saikawa",age="33") # 私はsaikawaです。33歳です# 位置引数でnameを指定func("saikawa","33") # TypeError: func() takes 0 positional arguments but 2 were given
Pythonでの関数の引数について、呼び出し方法がいろいろあったので
整理してまとめてみた。
他の言語にはなく、柔軟に対応できる反面すこしわかりづらいようにも
感じたが、使っていくうちに慣れていこうと思う