当サイトは、アフィリエイト広告を利用しています

【Python】引数(位置引数、キーワード引数、デフォルト引数)の違いと使い分け

作成日:2024月04月27日
更新日:2024年04月27日

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歳です
  • Pythonの文法上のルールで位置引数はキーワード引数の前に指定する必要がある

引数重複エラー

位置引数とキーワード引数の値が被ってしまうとエラーになる
関数の引数の順を入れ替えてみる

引数重複エラー
# 関数定義
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での関数の引数について、呼び出し方法がいろいろあったので
整理してまとめてみた。

他の言語にはなく、柔軟に対応できる反面すこしわかりづらいようにも
感じたが、使っていくうちに慣れていこうと思う

参考

関連記事

新着記事

タグ別一覧
top