このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】関数の定義

関数の定義

 これまで、条件分岐や繰り返し処理など、プログラムの基本的な制御構造を学んできました。6章では、よく使う処理をひとまとめにして再利用性と可読性を向上させるための「関数の定義」について学びます。関数をうまく定義するためには、引数の扱いやスコープ、そしてコードの構造を理解することが重要です。
 本章では、関数の基本構文、引数の種類とその扱い、さらにグローバル変数とローカル変数のスコープについても解説し、実践例として座席予約システムを作成するサンプルプログラムを通じて学習を深めます。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.関数の基本構文と定義のポイント

1.1. 基本構文

 関数はdefキーワードを使って定義し、関数名、丸括弧内に仮引数、コロン(:)の後にインデントされたブロック内で実行する文を記述します。基本的な構文は以下の通りです。

def 関数名(引数1, 引数2, ...):
    文1
    文2
    # 必要に応じて return 文で結果を返す

解説

  • defは「定義する」という意味のキーワードで、これにより関数が新たに定義されます。
  • 関数名は小文字を基本とし、複数単語の場合はアンダースコア(_)で区切ることがPEP8の推奨です。
  • 仮引数は関数定義時に記述する変数で、関数呼び出し時に実引数として値が渡されます。
  • コロン(:)の後に改行し、インデントされた部分が関数の内部処理となります。

1.2. 引数の種類と扱い方

関数に渡す引数には、主に以下の種類があります。

引数の種類記述例説明
必須引数def greet(name):呼び出し時に必ず値を渡す必要がある引数。
デフォルト引数def greet(name, msg="Hello"):引数にデフォルト値を設定することで、省略可能にする。
可変長引数def sum_all(*numbers):複数の位置引数をタプルとして受け取る。
キーワード可変長引数def display_info(**info):複数のキーワード引数を辞書として受け取る。

解説

 使用頻度が高い引数は位置引数としてシンプルに記述し、場合によってはデフォルト値を設定して省略可能にすることで、関数呼び出し時の柔軟性が向上します。

2.変数のスコープ

 関数内で定義された変数(ローカル変数)は、その関数内でのみ有効です。一方、関数外で定義された変数(グローバル変数)は、プログラム全体で使用できます。これにより、意図しない変数の衝突を防ぐことが可能です。

global_value = "I am global"

def demo():
    local_value = "I am local"
    print("Inside function:", global_value)
    print("Inside function:", local_value)

demo()
print("Outside function:", global_value)
# print("Outside function:", local_value)  # これはエラーになる

実行結果

Inside function: I am global
Inside function: I am local
Outside function: I am global

解説

グローバル変数は関数内外で参照可能ですが、ローカル変数は関数の外側では参照できません。

3.サンプルプログラム:座席予約システム

3.1. プログラム概要

 ここでは、映画館の座席予約システムを例に、関数を定義する方法を示します。関数reserve_seatは、予約する座席のセクション、行、座席番号を引数として受け取り、予約情報を表示します。

3.2. サンプルプログラム

def reserve_seat(section, row, seat):
    """
    指定されたセクション、行、座席番号を用いて座席を予約します。
    この関数は、座席予約の確認メッセージを出力するだけです。
    """
    print("Reservation Details:")
    print(" Section:", section)
    print(" Row    :", row)
    print(" Seat   :", seat)

# 関数呼び出し(実引数として予約情報を渡す)
reserve_seat("Orchestra", 5, 12)

実行結果

Reservation Details:
 Section: Orchestra
 Row    : 5
 Seat   : 12

解説

  • 関数定義
    def reserve_seat(section, row, seat): により、3つの仮引数(section, row, seat)を受け取る関数を定義します。
    ・関数内部では、予約情報を表示するためのprint文が記述され、各項目ごとに適切なインデントで整理されています。
  • 関数呼び出し
    reserve_seat("Orchestra", 5, 12) で、実引数として "Orchestra"(セクション)、5(行)、12(座席番号)を渡します。
    ・関数が呼び出されると、引数に基づいて予約情報が出力されます。

【表:関数定義の主要な要素】

項目記述例説明
関数定義の開始def reserve_seat(section, row, seat):defキーワードを用いて関数名と仮引数を定義する。
コロンとインデント: の後に改行し、インデントされたブロック内に文を書くコロンに続くインデントされた文が関数の内部処理となる。
関数内の処理print(" Section:", section)予約情報など、関数の目的に沿った処理を記述する。
関数呼び出しreserve_seat("Orchestra", 5, 12)実引数を渡して関数を呼び出し、処理を実行する。

まとめ

 関数の定義は、コードの再利用性を高め、プログラムの構造を明確に整理するための重要な技法です。

  • 基本構文: def 関数名(引数, ...): として関数を定義し、インデントされたブロック内に実際の処理を記述します。
  • 引数の扱い: 必須引数、デフォルト引数などを適切に使い分けることで、関数呼び出し時の柔軟性が向上します。
  • 変数のスコープ: 関数内のローカル変数とプログラム全体で有効なグローバル変数の違いを理解し、意図しない衝突を避けます。
  • 実践例: 映画館の座席予約システムのサンプルプログラムでは、予約情報(セクション、行、座席番号)を引数として受け取り、予約内容を出力することで、関数定義の基本的な構造とその利用法を示しました。

 これらの知識を活かして、今後のプログラム作成において、関数を効果的に定義し、コードの再利用性と保守性を大幅に向上させましょう。