Step 8:関数を作ってコードを整理しよう

⚙️ Step 8: 関数を作ってコードを整理しよう

繰り返し使えるコードの部品を作ろう!

📋 このステップで学ぶこと

  • 関数の定義(def)
  • 引数と戻り値
  • デフォルト引数
  • 関数を使った計算例

学習時間の目安: 2.5〜3時間

🎯 1. 関数とは?

処理をまとめて名前をつける

これまで、同じような処理を何度も書いてきました。でも、それは効率的ではありません。

❌ 同じコードを何度も書く問題

例えば、BMIを3人分計算する場合、同じ計算式を3回も書かなければなりません:

  • コードが長くなる
  • 計算式を変更したくなったら、全部書き換える必要がある
  • ミスが起きやすい

関数(かんすう)とは、よく使う処理をまとめて名前をつけたものです。料理のレシピのように、一度定義すれば何度でも使えます。

🍳 関数は「料理のレシピ」

料理を作る流れ:

  • 材料を渡す → 引数(ひきすう)
  • レシピに従って料理する → 関数の処理
  • 完成品を返す → 戻り値(もどりち)

例:オムレツを作る関数

  • 材料(引数): 卵、塩、バター
  • レシピ(処理): 卵を溶く、焼く、形を整える
  • 完成品(戻り値): オムレツ

今まで使ってきた関数

実は、すでにたくさんの関数を使っています。これらは組み込み関数といって、Pythonが最初から用意してくれている関数です:

  • print() – 画面に表示する関数(引数:表示したい値、戻り値:なし)
  • len() – 長さを返す関数(引数:リストや文字列、戻り値:長さの数値)
  • type() – データ型を返す関数(引数:調べたい値、戻り値:データ型)
  • range() – 数値の範囲を作る関数(引数:開始・終了・ステップ、戻り値:数値の範囲)

今回は、自分で関数を作る方法を学びます!

📌 関数を使うメリット
  • コードの再利用 – 一度書けば何度でも使える
  • 読みやすくなる – 処理に名前がつくので意図がわかりやすい
  • 保守しやすい – 修正が1箇所で済む
  • テストしやすい – 機能ごとに動作確認できる

📝 2. 関数の定義(def文)

関数を作ることを「定義する」という

関数を作ることを「関数を定義する」といいます。def(define = 定義する)という言葉を使います。

📌 関数の基本構文
def 関数名():
    実行したい処理

※ 画面が小さい場合は、コードブロックを横にスクロールできます

📌 関数定義の5つのルール
  • 1. defの後に関数名を書く
  • 2. カッコ()をつける – 引数を書く場所(今は空でOK)
  • 3. コロン(:)を行末につける – 必須!忘れるとエラー
  • 4. インデント(字下げ)する – スペース4つ(Tabキーで自動入力)
  • 5. 小文字とアンダースコアで書く – Pythonの慣習

最初の関数を作ってみよう

では、実際に関数を作ってみましょう。挨拶をする簡単な関数から始めます。

# 関数の定義 def say_hello(): print(“こんにちは!”) print(“Pythonの世界へようこそ”) # 関数を呼び出す(実行する) say_hello()
こんにちは! Pythonの世界へようこそ
💡 コードの詳しい説明

def say_hello():

  • def – 「関数を定義する」という命令
  • say_hello – 関数名(自由に決められます)
  • () – 引数を書く場所(今回は空)
  • : – コロン(必須!忘れるとSyntaxError)

print(“こんにちは!”)

  • 関数の中身(処理)
  • スペース4つでインデントされている
  • 複数行の処理を書ける

say_hello()

  • 関数を呼び出す(実行する)命令
  • 関数名の後に()をつける
  • この行が実行されると、関数の中身が実行される
🔑 重要:定義と呼び出しは別々
  • def say_hello(): – 関数を作るだけ
  • say_hello() – 関数を実行する
  • 定義しただけでは実行されません
  • 呼び出すことで初めて実行されます

関数は何度でも呼び出せる

一度定義した関数は、何度でも使えます。これが関数の大きなメリットです!

# 関数の定義 def greet(): print(“おはようございます!”) # 何度でも呼び出せる greet() greet() greet()
おはようございます! おはようございます! おはようございます!
💡 再利用のメリット
  • 同じ処理を1回だけ書けばいい
  • 必要な時に何度でも呼び出せる
  • 処理を変更したくなっても、関数の定義部分を1箇所変えるだけでOK
  • 100回呼び出しても、定義は1回だけ

📥 3. 引数(パラメータ)

