デフォルト引数:省略可能なパラメータ#

はじめに#

前回の記事では、関数の引数と戻り値について学び、関数がどのようにデータをやり取りするかを理解しました。今回は、関数の引数についてさらに深く掘り下げて、「デフォルト引数」という便利な機能について学んでいきましょう。

デフォルト引数を使うと、関数を呼び出すときに必ずしもすべての引数を指定する必要がなくなり、より柔軟なコードが書けるようになります。これから、デフォルト引数の仕組みと活用方法を理解していきましょう。

デフォルト引数とは?#

デフォルト引数とは、関数を定義するときに引数にあらかじめ値を設定しておくことです。そうすることで、関数を呼び出すときにその引数を省略すると、自動的に設定しておいた値(デフォルト値)が使用されます。

基本的な書き方は次のとおりです。

def 関数名(引数=デフォルト値):
    処理内容

具体的な例を見てみましょう。

>
def greet(name, greeting="こんにちは"):
    print(f"{greeting}{name}さん!")

# 引数をすべて指定
greet("太郎", "おはよう")

# 第2引数を省略(デフォルト値が使用される)
greet("花子")
おはよう、太郎さん!
こんにちは、花子さん!

この例では、greet()関数のgreeting引数に"こんにちは"というデフォルト値を設定しています。2つ目の呼び出しではgreetingを省略しているため、デフォルト値の「こんにちは」が使用されています。

デフォルト引数の便利な使い方#

デフォルト引数は、以下のような場合に特に便利です。

  1. よく使う値がある場合:多くの場合で特定の値が使われるが、時々別の値を使いたい場合(例えば、ほとんどの場合でデフォルト設定で良いが、時々カスタマイズしたい場合など)
  2. オプションの追加機能:基本機能はそのままで、追加機能を選択的に使いたい場合

実際の使用例を見てみましょう。

例1:消費税計算関数#

>
def calculate_price_with_tax(price, tax_rate=0.10):
    """税込み価格を計算する関数"""
    tax = price * tax_rate
    total = price + tax
    return total

# デフォルト税率(10%)で計算
standard_price = calculate_price_with_tax(1000)
print(f"標準税率での税込み価格: {standard_price}円")

# 軽減税率(8%)で計算
reduced_price = calculate_price_with_tax(1000, 0.08)
print(f"軽減税率での税込み価格: {reduced_price}円")
標準税率での税込み価格: 1100.0円
軽減税率での税込み価格: 1080.0円

この例では、ほとんどの場合で標準税率の10%を使うことを想定し、それをデフォルト値としています。特別に軽減税率を適用したい場合だけ、税率を明示的に指定します。

例2:リストの表示関数#

>
def print_list(items, bullet="•", indent=2):
    """リストを整形して表示する関数"""
    indent_space = " " * indent
    for item in items:
        print(f"{indent_space}{bullet} {item}")

fruits = ["りんご", "バナナ", "オレンジ"]

# すべてデフォルト値を使用
print("デフォルト設定:")
print_list(fruits)

# 箇条書き記号を変更
print("\n数字で表示:")
print_list(fruits, bullet="1.")

# インデントを変更
print("\nインデントなし:")
print_list(fruits, indent=0)

# すべての引数を指定
print("\nカスタム設定:")
print_list(fruits, bullet="→", indent=4)
デフォルト設定:
  • りんご
  • バナナ
  • オレンジ

数字で表示:
  1. りんご
  1. バナナ
  1. オレンジ

インデントなし:
• りんご
• バナナ
• オレンジ

カスタム設定:
    → りんご
    → バナナ
    → オレンジ

この例では、print_list関数に2つのデフォルト引数があります。箇条書き記号のデフォルトは「•」、インデントのデフォルトは半角スペース2つです。これらの設定を必要に応じて変更できます。

デフォルト引数の注意点#

デフォルト引数を使う際にいくつか注意点があります。それらを理解しておくと、予期しない問題を避けることができます。

1. デフォルト引数の順序#

Pythonでは、デフォルト引数はすべて、デフォルト値のない引数の後に書く必要があります。

>
# 正しい例
def good_function(required_arg, optional_arg=10):
    print(f"必須引数: {required_arg}, オプション引数: {optional_arg}")

# エラーになる例
def bad_function(optional_arg=10, required_arg):
    print(f"オプション引数: {optional_arg}, 必須引数: {required_arg}")

bad_functionのような書き方をすると、「SyntaxError: non-default argument follows default argument(デフォルト値のない引数はデフォルト値のある引数の後に続くことはできない)」というエラーが出ます。

2. 変更可能なオブジェクトをデフォルト値にする場合の注意#

リスト、辞書、集合などの「変更可能なオブジェクト」をデフォルト値にすると、予想外の動きをすることがあります。

まず、簡単な例を見てみましょう。

>
# 問題のあるコード
def add_item(item, item_list=[]):
    item_list.append(item)
    return item_list

# 関数を呼び出す
list1 = add_item("りんご")
print(list1)

list2 = add_item("バナナ")
print(list2)
['りんご']
['りんご', 'バナナ']

2回目の呼び出しでは「バナナ」だけのリストになると思いましたが、「りんご」も入っています。なぜでしょうか?

この理由は、デフォルト値は関数が作られた時に一度だけ作られ、その後はずっと同じものが使われるからです。

つまり、

  1. 最初に関数が定義されたとき、空のリストが作られます
  2. 1回目の呼び出しで「りんご」がそのリストに追加されます
  3. 2回目の呼び出しでも同じリストが使われ、「バナナ」が追加されます

この問題を解決するには、デフォルト値として None を使い、関数の中で新しいリストを作る方法が一般的です。

>
# 改善されたコード
def add_item(item, item_list=None):
    if item_list is None:
        item_list = []  # 関数が呼ばれるたびに新しいリストを作る
    item_list.append(item)
    return item_list

# 関数を呼び出す
list1 = add_item("りんご")
print(list1)  # ['りんご']

list2 = add_item("バナナ")
print(list2)  # ['バナナ'] - 新しいリストが使われる

list3 = add_item("みかん", item_list=list2)
print(list3)  # ['バナナ', 'みかん'] - list2に追加される
['りんご']
['バナナ']
['バナナ', 'みかん']

これで、毎回関数を呼び出すたびに新しいリストが作られるようになりました。item_listにすでにあるリストを渡した場合は、そのリストにアイテムが追加されています。

このパターンは、Pythonプログラミングでよく使われる大切なテクニックです。リストや辞書をデフォルト値にするときは、この方法を覚えておくと安全にコードが書けます。

まとめ#

この記事では、デフォルト引数について詳しく学びました。

  • デフォルト引数は、関数を呼び出すときに引数を省略できるようにする機能
  • 関数定義時に 引数名=デフォルト値 の形で指定する
  • デフォルト値は、その引数が省略されたときに使用される
  • 変更可能なオブジェクト(リスト、辞書など)をデフォルト値にする場合は注意が必要

デフォルト引数を使いこなすことで、必要最小限の情報だけで関数を呼び出せる柔軟なコードが書けるようになります。関数を設計するときには、どのパラメータに固定値がよく使われるかを考慮し、適切にデフォルト値を設定しましょう。