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

目次

この講座で使用する Google Colab の URL

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

演習課題

Ex.6. 関数でコードをまとめる・再利用する (Google Colab)

この講座で使用する Python, Jupyter Notebook のファイルと実行環境

Lesson 6: high-school-python-code (GitHub)

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

プログラミングをしていると、同じような処理を何度も書くことがあります。

そんなとき便利なのが「関数」です。関数とは、よく使う処理をひとまとめにして、名前を付けたものです。

関数の基本的な使い方

関数は大きく分けて 2 つの部分があります:

  1. 関数を「作る」部分(定義)
  2. 関数を「使う」部分(呼び出し)

まずは簡単な例を見てみましょう。関数は、def で定義します。

def は、「define」の略で、「定義する」という意味です。

関数の基本的な使い方

# --- 関数を「作る」部分 (定義) ---
# def 関数名(): の形で、関数を作ります
def greet():
    print("こんにちは!")
    print("元気ですか?")
    print("今日もよろしくお願いします")


# --- 関数を「使う」部分 (呼び出し) ---
# 関数名() で実行します
greet()
print("--- 他の処理 ---")
# 何度でも同じ処理を実行できます
greet()

この関数を細かく見てみましょう。

関数の定義を表示してみる

def greet():
    print("こんにちは!")
    print("元気ですか?")
    print("今日もよろしくお願いします")


print("--- 関数の定義を表示 ---")
# () を付けないと呼び出されません
# 関数の定義を表示すると、関数の名前と、その関数がどこにあるかを示すアドレスが表示されます
print(greet)  # <function greet at 0x7b70b00c7100>

print("--- 関数の返す値を表示 ---")
# この関数は、値を返していないので、 print すると None になります
print(greet())  # None

関数のイメージ

このように、関数は「箱」のようなイメージを持つとわかりやすいかもしれません!