関数に「材料」を渡す

今までの関数は、いつも同じ動作をしました。でも、引数(ひきすう)を使うと、関数に値を渡して、動作を変えることができます。

📌 引数の役割

引数とは、関数に渡す「材料」のようなものです。

料理に例えると:

  • オムレツを作る関数に「卵2個」を渡す → 2個分のオムレツができる
  • オムレツを作る関数に「卵3個」を渡す → 3個分のオムレツができる

プログラムでは:

  • 挨拶する関数に「太郎」を渡す → 「こんにちは、太郎さん!」
  • 挨拶する関数に「花子」を渡す → 「こんにちは、花子さん!」

引数を受け取る関数

()の中に変数名を書くことで、関数は値を受け取ることができます。

# 引数を受け取る関数 def greet(name): print(f”こんにちは、{name}さん!”) # 関数を呼び出すときに値を渡す greet(“太郎”) greet(“花子”) greet(“次郎”)
こんにちは、太郎さん! こんにちは、花子さん! こんにちは、次郎さん!
💡 コードの詳しい説明

def greet(name):

  • ()の中にnameと書く
  • これが引数の名前(変数名)
  • 関数の中でnameという変数が使える

print(f”こんにちは、{name}さん!”)

  • {name}の部分に、渡された値が入る
  • f-string(フォーマット文字列)を使用

greet(“太郎”)

  • "太郎"を引数として渡している
  • nameには"太郎"が入る

動作の流れ:

  1. greet("太郎")を実行
  2. name"太郎"が代入される
  3. print(f"こんにちは、太郎さん!")が実行される

複数の引数を受け取る

引数は複数個受け取ることもできます。カンマ(,)で区切って書きます。

# 2つの引数を受け取る def add(a, b): result = a + b print(f”{a} + {b} = {result}”) add(5, 3) add(10, 20) add(100, 200)
5 + 3 = 8 10 + 20 = 30 100 + 200 = 300
💡 複数の引数の説明

def add(a, b):

  • abという2つの引数を受け取る
  • カンマで区切って書く
  • 引数は3個、4個…といくつでも書ける

add(5, 3)

  • 最初の値(5)がaに入る
  • 2番目の値(3)がbに入る
  • 順番が重要! add(3, 5)ならa=3, b=5になる

実践例:BMI計算関数

実際に使える関数を作ってみましょう。BMI(体格指数)を計算する関数です。

# BMIを計算して表示する関数 def calculate_bmi(height_cm, weight_kg): # 身長をメートルに変換 height_m = height_cm / 100 # BMIを計算 bmi = weight_kg / (height_m ** 2) # 結果を表示 print(f”身長:{height_cm}cm”) print(f”体重:{weight_kg}kg”) print(f”BMI:{bmi:.1f}”) # 関数を呼び出す calculate_bmi(170, 65) print(“—“) calculate_bmi(160, 55)
身長:170cm 体重:65kg BMI:22.5 — 身長:160cm 体重:55kg BMI:21.5
💡 関数のメリットを実感

この関数があれば:

  • 何人分でも簡単に計算できる
  • 計算式を1箇所に書くだけでいい
  • 計算式を変更したくなっても、関数の定義を1箇所変えるだけ
  • コードが読みやすくなる(calculate_bmi(170, 65)で何をしているか一目瞭然)

📤 4. 戻り値(return)

計算結果を「返す」

今までの関数は、結果を表示するだけでした。でも、returnを使うと、計算結果を返すことができます。返された値は、変数に入れたり、他の計算に使ったりできます。

📌 戻り値の役割

戻り値とは、関数が返す「結果」です。

料理に例えると:

  • 材料を渡す → 料理する → 完成した料理を返す

プログラムでは:

  • 数値を渡す → 計算する → 計算結果を返す

返された値は:

  • 変数に入れられる
  • 他の計算に使える
  • 別の関数に渡せる

値を返す関数

returnの後に値を書くことで、その値を関数の外に返すことができます。

# 2つの数を足して結果を返す def add(a, b): result = a + b return result # 戻り値を変数に入れる answer = add(5, 3) print(answer) # 計算に使うこともできる total = add(10, 20) + add(30, 40) print(total)
8 100
💡 コードの詳しい説明

return result

  • return – 「値を返す」という命令
  • resultの値を呼び出し元に返す
  • returnに到達すると、関数はそこで終了する

answer = add(5, 3)

  • add(5, 3)が実行される
  • 5 + 3 = 8 が計算される
  • 8が返されて、answerに代入される

