Skip to content

7. 関数の定義と利用

プログラミングにおいて、関数は繰り返し現れる処理を一箇所にまとめて管理するために非常に便利なツールです。ここでは Python における関数の定義と利用について詳しく学んでいきましょう。

7.1 関数の基本概念

関数とは、特定の処理を一つにまとめたもので、必要に応じて呼び出して使うことができます。これにより、コードの再利用性が高まり、見通しが良くなります。

7.1.1 関数の基本的な構造

Python での関数定義の基本構造は以下の通りです。

def 関数名(引数1, 引数2, ...):
    # 処理内容
    return 戻り値

関数はdefキーワードで開始され、関数名、任意の数の引数、そしてreturn文を用いて戻り値を指定します。

7.2 関数の定義と実行

例として二つの数を加算し、その結果を返す関数を作成してみましょう。

7.2.1 シンプルな関数の例

次の例では、add_numbersという関数を定義して、二つの数を加算します。

def add_numbers(a, b):
    sum = a + b
    return sum

# 関数の呼び出し
result = add_numbers(3, 5)
print(result)  # 出力: 8

これにより、数値の加算処理を簡潔に行うことができます。

7.3 引数と戻り値

関数には必要に応じて引数を渡し、その値を利用して処理を行います。処理の結果を呼び出し元に返すためには戻り値を指定します。

7.3.1 複数の戻り値

Python では複数の戻り値を返すことも可能です。例えば、最大値と最小値を同時に返す関数を考えてみましょう。

def find_min_max(numbers):
    min_value = min(numbers)
    max_value = max(numbers)
    return min_value, max_value

# 関数の呼び出し
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
min_val, max_val = find_min_max(numbers)
print(f"最小値: {min_val}, 最大値: {max_val}")

この例では、find_min_max関数がリスト内の最小値と最大値を同時に返します。

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

関数を定義する際に引数のデフォルト値を設定したり、キーワード引数を使って関数を呼び出すことができます。

7.4.1 デフォルト引数

次の例では、第二引数のデフォルト値を指定しています。

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

greet("太郎")          # 出力: こんにちは, 太郎!
greet("花子", "こんばんは")  # 出力: こんばんは, 花子!

7.4.2 キーワード引数

キーワード引数を使うことで、特定の引数に対して値を指定することができます。

def student_info(name, age, subject):
    print(f"名前: {name}, 年齢: {age}, 専攻: {subject}")

student_info(age=21, subject="数学", name="太郎")

このように、引数の順序を気にせずに関数を呼び出せるのがキーワード引数の利点です。

7.5 スコープとローカル変数

関数内で定義された変数は、関数の外部から直接アクセスすることはできません。これがローカル変数と呼ばれるものです。

7.5.1 ローカル変数の例

def example_function():
    local_variable = "これはローカル変数です"
    print(local_variable)

example_function()
# print(local_variable)  # これはエラーになります

local_variableexample_function内でのみアクセス可能です。

このセクションでは、Python における関数の定義と利用方法について学びました。関数を使いこなすことで、より効率的で理解しやすいコードを書く手助けになりますので、ぜひ活用してみてください。

演習問題

演習 1: 簡単な関数の定義

2つの数値を掛け算する関数 multiply(a, b) を定義し、3と7を掛け算した結果を出力してください。

解答例
def multiply(a, b):
    return a * b

result = multiply(3, 7)
print(result)  # 出力: 21

演習 2: 文字列を返す関数

名前を引数として受け取り、「こんにちは、[名前]さん!」という文字列を返す関数 greet(name) を作成してください。

解答例
def greet(name):
    return f"こんにちは、{name}さん!"

message = greet("太郎")
print(message)  # 出力: こんにちは、太郎さん!

演習 3: リストの平均値を計算

数値のリストを引数として受け取り、その平均値を返す関数 calculate_average(numbers) を作成してください。

解答例
def calculate_average(numbers):
    total = sum(numbers)
    average = total / len(numbers)
    return average

nums = [10, 20, 30, 40, 50]
avg = calculate_average(nums)
print(f"平均値: {avg}")  # 出力: 平均値: 30.0

# より簡潔な書き方
def calculate_average(numbers):
    return sum(numbers) / len(numbers)

演習 4: 複数の戻り値

数値のリストを引数として受け取り、最大値、最小値、平均値の3つを返す関数 analyze_numbers(numbers) を作成してください。

解答例
def analyze_numbers(numbers):
    max_val = max(numbers)
    min_val = min(numbers)
    avg_val = sum(numbers) / len(numbers)
    return max_val, min_val, avg_val

data = [15, 23, 8, 42, 16, 4]
maximum, minimum, average = analyze_numbers(data)

print(f"最大値: {maximum}")  # 出力: 最大値: 42
print(f"最小値: {minimum}")  # 出力: 最小値: 4
print(f"平均値: {average}")  # 出力: 平均値: 18.0

演習 5: デフォルト引数の活用

円の面積を計算する関数 calculate_circle_area(radius, pi=3.14159) を作成してください。円周率のデフォルト値は3.14159とします。

解答例
def calculate_circle_area(radius, pi=3.14159):
    return pi * radius ** 2

# デフォルトのpiを使用
area1 = calculate_circle_area(5)
print(f"半径5の円の面積: {area1}")  # 出力: 78.53975

# カスタムのpiを使用
area2 = calculate_circle_area(5, pi=3.14)
print(f"半径5の円の面積: {area2}")  # 出力: 78.5

演習 6: 偶数・奇数の判定

整数を引数として受け取り、その数が偶数なら True、奇数なら False を返す関数 is_even(number) を作成してください。

解答例
def is_even(number):
    return number % 2 == 0

print(is_even(10))  # 出力: True
print(is_even(7))   # 出力: False

演習 7: 階乗の計算

整数nを引数として受け取り、nの階乗(n!)を計算して返す関数 factorial(n) を作成してください。 (例: 5! = 5 × 4 × 3 × 2 × 1 = 120)

解答例
def factorial(n):
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result

print(factorial(5))  # 出力: 120
print(factorial(3))  # 出力: 6

# 再帰を使った別解
def factorial_recursive(n):
    if n <= 1:
        return 1
    return n * factorial_recursive(n - 1)

print(factorial_recursive(5))  # 出力: 120