【6日でできるPython入門】関数②

 前のコンテンツ「関数①」ではPython関数の基本的な定義方法や使い方を学びましたが、実際のプログラミングでは「柔軟に値を受け取る関数」を作りたい場面が多くあります。
 ここでは、「デフォルト引数」や「**可変長引数(*args, kwargs)」、「キーワード専用引数」など、より高度な関数定義の方法を身につけます。
 これらのテクニックを理解することで、呼び出しやすく、拡張性の高い関数を自在に設計できるようになります。

1.デフォルト引数

1.1. デフォルト値付きの引数

 関数定義時に引数に「デフォルト値(初期値)」を設定すると、値を省略した場合にその初期値が使われます。

ファイル名: lesson18-1.py

def send_message(user="ゲスト", message="メッセージがありません"):
    print(f"{user}さんへのメッセージ: {message}")

# 呼び出し例
send_message()
send_message("田中")
send_message(message="おはようございます")
send_message("佐藤", "今日の予定を確認してください")

実行結果

ゲストさんへのメッセージ: メッセージがありません
田中さんへのメッセージ: メッセージがありません
ゲストさんへのメッセージ: おはようございます
佐藤さんへのメッセージ: 今日の予定を確認してください

解説

  • user="ゲスト" のように定義しておくと、呼び出し時に値を省略できて便利です。
  • デフォルト引数は、必ず普通の引数よりも後ろに書きます。

1.2. デフォルト引数の注意点とエラー例

デフォルト引数の前に、デフォルトなしの引数を書く必要があります。逆にするとエラーです。

ファイル名: lesson18-2.py

# 間違った例
# def greet(name="名無し", age):  # ←これはエラー
#     print(f"{name}さん、{age}歳です。")

実行結果

SyntaxError: non-default argument follows default argument

2.可変長引数

2.1. 可変長位置引数(*args)

複数の引数をまとめて受け取るには、*を付けた可変長位置引数を使います。

ファイル名: lesson18-3.py

def print_items(*items):
    print("渡されたアイテム一覧:")
    for i, item in enumerate(items, 1):
        print(f"{i}. {item}")

print_items("リンゴ", "バナナ", "オレンジ")
print_items("みかん")

実行結果

渡されたアイテム一覧:
1. リンゴ
2. バナナ
3. オレンジ
渡されたアイテム一覧:
1. みかん

解説

  • *itemsは受け取った値をタプルとして格納します。
  • enumerate(items, 1) で番号付きで表示しています。

2.2. 普通の引数・デフォルト引数との組み合わせ

可変長引数を他の引数と組み合わせる場合は、順番に注意します。

ファイル名: lesson18-4.py

def register_user(first, *nicknames, country="日本"):
    print(f"本名: {first}")
    print(f"ニックネーム: {', '.join(nicknames) if nicknames else 'なし'}")
    print(f"国籍: {country}")

register_user("山田", "やまちゃん", "ヤマピー", country="アメリカ")
register_user("鈴木")

実行結果

本名: 山田
ニックネーム: やまちゃん, ヤマピー
国籍: アメリカ
本名: 鈴木
ニックネーム: なし
国籍: 日本

3.可変長キーワード引数(**kwargs)

3.1. 任意のキーワード引数を受け取る

**を使うと、キーワード(名前付き)の任意個の引数を辞書として受け取れます。

ファイル名: lesson18-5.py

def show_profile(**profile):
    print("プロフィール情報:")
    for key, value in profile.items():
        print(f"{key}:{value}")

show_profile(名前="田中", 年齢=30, 血液型="A型")
show_profile(名前="佐藤", 趣味="ランニング", 職業="エンジニア")

実行結果

プロフィール情報:
名前:田中
年齢:30
血液型:A型
プロフィール情報:
名前:佐藤
趣味:ランニング
職業:エンジニア

解説

  • **profileは渡されたキーワード引数をすべて辞書にまとめてくれます。

3.2. argsとkwargsの組み合わせ

ファイル名: lesson18-6.py

すべてのパターンに対応した関数も作れます。

def full_info(*args, **kwargs):
    print("引数リスト:", args)
    print("キーワード引数:", kwargs)

full_info("A", "B", X=1, Y=2)

実行結果

引数リスト: ('A', 'B')
キーワード引数: {'X': 1, 'Y': 2}

4.キーワード専用引数

4.1. 「*」より後ろはキーワード専用

「*」以降の引数は、キーワードでしか値を指定できません。

ファイル名: lesson18-7.py

def make_report(title, *, author="匿名", date="不明"):
    print(f"レポートタイトル: {title}")
    print(f"著者: {author}")
    print(f"日付: {date}")

make_report("Python入門")
make_report("関数の応用", author="山本", date="2025年5月")
# make_report("エラー例", "佐藤")  # ←これはエラーになる

実行結果

レポートタイトル: Python入門
著者: 匿名
日付: 不明
レポートタイトル: 関数の応用
著者: 山本
日付: 2025年5月

解説

  • *より後ろの引数は「author=」「date=」のように必ずキーワード指定しないといけません。
  • 引数が多くなる場合、間違いを防げます。

まとめ表:さまざまな関数の引数指定方法

書き方説明
def f(a=10):デフォルト引数f(), f(20)
def f(*args):可変長位置引数f(1, 2, 3)
def f(**kwargs):可変長キーワード引数f(x=1, y=2)
def f(a, *b, c=0):位置・可変長・デフォルト引数の組み合わせf(1, 2, 3, c=4)
def f(a, *, b=0):キーワード専用引数(*以降はキーワードのみ)f(1, b=2)

ここでは、柔軟で拡張性のある関数の作り方を学びました。