def double(xint-> int:
    """
    整数を2倍にして返します
    
    Args:
        x (int): 2倍にする整数
    
    Returns:
        int: 入力値を2倍にした整数
    """
    return x * 2
5
double()x * 2
10

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

前のセクションでは print() で結果を表示する関数を作りましたが、関数は値(計算結果など)を「返す」こともできます。数学の関数と同じように、入力(引数)から出力(戻り値)を計算できるのです。

return で値を返す

例えば、長方形の面積を計算する関数を考えてみましょう。

長方形の面積を計算して返す関数

def calculate_rectangle_area(width, height):
    area = width * height   # 面積を計算
    return area             # 計算結果を返す


# 関数を使う
result = calculate_rectangle_area(5, 3)  # 戻り値を変数に入れる
print(f"面積は{result}平方センチメートルです")  # 面積は 15 平方センチメートルです

# 関数の結果を直接使うこともできます
total_area = calculate_rectangle_area(4, 6) + calculate_rectangle_area(3, 2)
print(f"2つの長方形の面積の合計:{total_area}")  # 30 平方センチメートル

この関数は、数学の関数 f(x, y) = x × y と同じような働きをします。入力された width と height から面積を計算して「返す」のです。

型ヒントと Docstring を使って関数を作る

また、ここからは型ヒントと Docstring を使って関数を作っていきましょう。これらは必須ではありませんが、プログラムが読みやすくなるのでおすすめです。

型ヒント

型ヒントは、データ型をプログラム中に書いておくものです。

  • 関数の引数については、これまで見てきた通りの書き方です。
  • 関数の戻り値については、-> を使って書きます。
  • 型ヒントと違うデータ型でも、エラーは出ません。

Docstring

Docstring は、関数の説明を書くためのものです。

  • 関数の上にコメントブロック """ を使って書きます。
  • 引数 (Args) と戻り値 (Returns) のデータ型や内容について説明します。
  • このような書き方は一つの例ですが、色々な書き方があります。

型ヒントと Docstring を使った関数

def calculate_rectangle_area(width: float, height: float) -> float:
    """長方形の面積を計算して返す.

    Args:
        width (float): 長方形の幅
        height (float): 長方形の高さ

    Returns:
        float: 長方形の面積
    """
    area = width * height
    return area

プログラムがだいぶ分かりやすくなりましたね!

戻り値を使うと便利な点

関数が値を返すと、その結果を別の計算で使えます。

戻り値を使った計算例

def calculate_price_with_tax(price: float) -> float:
    """税込価格を計算して返す.

    Notes:
        消費税率は 10% で計算します。

    Args:
        price (float): 税抜価格

    Returns:
        float: 税込価格
    """
    tax_rate = 0.1
    tax = price * tax_rate
    total = price + tax

    return total


# 商品の合計金額を計算
item1_price = calculate_price_with_tax(1000)  # 1,100 円
item2_price = calculate_price_with_tax(2000)  # 2,200 円
total_price = int(item1_price + item2_price)

# カンマを使って桁区切りを表示
print(f"合計金額(税込):{total_price:,} 円")  # 3,300円

return 以降は実行されない

その関数内に書かれた、return 以降の処理は実行されません。

そのことを利用して、例えばこのように elifelse を使わずに書くことができます。

成績判定をする関数

def calculate_grade(score: int) -> str:
    """点数から成績を計算して返す.

    Args:
        score (int): 点数

    Returns:
        str: 成績
    """
    if score >= 90:
        return "A"
    if score >= 80:
        return "B"
    if score >= 70:
        return "C"
    if score >= 60:
        return "D"

    # 60 点未満は F
    return "F"

# 関数を使って成績を判定
my_score = 85
my_grade = calculate_grade(my_score)
print(f"{my_score} 点の成績は {my_grade} です")  # 85 点の成績は B です

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

前のセクションまでに作った関数でも、引数を使っていました。

「誰に」あいさつするのか、「どんな数字」で計算するのかなど、状況によって変えたい部分を変えつつ、関数を定義していけるのは便利ですね。

そんなとき使うのが「引数」(ひきすう)です。引数とは、関数に渡すデータのことです。

引数の基本:データを渡してみよう

まずは簡単な例から見てみましょう。

引数を使ったあいさつプログラム

def greet_person(name: str) -> None:
    """名前を引数に取る関数.

    Args:
        name (str): 名前
    """
    print(f"こんにちは、{name}さん!")
    print("今日も頑張りましょう!")


# いろいろな名前で呼び出してみる
greet_person("太郎")  # こんにちは、太郎さん!
greet_person("花子")  # こんにちは、花子さん!
greet_person("先生")  # こんにちは、先生さん!

この関数は name という引数を受け取り、その名前を使ってあいさつ文を作ります。同じ関数でも、違う名前を渡すことで、違うあいさつができるんです!

位置引数を使う

関数には複数の情報を渡すこともできます。実用的な例として、BMI(体格指数)を計算する関数を作ってみましょう。

このように、関数の引数を順番に指定して渡す方法を「位置引数」(positional argument) と呼びます。

BMI を計算する関数

def calculate_bmi(weight: float, height: float) -> float:
    """BMI を計算する関数.

    Args:
        weight (float): 体重(kg)
        height (float): 身長(cm)
    """
    # 身長をメートルに変換
    height_m = height / 100
    # BMI の計算式: 体重 (kg) ÷ 身長 (m) の 2 乗
    bmi = weight / (height_m * height_m)
    # 小数第 1 位まで丸めて返す
    return round(bmi, 1)


# 関数を使って BMI を計算
my_bmi = calculate_bmi(60, 170)  # 体重 60 kg, 身長 170 cm
print(f"BMI 値: {my_bmi}")

friend_bmi = calculate_bmi(55, 165)  # 体重 55 kg, 身長 165 cm
print(f"友達の BMI 値: {friend_bmi}")

デフォルト値を持つ引数

引数には「デフォルト値」(初期値)を設定することもできます。これは、引数が省略されたときに使われる値です。

デフォルト値を使った関数

def power(base: int, exponent: int = 2) -> int:
    """数値のべき乗を計算する.

    Args:
        base (int): 基数
        exponent (int, optional): 指数(デフォルトは 2)
    """
    return base ** exponent


# いろいろな使い方
print(power(3))     # 3 の 2 乗 = 9 (exponent を省略 → デフォルト値の 2 が使われる)
print(power(3, 3))  # 3 の 3 乗 = 27 (exponent に 3 を指定)
print(power(2, 4))  # 2 の 4 乗 = 16 (exponent に 4 を指定)


def create_greeting(name: str, greeting: str = "こんにちは") -> str:
    """あいさつ文を作る.

    Args:
        name (str): 名前
        greeting (str, optional): あいさつ(デフォルトは「こんにちは」)
    """
    return f"{greeting}{name}さん!"


print(create_greeting("太郎"))  # こんにちは、太郎さん!
print(create_greeting("花子", "おはよう"))  # おはよう、花子さん!

キーワード引数を使う

引数は順番ではなく、名前を指定して渡すこともできます。このように、関数の引数を名前で指定して渡す方法を「キーワード引数」(keyword argument) と呼びます。

キーワード引数を使う

def create_profile(name: str, age: int, hobby: str) -> str:
    return f"私は{name}です。{age}歳です。趣味は{hobby}です。"


# 通常の呼び出し (順番通りに渡す)
profile1 = create_profile("太郎", 16, "サッカー")
# キーワード引数を使う (順番は関係ない)
profile2 = create_profile(hobby="野球", name="次郎", age=15)

print(profile1)
print(profile2)

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

今まで自分で関数を作る方法を学んできましたが、Python には最初から便利な関数がたくさん用意されています。これらを「組み込み関数」と呼びます。よく使うものを見ていきましょう。

よく使う数値関連の組み込み関数

テストの点数を管理するプログラムを例に、数値を扱う関数を見てみましょう。

テストの点数を分析する例

# クラスのテスト点数リスト
scores = [82, 75, 90, 65, 88, 72, 95, 60]

# 点数の分析
max_score = max(scores)  # 最高点を求める
min_score = min(scores)  # 最低点を求める
total = sum(scores)      # 合計点を求める
count = len(scores)      # 人数を求める
average = total / count  # 平均点を計算

print("テスト結果の分析:")
print(f"最高点:{max_score}点")    # 95点
print(f"最低点:{min_score}点")    # 60点
print(f"平均点:{average:.1f}点")  # 78.4点
print(f"受験者数:{count}人")      # 8人

文字列を操作する組み込み関数

文字列を扱うときにも、便利な関数がたくさんあります。

文字列を処理する例

# 名前の処理
name = "python programming"

# 様々な文字列操作
print(len(name))               # 文字数: 17
print(name.upper())            # すべて大文字: PYTHON PROGRAMMING
print(name.lower())            # すべて小文字: python programming
print(name.title())            # 単語の先頭を大文字: Python Programming
print(name.replace("p", "P"))  # 文字の置換: Python Programming

# 文字列の検索と判定
print(name.startswith("py"))  # "py" で始まる?: True
print(name.endswith("ing"))   # "ing" で終わる?: True
print("gram" in name)         # "gram" を含む?: True

# 空白の処理
text = "   Hello, World!   "
print(text.strip())  # 前後の空白を削除: Hello, World!

データ型を変換する関数

違う型のデータを変換するときに使う関数もあります。

データ型の変換例

# 文字列から数値への変換
age_str = "16"
age_num = int(age_str)  # 文字列 → 整数: 16
height_str = "170.5"
height_num = float(height_str)  # 文字列 → 小数: 170.5

# 数値を文字列に変換
price = 1200
price_str = str(price)  # 整数 → 文字列: "1200"

# ユーザーからの入力を処理
height = float(input("身長 (cm) を入力:"))  # 入力: "165.5" → 数値: 165.5
weight = float(input("体重 (kg) を入力:"))  # 入力: "60.2" → 数値: 60.2

# BMI の計算 (小数第 1 位まで)
bmi = weight / ((height/100) ** 2)
print(f"BMI 値: {round(bmi, 1)}")  # 小数第 1 位まで表示

リストを操作する便利な関数

リスト(配列)を扱うときによく使う関数も見てみましょう。

リストの操作例

# 部活動の記録
times = [12.3, 11.8, 12.1, 11.5, 12.0]  # 100m 走のタイム

# 基本的な統計
best_time = min(times)   # ベストタイム
worst_time = max(times)  # ワーストタイム
average_time = sum(times) / len(times)  # 平均タイム

print("タイム分析:")
print(f"ベスト:{best_time}秒")
print(f"ワースト:{worst_time}秒")
print(f"平均:{average_time:.1f}秒")

# リストの操作
times.sort()                 # タイムを昇順に並び替え
print(f"タイム一覧:{times}")  # [11.5, 11.8, 12.0, 12.1, 12.3]
times.reverse()              # 逆順に並び替え
print(f"逆順一覧:{times}")    # [12.3, 12.1, 12.0, 11.8, 11.5]

よく使う組み込み関数のまとめ

関数説明
len()長さや個数を返すlen([1,2,3]) → 3
max()最大値を返すmax([10,20,30]) → 30
min()最小値を返すmin([10,20,30]) → 10
sum()合計を返すsum([1,2,3]) → 6
int()整数に変換int("42") → 42
float()小数に変換float("3.14") → 3.14
str()文字列に変換str(42) → "42"
round()四捨五入するround(3.14159, 2) → 3.14

次のセクションでは、さらに便利な機能を使うための「モジュール」について学んでいきます。

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

Python には便利な組み込み関数が多数ありますが、さらに高度な機能は「モジュール」という形で提供されています。モジュールは、関連する機能をまとめたパッケージのようなものです。

モジュールを使うための基本: import

モジュールを使うには、プログラムの最初に import 文を書きます:

モジュールの基本的な使い方

# math モジュールを読み込む
import math


# モジュールの機能を使う
radius = 5
area = math.pi * radius * radius  # 円の面積を計算
print(f"半径{radius}の円の面積:{area:.2f}")

数学関連の機能(math モジュール)

数学でよく使う機能が math モジュールにまとめられています。

数学関連の機能を使う例

import math


# 円周率と平方根
print(f"円周率:{math.pi}")         # 3.141592...
print(f"2の平方根:{math.sqrt(2)}")  # 1.4142...

# 三角関数(ラジアン)
angle_deg = 45                       # 45 度
angle_rad = math.radians(angle_deg)  # 度 → ラジアン (rad)
sin_value = math.sin(angle_rad)      # サイン (sin)
cos_value = math.cos(angle_rad)      # コサイン (cos)
print(f"{angle_deg}度の sin 値: {sin_value:.4f}")

# 切り上げ, 切り捨て, 四捨五入
price = 1234.56
print(f"切り上げ: {math.ceil(price)}")   # 1235
print(f"切り捨て: {math.floor(price)}")  # 1234
print(f"四捨五入: {round(price)}")       # 1235

ランダムな値を生成する(random モジュール)

ゲームやシミュレーションでよく使うような乱数(ランダムな値)を生成する機能が random モジュールにまとめられています。

ランダム機能を使う例

import random


# サイコロを振る
dice = random.randint(1, 6)  # 1 から 6 のランダムな整数
print(f"サイコロの目:{dice}")

# じゃんけんをランダムに選ぶ
hands = ['グー', 'チョキ', 'パー']
computer_hand = random.choice(hands)  # リストからランダムに選択
print(f"コンピュータの手:{computer_hand}")

# カードをシャッフル
cards = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
random.shuffle(cards)  # リストをシャッフル
print(f"シャッフル後:{cards}")

日付と時刻を扱う(datetime モジュール)

日付や時刻の処理には datetime モジュールを使います。

日付と時刻の処理例

from datetime import datetime, timedelta


# 現在の日時を取得
now = datetime.now()
print(f"現在の日時:{now}")
print(f"今日は{now.year}{now.month}{now.day}日")
print(f"現在時刻:{now.hour}{now.minute}{now.second}秒")

# 日付の計算
tomorrow = now + timedelta(days=1)    # 1 日後
next_week = now + timedelta(weeks=1)  # 1 週間後
print(f"明日:{tomorrow.date()}")
print(f"来週:{next_week.date()}")

# 誕生日までの日数を計算
birthday = datetime(2024, 12, 25)  # 2024年12月25日
days_until = (birthday - now).days
print(f"誕生日まであと{days_until}日")

先ほどの例では、datetime モジュールを読み込むときに、datetimetimedelta をそれぞれ別々に読み込んでいました。これをまとめて読み込むこともできます。

日付と時刻の処理例(まとめて読み込む)

import datetime


# 現在の日時を取得
now = datetime.datetime.now()
print(f"現在の日時:{now}")
print(f"今日は{now.year}{now.month}{now.day}日")
print(f"現在時刻:{now.hour}{now.minute}{now.second}秒")

# 日付の計算
tomorrow = now + datetime.timedelta(days=1)    # 1 日後
next_week = now + datetime.timedelta(weeks=1)  # 1 週間後
print(f"明日:{tomorrow.date()}")
print(f"来週:{next_week.date()}")

# 誕生日までの日数を計算
birthday = datetime.datetime(2024, 12, 25)  # 2024年12月25日
days_until = (birthday - now).days
print(f"誕生日まであと{days_until}日")

このように書くと、datetime モジュールの datetimetimedelta をそれぞれ別々に読み込む必要がなくなります。ただ、datetime モジュールの datetime, timedelta という意味で、

  • datetime.datetime
  • datetime.timedelta

と書く必要があります。

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

プログラムが大きくなってくると、1つの大きな塊として書くよりも、小さな部品(関数)に分けて管理する方が便利です。これは、レポートを「はじめに」「本論」「まとめ」のように章立てして書くのと同じ考え方です。

なぜコードを整理するの?

大きなプログラムを関数に分ける利点を、具体例で見ていきましょう。

まずは、整理されていないコードの例です。

整理されていないコードの例

print("クラス名簿管理プログラム")
name = input("名前を入力してください:")
age = int(input("年齢を入力してください:"))
current_year = 2024
birth_year = current_year - age
blood_type = input("血液型を入力してください:")
height = float(input("身長を入力してください(cm):"))
weight = float(input("体重を入力してください(kg):"))
height_m = height / 100
bmi = weight / (height_m ** 2)
message = f"【個人データ】\n"
message += f"名前:{name}\n"
message += f"年齢:{age}歳({birth_year}年生まれ)\n"
message += f"血液型:{blood_type}\n"
message += f"身長:{height}cm\n"
message += f"体重:{weight}kg\n"
message += f"BMI 値:{bmi:.1f}"
print(message)

少し見辛かったですね。続いて、関数に分けて整理したコードの例です。

整理されたコードの例

def get_personal_info() -> tuple[str, int, str]:
    """個人情報を入力して取得する.

    Returns:
        tuple[str, int, str]: 名前, 年齢, 血液型
    """
    name = input("名前を入力してください:")
    age = int(input("年齢を入力してください:"))
    blood_type = input("血液型を入力してください:")

    return name, age, blood_type


def get_physical_info() -> tuple[float, float]:
    """身体情報を入力して取得する.

    Returns:
        tuple[float, float]: 身長, 体重
    """
    height = float(input("身長を入力してください(cm):"))
    weight = float(input("体重を入力してください(kg):"))

    return height, weight


def calculate_birth_year(age: int) -> int:
    """年齢から生年を計算する.

    Args:
        age (int): 年齢

    Returns:
        int: 生年
    """
    current_year = 2024

    return current_year - age


def calculate_bmi(height: float, weight: float) -> float:
    """BMI を計算する.

    Args:
        height (float): 身長
        weight (float): 体重

    Returns:
        float: BMI値
    """
    return weight / (height_m ** 2)


def create_profile(name: str, age: int, birth_year: int, blood_type: str, height: float, weight: float, bmi: float) -> str:
    """プロフィール文字列を作成する関数.

    Args:
        name (str): 名前
        age (int): 年齢
        birth_year (int): 生年
        blood_type (str): 血液型
        height (float): 身長
        weight (float): 体重
        bmi (float): BMI値

    Returns:
        str: プロフィール文字列
    """
    message = "【個人データ】\n"
    message += f"名前:{name}\n"
    message += f"年齢:{age}歳({birth_year}年生まれ)\n"
    message += f"血液型:{blood_type}\n"
    message += f"身長:{height}cm\n"
    message += f"体重:{weight}kg\n"
    message += f"BMI 値:{bmi:.1f}"

    return message


def main() -> None:
    """メインの処理を行う関数"""
    print("クラス名簿管理プログラム")

    # 個人情報の入力
    name, age, blood_type = get_personal_info()

    # 身体情報の入力
    height, weight = get_physical_info()

    # 各種計算
    birth_year = calculate_birth_year(age)
    bmi = calculate_bmi(height, weight)

    # プロフィール作成と表示
    profile = create_profile(name, age, birth_year, blood_type, height, weight, bmi)
    print("\n" + profile)


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

このように、プログラムが分かりやすくなりました。

行数や文字数が多くなったとしても、このように関数やパーツごとに分けて管理すると、プログラムが読みやすくなります。

コードを整理するのは、まるで部屋の整理整頓のようなものです。

  • 関連するものをまとめる → 関連する処理を 1 つの関数に
  • 分類して収納する → 似た機能の関数をまとめる
  • ラベルを付ける → 分かりやすい関数名を付ける
  • 使いやすく並べる → 関数の順序を考える

整理整頓された部屋のように、整理されたコードは使いやすく、見つけやすくなります!

次のセクションでは、これまで学んだ関数の知識を使って、コードを短くする練習をしていきます。

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

プログラムを書いていると、同じような処理を何度も書くことがあります。そんなとき、関数を使うとコードをスッキリさせることができます。実際の例を見ながら、コードを短くする方法を学んでいきましょう。

重複するコードを関数にまとめる

まず、重複の多いコードから見ていきましょう。

重複の多いコード例

print("1 番目の生徒")
name1 = "田中"
score1 = 85

grade1 = ""
if score1 >= 90:
    grade1 = "A"
elif score1 >= 80:
    grade1 = "B"
elif score1 >= 70:
    grade1 = "C"
else:
    grade1 = "D"

print(f"{name1}さんの成績は{grade1}です")

print("\n2 番目の生徒")
name2 = "鈴木"
score2 = 92
grade2 = ""

if score2 >= 90:
    grade2 = "A"
elif score2 >= 80:
    grade2 = "B"
elif score2 >= 70:
    grade2 = "C"
else:
    grade2 = "D"

print(f"{name2}さんの成績は{grade2}です")

これを関数を使って書き直すと、このようになります。

関数を使って整理したコード

def get_grade(score: int) -> str:
    """点数から成績(A / B / C / D)を判定する.

    Args:
        score (int): 点数

    Returns:
        str: 成績(A / B / C / D)
    """
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    else:
        return "D"


def print_result(name: str, score: int) -> None:
    """生徒の成績を表示する.

    Args:
        name (str): 名前
        score (int): 点数
    """
    grade = get_grade(score)
    print(f"{name}さんの成績は{grade}です")


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

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

関数を有効に使うと、コードを整理できるだけでなく、このようにコードを短く簡潔にすることもできます。

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

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

def add(a: int, b: int) -> int:
    """2 つの数の和を返す.

    Args:
        a (int): 数値 1
        b (int): 数値 2

    Returns:
        int: 和
    """
    return a + b


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

    Args:
        a (int): 数値 1
        b (int): 数値 2

    Returns:
        int: 差
    """
    return a - b


def average(numbers: list[int]) -> float:
    """数値リストの平均を返す.

    Args:
        numbers (list[int]): 数値リスト

    Returns:
        float: 平均
    """
    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

チャレンジ:

  • 四則演算も引数に渡すようにしてみよう
  • 平均値だけでなく、最大値や最小値も計算してみよう
  • 分数の計算(約分)に応用してみよう

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

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

def gcd(a: int, b: int) -> int:
    """ユークリッドの互除法で最大公約数を求める.

    Args:
        a (int): 数値 1
        b (int): 数値 2

    Returns:
        int: 最大公約数
    """
    while b:
        a, b = b, a % b

    return a


def get_positive_number(prompt: str) -> int:
    """正の整数を入力させる.

    Args:
        prompt (str): 入力を促すメッセージ

    Returns:
        int: 正の整数
    """
    while True:
        try:
            num = int(input(prompt))

            if num > 0:
                return num

            print("正の整数を入力してください")
        except ValueError:
            print("正しい数値を入力してください")


def main() -> None:
    # 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で結果を返す
  • 組み込み関数やモジュールで便利な機能を使える
  • コードを関数に分割して管理しやすくする
  • ドキュメント(説明)を付けて分かりやすくする