第7章 関数

関数の定義方法

Pythonではdefキーワードを使って関数を定義します。以下は、"Hello, World!"と出力する関数の例です。

def hello():
    print("Hello, World!")


関数の呼び出し方法

関数は関数名の後ろに括弧()をつけて呼び出します。上記のhello関数を呼び出すには以下のようにします。

hello()  # "Hello, World!"と出力します


引数とパラメータ

関数は引数を取ることができます。引数は関数が動作するための入力データです。以下の例では、greet関数はnameという引数を取り、その名前で挨拶をします。

def greet(name):  # nameは引数です
    print(f"Hello, {name}!")

greet("Alice")  # "Hello, Alice!"と出力します


戻り値

関数は結果を「返す」ことができます。これを戻り値といいます。returnキーワードを使って戻り値を指定します。以下の例では、add関数は2つの数値を加算した結果を返します。

def add(a, b):
    return a + b  # aとbの和を返す

result = add(3, 4)  # resultには7が格納されます
print(result)  # 7と出力します


複数の戻り値

Pythonの関数では複数の値を一度に返すことができます。この際、戻り値はタプルとして返されます。タプルの要素を個々の変数に分割代入することで、複数の戻り値をそれぞれの変数に保存することが可能です。

def calc(a, b):
    sum = a + b
    diff = a - b
    return sum, diff  # 複数の値をタプルとして返す

# 関数を呼び出して複数の戻り値を受け取る
result = calc(5, 3)
print(result)  # (8, 2)

# 複数の戻り値をそれぞれの変数に分割代入する
sum_result, diff_result = calc(5, 3)
print(sum_result)  # 8
print(diff_result)  # 2


デフォルト引数とキーワード引数

関数の引数にはデフォルト値を設定することができます。これをデフォルト引数といいます。また、関数を呼び出す際には引数名を指定して値を渡すことができます。これをキーワード引数といいます。

def power(base, exponent=2):  # exponentのデフォルト値は2
    return base ** exponent

print(power(3))  # 引数を一つだけ渡すと、exponentはデフォルト値の2が使われます。結果は9
print(power(3, 3))  # 引数を2つ渡すと、exponentは渡された値が使われます。結果は27
print(power(base=2, exponent=3))  # キーワード引数を使って値を渡すこともできます。結果は8


可変長引数

引数の数が固定ではなく、可変である場合もあります。そのための仕組みとして可変長引数があります。引数名の前に*をつけると、その引数は可変長になります。その引数にはタプル形式で値が渡されます。

def sum_numbers(*numbers):  # numbersは可変長引数です
    return sum(numbers)  # numbersはタプルなので、そのままsum関数に渡せます

print(sum_numbers(1, 2, 3, 4, 5))  # 15と出力します


ラムダ関数

Pythonでは無名関数を作成するためのlambdaキーワードがあります。これを使って、小さな一時的な関数(ラムダ関数)を作ることができます。以下の例では、2つの数値を加算するラムダ関数を作ります。

add = lambda a, b: a + b
print(add(3, 4))  # 7と出力します


ジェネレータ関数

デコレータは、関数やメソッドの動作を変更したり、機能を拡張したりするためのパワフルなツールです。デコレータは、関数を引数として取り、新しい関数を返す関数です。この特性を利用して、コードの再利用や拡張が容易になります。

フィボナッチ数列を生成するジェネレータ関数の例です。

def fibonacci_generator(n):
    a, b = 0, 1
    count = 0
    while count < n:
        yield a
        a, b = b, a + b
        count += 1

# 使用例:
for num in fibonacci_generator(5):
    print(num)


デコレータ

ジェネレータとは、一度にすべての結果をメモリに保持することなく、一度に一つずつ結果を生み出すことのできる特殊な関数やオブジェクトを指します。Pythonでは、ジェネレータ関数はyieldキーワードを使用して定義されます。

関数の実行時間を計測して表示するデコレータの例です。

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.2f} seconds to run.")
        return result
    return wrapper

@timer_decorator
def example_function(duration):
    time.sleep(duration)
    return "Finished!"

example_function(2)


関数のドキュメンテーション

関数の直後に三重クォート(""")で囲んだコメントを書くと、それが関数のドキュメンテーション(docstring)となります。これは関数の動作を説明するためのもので、後からコードを見た人が理解しやすくなります。

def add(a, b):
    """この関数は、2つの引数を加算した結果を返します。"""
    return a + b


練習問題1.

二つの数値を引数として受け取り、その和を返す関数addを作成してください。


練習問題2.

二つの数値を引数として受け取り、その和と差をタプルとして返す関数add_and_subtractを作成してください。


練習問題3.

引数として名前を受け取り、「こんにちは、{名前}さん」というメッセージを返す関数greetを作成してください。名前が与えられなかった場合は、デフォルトで「ゲスト」を使用します。