total = add(10, 20) + add(30, 40)

  • add(10, 20)が30を返す
  • add(30, 40)が70を返す
  • 30 + 70 = 100 が計算される
  • totalに100が代入される

printとreturnの違い

printreturnは、全く違う動作をします。この違いを理解することが非常に重要です!

📌 printとreturnの違い
命令 動作 使いどころ
print 画面に表示するだけ
値は返さない
結果を見たい時
デバッグ
return 値を返す
他の計算に使える
計算結果を変数に入れたい
他の関数に渡したい
# printを使う関数 def add_print(a, b): result = a + b print(result) # returnを使う関数 def add_return(a, b): result = a + b return result # printの場合 print(“=== printの場合 ===”) x = add_print(5, 3) # 画面に8と表示される print(f”xの値: {x}”) # xはNone # returnの場合 print(“\n=== returnの場合 ===”) y = add_return(5, 3) # 画面には何も表示されない print(f”yの値: {y}”) # yは8
=== printの場合 === 8 xの値: None === returnの場合 === yの値: 8
💡 違いの説明

printの場合:

  • 関数の中で8が表示される
  • でも値は返されない
  • xにはNone(何もない)が入る
  • 計算に使えない!

returnの場合:

  • 関数の中では何も表示されない
  • 8という値が返される
  • yには8が入る
  • 返された値を自由に使える!
🔑 重要なポイント
  • returnに到達すると関数が終了: returnの後のコードは実行されない
  • 1つの関数に複数のreturn: 条件によって返す値を変えることができる
  • returnがない関数: 自動的にNoneを返す

複数の値を返す

Pythonでは、1つの関数から複数の値を返すことができます。カンマで区切って書くだけです。

# 四則演算の結果を全て返す def calc(a, b): add_result = a + b sub_result = a – b mul_result = a * b div_result = a / b return add_result, sub_result, mul_result, div_result # 複数の戻り値を受け取る add, sub, mul, div = calc(10, 2) print(f”足し算:{add}”) print(f”引き算:{sub}”) print(f”掛け算:{mul}”) print(f”割り算:{div}”)
足し算:12 引き算:8 掛け算:20 割り算:5.0
💡 複数の戻り値の説明

return add_result, sub_result, mul_result, div_result

  • カンマで区切って複数の値を返す
  • 実際には、タプル(組)として返される
  • 4つの値が1つのまとまりとして返される

add, sub, mul, div = calc(10, 2)

  • 返された4つの値を、4つの変数で受け取る
  • 順番通りに代入される
  • 変数の数と戻り値の数が一致しないとエラー

実践例:平均値を計算する関数

リストの平均値を計算して返す関数を作りましょう。これは実際のデータ分析でよく使います。

# リストの平均値を計算して返す def calculate_average(numbers): total = sum(numbers) count = len(numbers) average = total / count return average # 使用例 scores = [85, 92, 78, 95, 88] avg = calculate_average(scores) print(f”平均点:{avg}点”) # 別のデータでも使える temperatures = [18.5, 21.2, 19.8, 22.5, 20.1] avg_temp = calculate_average(temperatures) print(f”平均気温:{avg_temp:.1f}℃”)
平均点:87.6点 平均気温:20.4℃
💡 関数の再利用性

同じ関数を、点数の平均、気温の平均など、いろんな場面で使えます。これが関数の大きなメリットです!

🎛️ 5. デフォルト引数

引数に「初期値」を設定する

デフォルト引数を使うと、引数が渡されなかった場合の初期値を設定できます。よく使う値がある場合、それをデフォルトにしておくと便利です。

📌 デフォルト引数の使いどころ

よく使う値がある場合、それをデフォルトにしておくと便利です。例えば:

  • 消費税の計算 → 税率は通常10%(デフォルト)
  • 挨拶 → 「こんにちは」が通常の挨拶(デフォルト)
  • 割引計算 → 割引なし(0%)がデフォルト

デフォルト引数の使い方

引数名の後に=値と書くことで、デフォルト値を設定できます。

# デフォルト引数を持つ関数 def greet(name, greeting=”こんにちは”): print(f”{greeting}、{name}さん!”) # 引数を2つ渡す greet(“太郎”, “おはよう”) # greetingを省略(デフォルト値が使われる) greet(“花子”) # もう一度省略 greet(“次郎”)
おはよう、太郎さん! こんにちは、花子さん! こんにちは、次郎さん!
💡 コードの詳しい説明

def greet(name, greeting=”こんにちは”):

  • greeting="こんにちは"と書く
  • これがデフォルト値
  • greetingが省略されたら、"こんにちは"が使われる

