#はじめに
この記事は、半分は自分のメモ用に作成した記事です。
ただ、自分が見返した時に分かりやすいメモにするためにも、
誰が見ても分かりやすい記事になるよう心がけたつもりです。
(その方が、間違ってた時に指摘もしてもらえそうだし・・・(本音))
#STEP1:実引数と仮引数について
引数とは、仮引数と実引数との2つに大きく分類されます。
仮引数:関数定義で使用。実際のオブジェクトに仮の名前を付けるので仮引数。(argument)
実引数:関数呼び出しで使用。実際のオブジェクトなので実引数。(parameter)
def foo(a): # 仮引数
a+=1
return a
print(foo(1)) #実引数
>>>2
#STEP2:仮引数の性質
仮引数の重要な性質は、関数の呼び出し毎に設定されることです。
具体例を見ていきましょう。
def remove_first(lst):
lst = lst[1:]
print(lst)
lst = [1, 2, 3, 4]
print(lst)
remove_first(lst)
>>> [2, 3, 4]
remove_first(lst)
>>> [2, 3, 4]
ここで言いたいのは、1回目と2回目のremove_first(lst)の結果が同じであると言うこと。
つまり、「1回めに呼ばれたときの仮引数」と「2回めに呼ばれたときの仮引数」は、
同じ変数であっても別の変数として扱われていると言うことです。
#STEP3:仮引数の種類
前述した仮引数には5つのパターンがあります。
- 位置またはキーワード:いわゆる普通の関数定義
- 位置のみ:後述
- キーワードのみ:後述
- 可変長位置:後述
- 可変長キーワード:後述
とりあえず、ここは通常の位置またはキーワードを紹介します。
def foo2(a, b=3): # aが位置引数、bがキーワード引数
return a + b
def foo3(a=1, b): # エラー(位置引数の前に、キーワード引数は設定できない)
return a + b
print(foo2(1)) # 位置引数(bの値は関数定義時のデフォルト値がで適用される)
>>>4
print(foo2(1,5)) # 位置引数(a=1,b=5)
>>>6
print(foo2(1,b=5)) # 位置引数&キーワード引数
>>>6
print(foo2(a=1,b=5)) # キーワード引数
>>>6
print(foo2(b=2)) # エラー
>>>TypeError
print(foo2(b=3,a=1)) # キーワード引数の順番入れ替え
上記から分かる重要な性質として、
- 仮引数では、位置引数の前にキーワード引数は設定できない
- キーワード引数は実引数で設定をしなかった場合、仮引数のデフォルト値が適用される
- 実引数において、キーワード引数は順番を入れ替えて設定できる
- 実引数では位置引数としても、キーワード引数としても呼び出せる
#STEP4:位置のみ、キーワードのみ
次は、前述した位置のみ、キーワードのみを紹介します。
まず、位置のみですが、
関数定義時に、/の前にある引数は位置引数でしか呼び出せない
一方、キーワードのみですが、
*関数定義時に、の後にある引数はキーワード引数でしか呼び出せない
def func(a,*,b,c):
return a + b + c
def func2(a, /):
return a
print(func(1,b=2,c=3)) # bはキーワード引数で呼び出さないとエラーになる
print(func2(1)) # aは位置引数で呼び出さないとエラーになる
#STEP5:可変長位置、可変長キーワード
まず可変長位置ですが、任意の個数の位置引数を受け取れる引数のことです。
関数定義時に引数の前に*をつけることで位置引数になります(1つの関数に1回まで)
可変長キーワードは、任意の個数のキーワード引数を受け取れる引数のことです。
*関数定義時に引数の前に*をつけることで位置引数になります(1つの関数に1回まで)
def func(*a, **b):
print(a)
print(b)
func(1,2,3,b=4,c=5)
>>> (1, 2, 3)
{'b': 4, 'c': 5}