Python 入門

Python 関数:引数と戻り値

関数(Function)は、Python において再利用可能なコードを記述するための基礎的なビルディングブロックです。特定のタスクを実行するコードブロックをカプセル化することで、プログラムのさまざまな場所で繰り返し実行できるようになります。これにより、コードの組織化、可読性の向上、そして冗長性の削減が実現します。

本章では、関数の定義方法を深く掘り下げ、特に引数(パラメータ)を使用した関数への情報伝達と、戻り値(返り値)を使用した処理結果の取得に焦点を当てて解説します。

1. 引数を持つ関数の定義

引数(Parameters)は、関数定義の括弧内で定義される変数です。これらは、関数を呼び出す際に渡される値を受け取るための「プレースホルダー」として機能します。関数に渡される実際の値は「実引数(Arguments)」と呼ばれ、関数はこれらを使用して計算や操作を実行します。

1.1 基本的な引数の使い方

まずは簡単な例から見てみましょう。名前を受け取って挨拶を表示する関数です。

def greet(name):
    """
    引数として渡された名前に向けて挨拶を表示する関数。
    """
    print(f"こんにちは、{name}さん!")

# 実引数を渡して関数を呼び出す
greet("Alice")  # 出力: こんにちは、Aliceさん!
greet("Bob")    # 出力: こんにちは、Bobさん!

この例では、name が引数(Parameter)です。greet("Alice") と呼び出したとき、文字列 "Alice" が name に渡される実引数(Argument)となります。

1.2 複数の引数

関数は複数の引数を受け取ることができます。関数定義時の引数の順序は、呼び出し時に実引数を渡す順序と一致させる必要があります。

def describe_person(name, age, city):
    """
    名前、年齢、都市に基づいて人物の情報を表示する。
    """
    print(f"{name}さんは {age} 歳で、{city}に住んでいます。")

# 複数の実引数を渡して呼び出す
describe_person("Charlie", 30, "New York") 
# 出力: Charlieさんは 30 歳で、New Yorkに住んでいます。

describe_person("Diana", 25, "London")     
# 出力: Dianaさんは 25 歳で、Londonに住んでいます。

ここでは nameagecity が引数です。呼び出し時には同じ順序で実引数を提供する必要があります。

1.3 デフォルト引数(既定値)

引数にデフォルト値(Default Value)を割り当てることができます。関数を呼び出す際にその引数が省略された場合、このデフォルト値が使用されます。

def power(base, exponent=2):
    """
    数値の累乗を計算する。
    指数 (exponent) が指定されない場合、デフォルトで 2(平方)を計算する。
    """
    result = base ** exponent
    return result

# 引数1つで呼び出す(デフォルトの指数を使用)
square = power(5)  # base=5, exponent=2 (デフォルト)
print(square)      # 出力: 25

# 引数2つで呼び出す(デフォルトを上書き)
cube = power(5, 3) # base=5, exponent=3
print(cube)        # 出力: 125

この例では、exponent のデフォルト値は 2 です。power(5) と呼ぶと 52 を計算し、power(5, 3) と呼ぶと 53 を計算します。

1.4 キーワード引数

関数を呼び出す際、キーワード引数(Keyword Arguments)を使用して、どの実引数がどの引数に対応するかを明示的に指定できます。これにより、引数の順序を気にせずに値を渡すことが可能になります。

def describe_pet(animal_type, pet_name):
    """
    ペットに関する情報を表示する。
    """
    print(f"\n私は {animal_type} を飼っています。")
    print(f"名前は {pet_name} です。")

# キーワード引数を使用した呼び出し
describe_pet(animal_type='hamster', pet_name='Harry')
describe_pet(pet_name='Lucy', animal_type='dog')

キーワード引数を使用すると、特に引数が多い関数の場合にコードの可読性が大幅に向上します。

1.5 位置引数とキーワード引数の併用

1つの関数呼び出しの中で、位置引数(順序による指定)とキーワード引数を混ぜて使用することができます。ただし、位置引数は必ずキーワード引数よりも前に配置しなければなりません。

def format_name(first_name, last_name, middle_name=''):
    """
    名前をフォーマットする。
    """
    if middle_name:
        full_name = f"{first_name} {middle_name} {last_name}"
    else:
        full_name = f"{first_name} {last_name}"
    return full_name.title()

print(format_name("john", "doe"))
print(format_name("john", "doe", middle_name="david"))
print(format_name("john", last_name="doe", middle_name="david")) # 正解

# print(format_name("john", middle_name="david", "doe")) 
# エラー - キーワード引数の後に位置引数が来ているため

2. 関数からの戻り値

関数は return 文を使用して、呼び出し元に値を返すことができます。戻り値は、整数、浮動小数点数、文字列、リストなど、あらゆるデータ型が可能です。return 文がない関数は、暗黙的に None を返します。

2.1 基本的な戻り値

def add(x, y):
    """
    2つの数値を加算し、その結果を返す。
    """
    sum_result = x + y
    return sum_result

# 関数を呼び出し、戻り値を変数に格納する
result = add(3, 5)
print(result)  # 出力: 8

この例では、add 関数は xy の和を返します。返された値は変数 result に代入されます。

2.2 複数の戻り値

Python では、1つの関数から複数の値を返すことができます。内部的には、これらの値は1つのタプル(Tuple)として返されます。

def calculate_stats(numbers):
    """
    数値リストの合計値と平均値を計算する。
    """
    total = sum(numbers)
    average = total / len(numbers)
    return total, average # タプルとして返される

# 関数を呼び出し、戻り値をアンパックする
numbers = [1, 2, 3, 4, 5]
sum_result, average_result = calculate_stats(numbers)
print(f"合計: {sum_result}, 平均: {average_result}")  
# 出力: 合計: 15, 平均: 3.0

ここでは calculate_stats が合計と平均の2つの値を返しています。呼び出し側はこれらを個別の変数に「アンパック(展開)」して受け取ることができます。

2.3 条件付きの戻り値

条件分岐(if文)を使用して、状況に応じて異なる値を返すことができます。

def is_even(number):
    """
    数値が偶数かどうかを判定し、True または False を返す。
    """
    if number % 2 == 0:
        return True
    else:
        return False

# 戻り値をチェックする
print(is_even(4))  # 出力: True
print(is_even(7))  # 出力: False

2.4 None の返却

明示的に値を返さない関数は、自動的に None を返します。これは、副作用(ログの出力やグローバル変数の変更など)を目的とし、特定の計算結果を必要としない関数によく見られます。

def print_message(message):
    """
    メッセージをコンソールに表示する(return文なし)。
    """
    print(message)

# 戻り値をチェックする
result = print_message("Hello, world!")
print(result)  # 出力: None