はじめに
関数定義と位置専用引数・キーワード引数について解説したいと思います。
この記事を読んで、他の言語にはないと思われる、デフォルト引数・位置専用引数・キーワード引数について理解してもらえればと思います。
もし、参考になった場合はいいねをお願いします。
Python基本構文については【Python入門】基礎構文のまとめでまとめてますので、参考にしてください。
デフォルト値引数
デフォルト値引数とは、引数にデフォルト値を指定することができます。
例えば、def f(i=1)
とすることでf()
として呼び出すと、i=1
を省略することが可能です。
デフォルト値引数の一度しか評価されないため、ミュータブルオブジェクトを利用する場合について注意が必要となります。
値を引き継ぐ・引き継ぎたくない場合については、以下のように定義できます。
値を引き継ぎたい場合
以下のようにイミュータブルオブジェクトを渡した場合は引き継がれます。
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
値を引き継ぎたくない場合
以下のようにイミュータブルオブジェクトのデフォルト値をNoneにすることでオブジェクトは引き継がれません。
def f( a, L=None):
if L is None:
L = []
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
用途によって使い分けてください。
関数を呼び出す際の引数について
引数とは関数に渡す値となりますが、引数には2種類(位置専用引数、キーワード引数)あります
- 位置専用引数
引数の順番によって値を指定する引数となります。値を渡す順番を間違えると意図しない結果となります。
complex(3,5)
complex(*(3,5))
引数の順番、または可変長引数*
を使用した場合は位置引数となります。
- キーワード引数、可変長キーワード引数
引数の前に識別子付き,dictionaryとして渡された引数のことを言います。
例えばcomplex()の呼び出しでは以下は同等になります。
complex(real=3,image=5)
complex(**{'real':3,'image':5}})
引数に識別子(例:real=)を付与、または**
を付与することでキーワード引数となります。
引数の*
と**
の意味について
*
について
*
については利用箇所により意味が変わるため、どのような利用方法についてなるか説明したいと思います。
- 位置引数
*args
関数の引数として*
を利用する場合
関数の引数として任意の数の引数を受け取るために使用します。
def func(*args):
for arg in args:
print(arg)
func(1,2,3)
func(1,2,3,4)
- アンパッキング
アンパッキングとはリスト、辞書、タプル等から要素を取り出す操作のことを言います。
# numbersというリストを作成し、printでアンパッキング
numbers = [1,2,3]
print(*numbers)
# numbersリストをアンパッキング
numbers = [1,2,3]
numbers_ex = [*numbers,4,5]
**
について
- キーワード専用引数
**kwargs
関数の引数で**
を使用する場合、辞書引数として受け取れます。
def func(**kwargs) :
print(f"{kwargs=}")
func(a=1,b=2)
func(a=1,b=2,c=3)
関数の引数について
python関数定義についての位置専用引数・キーワード引数については記載方法が少し特殊となります。パターンがあるので覚えておくとコードが読み易くなります。
- 位置専用引数と、キーワード引数
以下のような形式が多い
def func(args, key=None)
- 位置専用引数またはキーワード引数
/
以降は位置専用引数またはキーワード引数どちらも利用可能
def func(args1, args2, /, keyword):
呼び出し方は以下のどちらでも可能
func(1,2,keyword=3)
func(1,2,3)
- キーワード引数のみ
*
以降の引数についてはdictonary型のみ利用可能
def func(args1, args2, *, keyword_only):
呼び出し方は以下のようになる
func(1,2,keyword=3)
func(1,2,3)
# NG - 可変長引数と可変長キーワード
def func( *args, **kwargs):
*args
は可変長引数をうけとり、**kwargs
はdictionaryを受け取ります。
まとめ
関数の引数について解説しました。
引数の意味を理解することでpythonドキュメントを正しく読めるようになり、関数の利用方法についてもサンプルコードを探さず開発ができると良いかともいます。