greet(“太郎”, “おはよう”)

  • 2つの引数を渡しているので、"おはよう"が使われる

greet(“花子”)

  • greetingを省略しているので、デフォルトの"こんにちは"が使われる

実践例:消費税計算

消費税を計算する関数を作りましょう。税率は通常10%なので、それをデフォルトにします。

# 消費税を計算(税率はデフォルトで10%) def add_tax(price, tax_rate=0.1): tax = price * tax_rate total = price + tax return total # 税率10%(デフォルト) print(f”1000円(10%税込): {add_tax(1000)}円”) # 税率8%を指定 print(f”1000円(8%税込): {add_tax(1000, 0.08)}円”) # 税率5%を指定 print(f”1000円(5%税込): {add_tax(1000, 0.05)}円”)
1000円(10%税込): 1100.0円 1000円(8%税込): 1080.0円 1000円(5%税込): 1050.0円
⚠️ デフォルト引数の順番

デフォルト引数は、通常の引数の後に書く必要があります。

def func(a=1, b) → エラー
def func(b, a=1) → OK

理由:

  • func(5)と呼んだ時、5がaに入るのかbに入るのか曖昧になるため
  • 通常の引数を先に、デフォルト引数を後にすることで、この問題を避ける

📊 6. データ分析でよく使う関数

データ分析では、同じような処理を何度も行います。関数にしておくと便利です。実際に使える関数をいくつか作ってみましょう。

例1:最大値・最小値を見つける

def find_max_min(numbers): “””リストの最大値と最小値を返す””” max_value = max(numbers) min_value = min(numbers) return max_value, min_value # 使用例 data = [45, 78, 23, 91, 56, 34, 89] max_val, min_val = find_max_min(data) print(f”最大値:{max_val}”) print(f”最小値:{min_val}”) print(f”範囲:{max_val – min_val}”)
最大値:91 最小値:23 範囲:68
💡 ドキュメント文字列

“””リストの最大値と最小値を返す”””

  • 関数の最初に書く説明文
  • 3つのダブルクォート(”””)で囲む
  • 関数が何をするか説明する
  • 良い習慣なので、書くようにしましょう

例2:データのフィルタリング

特定の条件に合うデータだけを抽出する関数を作りましょう。

def filter_by_threshold(numbers, threshold): “””閾値以上の値だけを返す””” result = [] for num in numbers: if num >= threshold: result.append(num) return result # 使用例:80点以上の点数を抽出 scores = [95, 72, 88, 91, 65, 78, 85] high_scores = filter_by_threshold(scores, 80) print(f”80点以上の点数:{high_scores}”) print(f”人数:{len(high_scores)}人”)
80点以上の点数:[95, 88, 91, 85] 人数:4人

例3:データの正規化

データを0〜1の範囲に変換する関数を作りましょう。これは機械学習でよく使います。

def normalize(numbers): “””データを0〜1の範囲に正規化””” min_val = min(numbers) max_val = max(numbers) range_val = max_val – min_val normalized = [] for num in numbers: norm = (num – min_val) / range_val normalized.append(norm) return normalized # 使用例 data = [10, 20, 30, 40, 50] norm_data = normalize(data) print(“元のデータ:”, data) print(“正規化後:”, [f”{x:.2f}” for x in norm_data])
元のデータ: [10, 20, 30, 40, 50] 正規化後: [‘0.00’, ‘0.25’, ‘0.50’, ‘0.75’, ‘1.00’]
💡 正規化とは

データの範囲を0〜1に変換することです。異なるスケールのデータを比較する時に使います。

例:

  • 10〜50のデータ → 0.00〜1.00に変換
  • 最小値(10)が0.00になる
  • 最大値(50)が1.00になる
  • 中間の値は、その比率に応じて変換される

📝 練習問題

ここまで学んだことを、実際に手を動かして確認しましょう!

問題 1 基本

挨拶関数を作る

名前を引数として受け取り、「〇〇さん、こんにちは!」と表示する関数greetを作成してください。

def greet(name): print(f”{name}さん、こんにちは!”) # テスト greet(“太郎”) greet(“花子”)
太郎さん、こんにちは! 花子さん、こんにちは!
問題 2 基本

掛け算関数

2つの数を受け取って、その積を返す関数multiplyを作成してください。

def multiply(a, b): return a * b # テスト print(multiply(5, 3)) print(multiply(10, 7)) result = multiply(12, 8) print(f”12 × 8 = {result}”)
15 70 12 × 8 = 96
問題 3 応用

