結論: 引数は、関数に渡す値です。位置引数は順番で、キーワード引数は名前を指定して渡します。デフォルト値を決めておくと、引数を省略できます。引数の数や名前が合わないとTypeErrorになりますが、メッセージが原因を教えてくれます。デフォルト値に、リストを使ってはいけません(呼び出しのたびに、同じものが使い回されるため)。
引数とは
関数は、「値を受け取って、処理をして、結果を返す」ものです。受け取る値が、引数です。
def greet(name):
print("こんにちは", name)
greet("田中") # こんにちは 田中
nameが、受け取る側の名前"田中"が、渡す値(引数)
関数の基本は、関数とはをご覧ください。
引数の3つの渡し方
def greet(name, greeting="こんにちは"):
print(greeting, name)
① 位置引数:順番で渡す
greet("田中") # こんにちは 田中
関数の定義と、同じ順番で渡します。
② キーワード引数:名前を指定して渡す
greet(greeting="こんばんは", name="田中") # こんばんは 田中
名前を付けて渡すので、順番を気にしなくて済みます。読みやすく、順番の間違いも防げます。
③ デフォルト値:省略した時の値
greeting="こんにちは" のように、あらかじめ値を決めておくと、呼び出す時に、省略できます。
greet("田中") # greetingを省略 → こんにちは
greet("田中", "おはよう") # おはよう 田中
デフォルト値のある引数は、後ろにまとめて書きます(デフォルト値のない引数の前に置くと、エラーになります)。
def f(greeting="こんにちは", name): # エラー
引数のエラーと、直し方
| エラーメッセージ | 原因 | 直し方 |
|---|---|---|
missing 1 required positional argument |
必要な引数が足りない | 引数を足す。または、デフォルト値を決める |
takes 2 positional arguments but 3 were given |
引数が多すぎる | 関数の定義と、呼び出しの数をそろえる |
got an unexpected keyword argument |
存在しない名前を指定した | 引数の名前の綴りを確認する |
greet()
# TypeError: greet() missing 1 required positional argument: 'name'
エラーメッセージの読み方は、エラーメッセージの正しい読み方・調べ方をご覧ください。
注意:デフォルト値に、リストを使わない
エラーにならずに、おかしな動きをする、有名な落とし穴です。
def add_item(item, items=[]):
items.append(item)
return items
print(add_item("りんご")) # ['りんご']
print(add_item("みかん")) # ['りんご', 'みかん'] ← 前回の内容が残っている
デフォルト値は、関数を定義した時に、1度だけつくられます。リストは、あとから中身を変えられるため、呼び出しのたびに、同じリストが使い回されます。
直し方:Noneにして、関数の中でつくる
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item("りんご")) # ['りんご']
print(add_item("みかん")) # ['みかん']
None は「何もない」を表す値です。辞書(dict)をデフォルト値にする場合も、同じ書き方にします(辞書(dict)型とは)。