6. 関数でコードをまとめる・再利用する

前回はリストと辞書について学びました。今回は、コードを整理して再利用しやすくする「関数」について学んでいきましょう。

6.1 関数とは?よく使う処理をひとまとめに

関数は、よく使う処理をひとまとめにして名前を付けたものです。料理のレシピのようなものと考えてください:

挨拶をする関数の例

# 挨拶をする関数の例
def greet():
    print("こんにちは!")
    print("今日もよろしくお願いします")

# 関数を呼び出す
greet()  # 定義した処理が実行される
greet()  # 何度でも同じ処理を実行できる

# 電卓の機能をまとめた関数の例
def calculator():
    num1 = int(input("1つ目の数字:"))
    num2 = int(input("2つ目の数字:"))
    print(f"足し算:{num1 + num2}")
    print(f"引き算:{num1 - num2}")
    print(f"掛け算:{num1 * num2}")
    print(f"割り算:{num1 / num2}")

6.2 def で関数を定義し、return で結果を返す

関数は処理結果を返すことができます:

面積を計算して返す関数

# 面積を計算して返す関数
def calculate_rectangle_area(width, height):
    area = width * height
    return area

# 関数を使う
result = calculate_rectangle_area(5, 3)
print(f"面積は{result}です")  # 面積は15です

# 複数の値を返す関数
def get_circle_info(radius):
    area = 3.14 * radius * radius
    circumference = 2 * 3.14 * radius
    return area, circumference

# 複数の戻り値を受け取る
circle_area, circle_circum = get_circle_info(5)
print(f"面積:{circle_area:.2f}, 周囲長:{circle_circum:.2f}")

6.3 引数を使って関数にデータを渡そう

引数を使うと、関数に情報を渡すことができます:

挨拶をする関数

# 基本的な引数の使い方
def greet_person(name):
    print(f"こんにちは、{name}さん!")

greet_person("太郎")  # こんにちは、太郎さん!

# 複数の引数を使う
def calculate_bmi(weight, height):
    height_m = height / 100  # cmからmに変換
    bmi = weight / (height_m * height_m)
    return round(bmi, 1)

my_bmi = calculate_bmi(60, 170)
print(f"BMI値:{my_bmi}")

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

print(power(3))     # 9 (3の2乗)
print(power(3, 3))  # 27 (3の3乗)

6.4 組み込み関数(len, max, min など)を活用する

Pythonには便利な組み込み関数が多数用意されています:

数値関連の組み込み関数

# 数値関連の組み込み関数
numbers = [4, 8, 15, 16, 23, 42]
print(max(numbers))    # 最大値:42
print(min(numbers))    # 最小値:4
print(sum(numbers))    # 合計:108
print(len(numbers))    # 要素数:6

# 文字列関連の組み込み関数
text = "python"
print(len(text))       # 文字数:6
print(text.upper())    # 大文字:PYTHON
print(text.title())    # 先頭大文字:Python

# 型変換関数
print(int("42"))       # 文字列→整数:42
print(str(42))        # 整数→文字列:"42"
print(float("3.14"))  # 文字列→小数:3.14

6.5 モジュールを import して便利な機能を使う

モジュールを使うと、さらに多くの便利な機能が使えます:

数学関連の機能

# 数学関連の機能
import math

print(math.pi)         # 円周率:3.141592...
print(math.sqrt(16))   # 平方根:4.0
print(math.ceil(3.7))  # 切り上げ:4

# ランダムな数を生成
import random

print(random.randint(1, 6))    # 1から6のサイコロ
print(random.choice(['グー', 'チョキ', 'パー']))

# 日付と時刻の処理
from datetime import datetime

now = datetime.now()
print(f"今日は{now.year}{now.month}{now.day}日です")

6.6 複数の関数でコードを整理して読みやすくする

大きなプログラムは、複数の関数に分割すると管理しやすくなります:

ユーザー情報を取得し、生年を計算してメッセージを作成するプログラム

def get_user_info():
    name = input("名前を入力してください:")
    age = int(input("年齢を入力してください:"))
    return name, age

def calculate_birth_year(age):
    current_year = 2024
    birth_year = current_year - age
    return birth_year

def create_message(name, birth_year):
    return f"{name}さんは{birth_year}年生まれですね!"

# メインの処理
def main():
    # ユーザー情報を取得
    name, age = get_user_info()

    # 生年を計算
    birth_year = calculate_birth_year(age)

    # メッセージを作成して表示
    message = create_message(name, birth_year)
    print(message)

# プログラムの実行
main()

6.7 関数を使ってコードを短くする練習

関数を使うと、同じような処理をスッキリ書けます:

成績判定プログラム

# 成績判定プログラム
def get_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    else:
        return "D"

def print_result(name, score):
    grade = get_grade(score)
    print(f"{name}さんの成績は{grade}です")

# 複数の生徒の成績を処理
students = [
    ("田中", 85),
    ("鈴木", 92),
    ("佐藤", 78)
]

for name, score in students:
    print_result(name, score)

課題 1. 足し算・引き算・平均値を計算する関数を作り、モジュールとして利用するプログラム

足し算・引き算・平均値を計算する関数を作り、モジュールとして利用するプログラム

# math_functions.py として保存
def add(a, b):
    """2つの数の和を返す"""
    return a + b

def subtract(a, b):
    """2つの数の差を返す"""
    return a - b

def average(numbers):
    """数値リストの平均を返す"""
    if not numbers:
        return 0
    return sum(numbers) / len(numbers)

# メイン処理
if __name__ == "__main__":
    # テスト用のコード
    print(add(10, 5))       # 15
    print(subtract(10, 5))  # 5
    print(average([1, 2, 3, 4, 5]))  # 3.0

# 他のファイルからの利用例
"""
import math_functions

result1 = math_functions.add(10, 20)
result2 = math_functions.average([80, 85, 90])
"""

課題 2. 2 つの数値を入力して最大公約数を求める関数を作成するプログラム

2 つの数値を入力して最大公約数を求める関数を作成するプログラム

def gcd(a, b):
    """ユークリッドの互除法で最大公約数を求める"""
    while b:
        a, b = b, a % b
    return a

def get_positive_number(prompt):
    """正の整数を入力させる"""
    while True:
        try:
            num = int(input(prompt))
            if num > 0:
                return num
            print("正の整数を入力してください")
        except ValueError:
            print("正しい数値を入力してください")

def main():
    # 2つの数を入力
    num1 = get_positive_number("1つ目の数を入力:")
    num2 = get_positive_number("2つ目の数を入力:")

    # 最大公約数を計算
    result = gcd(num1, num2)

    # 結果を表示
    print(f"{num1}{num2}の最大公約数は{result}です")

# プログラムの実行
if __name__ == "__main__":
    main()

# チャレンジ:
# - 最小公倍数も計算してみよう
# - 3つ以上の数の最大公約数を求めてみよう
# - 分数の計算(約分)に応用してみよう

まとめ

この章で学んだこと:

  • 関数は処理をまとめて再利用できる
  • 引数でデータを渡し、returnで結果を返す
  • 組み込み関数やモジュールで便利な機能を使える
  • コードを関数に分割して管理しやすくする
  • ドキュメント(説明)を付けて分かりやすくする

次の章では、エラー処理について学び、より安全なプログラムの作り方を身につけます!