偶数・奇数判定関数

数値を受け取って、偶数なら「偶数」、奇数なら「奇数」という文字列を返す関数is_even_or_oddを作成してください。

def is_even_or_odd(number): if number % 2 == 0: return “偶数” else: return “奇数” # テスト print(f”10は{is_even_or_odd(10)}”) print(f”7は{is_even_or_odd(7)}”) print(f”0は{is_even_or_odd(0)}”)
10は偶数 7は奇数 0は偶数
問題 4 応用

合計と平均を返す関数

数値のリストを受け取って、合計と平均を返す関数calc_sum_avgを作成してください。

def calc_sum_avg(numbers): total = sum(numbers) average = total / len(numbers) return total, average # テスト scores = [85, 92, 78, 95, 88] total, avg = calc_sum_avg(scores) print(f”合計:{total}点”) print(f”平均:{avg}点”)
合計:438点 平均:87.6点
問題 5 チャレンジ

温度変換関数

摂氏温度(℃)を華氏温度(°F)に変換する関数celsius_to_fahrenheitを作成してください。
公式:°F = ℃ × 9/5 + 32
デフォルト引数で、小数点以下の桁数(デフォルト1桁)を指定できるようにしてください。

def celsius_to_fahrenheit(celsius, decimal_places=1): fahrenheit = celsius * 9/5 + 32 return round(fahrenheit, decimal_places) # テスト print(f”0℃ = {celsius_to_fahrenheit(0)}°F”) print(f”25℃ = {celsius_to_fahrenheit(25)}°F”) print(f”100℃ = {celsius_to_fahrenheit(100)}°F”) # 小数点以下2桁で表示 print(f”36.5℃ = {celsius_to_fahrenheit(36.5, 2)}°F”)
0℃ = 32.0°F 25℃ = 77.0°F 100℃ = 212.0°F 36.5℃ = 97.7°F

🎯 このステップのまとめ

✅ 学んだこと
  • defで関数を定義できる
  • 引数で関数に値を渡せる
  • returnで値を返せる
  • デフォルト引数で初期値を設定できる
  • 関数を使ってコードを整理・再利用できる
  • 複数の戻り値を返すこともできる
  • printとreturnの違いを理解した
  • ドキュメント文字列で関数を説明できる
🎓 次のステップに進む前に
  • def文で関数を定義できますか?
  • 引数を使って値を渡せますか?
  • returnで値を返せますか?
  • デフォルト引数を使えますか?
  • printとreturnの違いがわかりますか?

これらができたら、次のステップに進みましょう!

❓ よくある質問

Q1: 関数名にはどんな名前をつけるべきですか?
動詞で始める名前が良いです。例えば、calculate_average(平均を計算する)、find_max(最大値を見つける)、convert_temperature(温度を変換する)など。何をする関数かわかりやすくしましょう。小文字とアンダースコアを使うのがPythonの慣習です。
Q2: printとreturnの違いは何ですか?
printは画面に表示するだけ(値は返さない)、returnは値を返して他の計算に使えます。関数の結果を変数に入れたり、計算に使いたい場合はreturnを使いましょう。
Q3: returnの後のコードは実行されますか?
いいえ、returnに到達すると関数が終了します。return以降のコードは実行されません。これを利用して、条件によって早めに関数を終了することもできます。
Q4: 関数の中で定義した変数は外で使えますか?
いいえ、関数の中で定義した変数はローカル変数といって、関数の外では使えません。これを「スコープ(範囲)」といいます。関数の外で使いたい値は、returnで返す必要があります。
Q5: 引数はいくつでも受け取れますか?
はい、いくつでも受け取れます。ただし、引数が多すぎると使いにくくなります。一般的には3〜5個までが適切です。それ以上必要な場合は、リストや辞書にまとめて渡すことを検討しましょう。
Q6: returnは必須ですか?
いいえ、returnは省略できます。returnがない関数は、自動的にNoneを返します。画面に表示するだけの関数(printだけ)なら、returnは不要です。
Q7: 関数の中で別の関数を呼び出せますか?
はい、できます。関数の中で別の関数を呼び出すことは、とても一般的です。複雑な処理を小さな関数に分けることで、コードが読みやすくなります。
Q8: ドキュメント文字列は必要ですか?
必須ではありませんが、書くことを強く推奨します。後で自分がコードを見返したとき、何をする関数かすぐにわかります。他の人がコードを読むときも役立ちます。
📝

学習メモ

Pythonデータ分析入門 - Step 8

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE