こんにちは!前回の【Python入門シリーズ⑤】では繰り返し処理について学習しました。今回は関数(かんすう)について詳しく解説していきます。関数は「処理をパッケージ化して名前をつけたもの」で、プログラムを整理整頓し、再利用可能にする強力な仕組みです。料理のレシピに名前をつけて保存するようなもので、一度作れば何度でも使い回すことができます!図や画像、イラストを使って分かりやすく解説していきますね。

このシリーズの目次
このシリーズでは、プログラミングの基礎から始めて、最終的にはAI・機械学習の初歩までを体験できるような構成になっています。
- 第0回: 開発環境の準備 (VS Codeで始めるPython環境構築)
- 第1回: Pythonの特徴とコードの基礎
- 第2回: 変数と型の扱い
- 第3回: 基本的な演算子と演算
- 第4回: 条件分岐の仕方
- 第5回: 繰り返し処理でプログラムを自動化する
- 第6回: 関数を作ってコードを整理整頓する ←今ここ
- 第7回: 複数のデータを扱う「リスト」と文字列操作
- 第8回: ライブラリでPythonの能力を拡張する
- 第9回: ファイルの読み込みと書き込み
- 第10回: Matplotlib入門!データをグラフで可視化する
- 第11回: 画像データの仕組みとPillowでの基本操作
- 第12回: 画像処理の基礎(フィルタリングと特徴抽出)
- 第13回: 機械学習実践!AIによる画像分類に挑戦
- 第14回: オープンデータの取得と前処理(データクレンジング)
- 第15回: 実践データ分析!オープンデータから傾向を読み解く
関数とは何か?
関数とは、特定の処理をひとまとめにして名前を付けたものです。日常生活で例えると「料理のレシピ」のようなものです。
例えば「カレーを作る」というレシピ(関数)があれば:
- 材料(入力)を用意する
- レシピ通りに調理する(処理)
- 完成したカレー(出力)が得られる
このレシピを一度作っておけば、何度でも同じカレーを作ることができますよね。プログラミングでも同じです。
関数を使うメリット
- コードの再利用: 同じ処理を何度も書かなくて済む
- 可読性の向上: 処理に名前がついているので、何をしているか分かりやすい
- 保守性の向上: 修正が必要な時、1箇所直せば全体に反映される
- テストのしやすさ: 小さな単位でテストできる
- チーム開発: 役割分担がしやすくなる

すでに使っている関数
実は、これまでも多くの関数を使ってきました:
print("Hello") # 文字列を表示する関数
len([1, 2, 3]) # リストの長さを返す関数
range(10) # 数値の範囲を生成する関数
input("名前: ") # ユーザー入力を受け取る関数
Pythonこれらは組み込み関数と呼ばれ、Pythonに最初から用意されている関数です。今回は、自分で新しい関数を作る方法を学んでいきます!
関数の基本構文
Pythonで関数を定義(作成)するにはdefキーワードを使います。
最もシンプルな関数
def greet():
print("こんにちは!")
print("ようこそ!")
# 関数を呼び出す
greet()
Python出力:
こんにちは!
ようこそ!
構文のポイント
def 関数名():
処理1
処理2
...
Pythondefで関数定義を開始- 関数名の後に
()をつける - 行末に
:(コロン)をつける - 処理内容はインデント(字下げ)する
- 関数を実行するには
関数名()と書く
関数名のルール:
- 小文字とアンダースコア
_を使う(例:calculate_total,get_user_name) - 動詞から始めると分かりやすい(例:
get,calculate,show,check) - 意味のある名前をつける(
a()よりcalculate_average()の方が良い)
[画像生成プロンプト]
A diagram showing the anatomy of a Python function definition. Shows the structure: def keyword, function name, parentheses, colon, and indented code block. Each part is clearly labeled with arrows pointing to its role. Clean technical diagram style with code syntax highlighting. Dark background with colorful code elements.
引数(パラメータ)を受け取る関数
関数に**引数(ひきすう)**を渡すことで、異なる値で同じ処理を実行できます。料理のレシピで「材料」に相当します。
基本的な引数の使い方
def greet(name):
print(f"こんにちは、{name}さん!")
greet("太郎")
greet("花子")
Python出力:
こんにちは、太郎さん!
こんにちは、花子さん!
この例では、nameという仮引数(パラメータ)を定義し、関数呼び出し時に"太郎"や"花子"という実引数を渡しています。
複数の引数を受け取る
def introduce(name, age):
print(f"私の名前は{name}です")
print(f"年齢は{age}歳です")
introduce("太郎", 25)
introduce("花子", 30)
Python引数の順番は重要です。定義した順番と同じ順番で値を渡す必要があります。
私の名前は太郎です
年齢は25です
私の名前は花子です
年齢は30です
デフォルト引数(初期値)
引数にデフォルト値を設定すると、値が渡されなかった時にその値が使われます。
def greet(name, greeting="こんにちは"):
print(f"{greeting}、{name}さん!")
greet("太郎") # デフォルト値を使用
greet("花子", "おはよう") # 値を指定
Python出力:
こんにちは、太郎さん!
おはよう、花子さん!
注意点: デフォルト値を持つ引数は、持たない引数の後に書く必要があります。
# ❌ エラーになる
def bad_function(name="太郎", age):
pass
# ✅ 正しい書き方
def good_function(age, name="太郎"):
pass
Pythonキーワード引数
引数名を指定して値を渡すこともできます。これにより順番を気にせず呼び出せます。
def create_user(name, age, city):
print(f"{city}在住の{name}さん({age}歳)")
# 位置引数
create_user("太郎", 25, "東京")
# キーワード引数
create_user(age=30, city="大阪", name="花子")
# 混在も可能(位置引数→キーワード引数の順)
create_user("次郎", city="福岡", age=28)
Python余計複雑にも見えますね笑
戻り値(返り値)を返す関数
関数は処理結果を戻り値(return value)として返すことができます。料理のレシピで「完成した料理」に相当します。
return文の基本
def add(a, b):
result = a + b
return result
# 戻り値を変数で受け取る
total = add(3, 5)
print(f"合計: {total}") # 合計: 8
# 直接使うこともできる
print(f"10 + 20 = {add(10, 20)}") # 10 + 20 = 30
Pythonreturn文の重要な特徴
- 関数はreturn文で即座に終了する
def check_password(password):
if len(password) < 8:
return "パスワードが短すぎます"
if not any(c.isdigit() for c in password):
return "数字を含めてください"
return "パスワードは有効です"
print(check_password("abc")) # パスワードが短すぎます
print(check_password("abcdefgh")) # 数字を含めてください
print(check_password("abc12345")) # パスワードは有効です
Python最初のreturnに到達した時点で関数は終了し、それ以降の処理は実行されません。
- return文がない、または値を指定しない場合はNoneが返される
def greet(name):
print(f"こんにちは、{name}さん!")
# return文がない
result = greet("太郎")
print(result) # None
Python- 複数の値を返すことができる(タプルとして)
def calculate(a, b):
total = a + b
diff = a - b
product = a * b
return total, diff, product
# 複数の変数で受け取る
sum_val, diff_val, prod_val = calculate(10, 3)
print(f"和: {sum_val}, 差: {diff_val}, 積: {prod_val}")
# 和: 13, 差: 7, 積: 30
Python実用例: 計算機能を関数化
def calculate_bmi(weight, height):
"""BMI(体格指数)を計算する関数"""
bmi = weight / (height ** 2)
return round(bmi, 1)
def judge_bmi(bmi):
"""BMI値から判定を返す関数"""
if bmi < 18.5:
return "低体重"
elif bmi < 25:
return "普通体重"
elif bmi < 30:
return "肥満(1度)"
else:
return "肥満(2度以上)"
# 使用例
weight = 65 # kg
height = 1.70 # m
bmi = calculate_bmi(weight, height)
judgment = judge_bmi(bmi)
print(f"あなたのBMI: {bmi}")
print(f"判定: {judgment}")
Pythonこのように、処理を関数に分けることで、それぞれの責任が明確になり、理解しやすくなります。同じ処理を何回も行いたいときには便利ですね!

関数のスコープ(変数の有効範囲)
関数内で定義した変数は、その関数の中でしか使えません。これを**スコープ(scope)**と呼びます。
ローカル変数とグローバル変数
# グローバル変数(プログラム全体で使える)
global_var = "グローバル"
def my_function():
# ローカル変数(関数内でのみ使える)
local_var = "ローカル"
print(global_var) # グローバル変数は読める
print(local_var) # ローカル変数も読める
my_function()
print(global_var) # グローバル変数は読める
print(local_var) # ❌ エラー! ローカル変数は関数外では読めない
Pythonスコープの図解
ローカル変数は関数の中でしか使えません!

ベストプラクティス
- グローバル変数は最小限に: できるだけ引数と戻り値でデータをやり取りする
- 関数は独立させる: 関数外の変数に依存しないようにする
- 副作用を避ける: 関数内でグローバル変数を変更しない(必要な場合を除く)
# ❌ あまり良くない例
counter = 0
def increment():
global counter
counter += 1Python# ✅ より良い例
def increment(counter):
return counter + 1
counter = 0
counter = increment(counter)
Pythonドキュメンテーション文字列(docstring)
関数の説明を書くための特別なコメントをdocstring(ドキュメンテーション文字列)と呼びます。
docstringの書き方
def calculate_area(width, height):
"""
長方形の面積を計算する関数
Args:
width (float): 幅
height (float): 高さ
Returns:
float: 面積
"""
return width * height
Pythondocstringを書くメリット:
- 関数の使い方が明確になる
help(関数名)で説明を表示できる- 自動ドキュメント生成ツールが使える
help(calculate_area)
# 上記で定義した説明が表示されるPython関数を使った実践例
写経してみよう!実際に手を動かすと覚えられます!!
例1: データの検証関数
def validate_email(email):
"""メールアドレスの簡易検証"""
if "@" not in email:
return False, "@ が含まれていません"
if "." not in email.split("@")[1]:
return False, "ドメインに . が含まれていません"
return True, "有効なメールアドレスです"
# 使用例
test_emails = ["user@example.com", "invalid.email", "user@domain"]
for email in test_emails:
is_valid, message = validate_email(email)
print(f"{email}: {message}")
Python例2: データ集計関数
def calculate_statistics(numbers):
"""数値リストの統計情報を計算"""
if not numbers:
return None
total = sum(numbers)
count = len(numbers)
average = total / count
maximum = max(numbers)
minimum = min(numbers)
return {
"合計": total,
"個数": count,
"平均": round(average, 2),
"最大": maximum,
"最小": minimum
}
# 使用例
scores = [85, 92, 78, 90, 88, 76, 95, 82]
stats = calculate_statistics(scores)
for key, value in stats.items():
print(f"{key}: {value}")
Python
例3: 温度変換関数
def celsius_to_fahrenheit(celsius):
"""摂氏から華氏に変換"""
return (celsius * 9/5) + 32
def fahrenheit_to_celsius(fahrenheit):
"""華氏から摂氏に変換"""
return (fahrenheit - 32) * 5/9
def celsius_to_kelvin(celsius):
"""摂氏からケルビンに変換"""
return celsius + 273.15
# 使用例
temp_c = 25
print(f"{temp_c}°C = {celsius_to_fahrenheit(temp_c):.1f}°F")
print(f"{temp_c}°C = {celsius_to_kelvin(temp_c):.2f}K")
Python再帰関数(自分自身を呼び出す関数)
関数は自分自身を呼び出すことができます。これを**再帰(recursion)**と呼びます。
階乗の計算(再帰版)
def factorial(n):
"""階乗を再帰的に計算"""
# 基底ケース(終了条件)
if n == 0 or n == 1:
return 1
# 再帰ケース
else:
return n * factorial(n - 1)
print(factorial(5)) # 5! = 5 × 4 × 3 × 2 × 1 = 120
Python処理の流れ:
factorial(5)
= 5 * factorial(4)
= 5 * (4 * factorial(3))
= 5 * (4 * (3 * factorial(2)))
= 5 * (4 * (3 * (2 * factorial(1))))
= 5 * (4 * (3 * (2 * 1)))
= 5 * (4 * (3 * 2))
= 5 * (4 * 6)
= 5 * 24
= 120

再帰を使う際の注意点
- 必ず終了条件(基底ケース)を設定する
# ❌ 無限再帰(エラーになる) def bad_recursion(n): return bad_recursion(n - 1) # 終了条件がない! - 再帰の深さに制限がある: Pythonでは約1000回が上限
- 必ずしも効率的ではない: 同じ計算を何度も繰り返すことがある
多くの場合、ループで書いた方が効率的です:
# ループ版(こちらの方が効率的)
def factorial_iterative(n):
result = 1
for i in range(2, n + 1):
result *= i
return result
PythonAIとの関連性
関数は、AI・機械学習プログラミングにおいても基礎中の基礎です。
ニューラルネットワークと関数
ニューラルネットワーク自体が、実は巨大な関数の組み合わせです。各ニューロン(神経細胞)は、入力を受け取って計算し、出力を返す小さな関数として働きます。
# ニューラルネットワークの活性化関数の例
def relu(x):
"""ReLU活性化関数"""
return max(0, x)
def sigmoid(x):
"""シグモイド活性化関数"""
return 1 / (1 + math.exp(-x))
# これらの関数が何百、何千と組み合わされてAIが動作する
Python
データ処理パイプラインと関数
機械学習では、データを段階的に処理していきます。各段階を関数にすることで、処理の流れが明確になります。
def load_data(filepath):
"""データを読み込む"""
# データ読み込み処理
pass
def clean_data(data):
"""データをクレンジング(欠損値処理など)"""
# クレンジング処理
pass
def normalize_data(data):
"""データを正規化"""
# 正規化処理
pass
def train_model(data):
"""モデルを訓練"""
# 訓練処理
pass
# データ処理パイプライン
data = load_data("data.csv")
data = clean_data(data)
data = normalize_data(data)
model = train_model(data)
Pythonこのように、複雑な処理を関数に分解することで、各ステップを独立してテスト・改善できます。
よくあるエラーとその対策
1. IndentationError: expected an indented block
# ❌ エラーになる
def greet():
print("Hello") # インデントがない
Python原因: 関数の中身がインデントされていない
解決方法:
# ✅ 正しい書き方
def greet():
print("Hello") # 4つのスペースでインデント
Python2. TypeError: missing required argument
def add(a, b):
return a + b
result = add(5) # ❌ 引数が足りない
Python原因: 必要な引数が渡されていない
解決方法:
result = add(5, 3) # ✅ 全ての引数を渡す
# または
def add(a, b=0): # デフォルト値を設定
return a + b
Python3. NameError: name is not defined
def calculate():
result = x + y # ❌ x, yが定義されていない
return result
calculate()
Python原因: 関数内で使っている変数が定義されていない
解決方法:
# ✅ 引数として受け取る
def calculate(x, y):
result = x + y
return result
calculate(5, 3)
Python4. UnboundLocalError: local variable referenced before assignment
count = 0
def increment():
count = count + 1 # ❌ エラー
return count
Python原因: ローカル変数として扱われるが、代入前に参照している
解決方法:
# ✅ 方法1: 引数と戻り値で扱う(推奨)
def increment(count):
return count + 1
count = 0
count = increment(count)
# ✅ 方法2: globalを使う(非推奨)
count = 0
def increment():
global count
count = count + 1
return count
Python5. 関数が呼び出されていない
def greet():
print("Hello")
greet # ❌ 何も起こらない
Python原因: 関数名だけ書いて()を忘れている
解決方法:
greet() # ✅ ()をつけて呼び出す
Python練習問題
問題1: 温度判定関数
気温を引数として受け取り、以下の基準で判定メッセージを返す関数judge_temperature(temp)を作成してください。
- 30度以上: “猛暑です。熱中症に注意!”
- 25度以上30度未満: “暑いです”
- 15度以上25度未満: “快適です”
- 10度以上15度未満: “涼しいです”
- 10度未満: “寒いです。暖かくしてください”
ヒント: if-elif-else文と比較演算子を使います。
問題2: 偶数・奇数リスト分類関数
整数のリストを受け取り、偶数のリストと奇数のリストの2つを返す関数separate_even_odd(numbers)を作成してください。
例:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens, odds = separate_even_odd(numbers)
print(evens) # [2, 4, 6, 8, 10]
print(odds) # [1, 3, 5, 7, 9]
ヒント:
- 空のリストを2つ用意
- forループで各数値をチェック
%演算子で偶数・奇数を判定- 2つの値をreturnする
問題3: パスワード生成関数
指定された長さのランダムなパスワードを生成する関数generate_password(length, use_numbers=True, use_symbols=True)を作成してください。
length: パスワードの長さuse_numbers: 数字を含めるか(デフォルト: True)use_symbols: 記号を含めるか(デフォルト: True)
ヒント:
import random
import string
# 使える文字の例
letters = string.ascii_letters # a-z, A-Z
digits = string.digits # 0-9
symbols = "!@#$%^&*"
# random.choice(文字列)でランダムに1文字選べます
問題4: フィボナッチ数列
n番目のフィボナッチ数を返す関数fibonacci(n)を作成してください。フィボナッチ数列とは、最初の2項が1で、3項目以降は前の2項の和になる数列です。
例: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…
ヒント: ループ版と再帰版の両方に挑戦してみましょう!
# ループ版の考え方
# a = 1, b = 1 から始めて
# 次の値 = a + b
# aとbを更新していく
問題5: データ集計ダッシュボード
以下の商品販売データから、様々な統計情報を計算する関数群を作成してください。
sales_data = [
{"product": "りんご", "price": 150, "quantity": 10},
{"product": "バナナ", "price": 100, "quantity": 15},
{"product": "オレンジ", "price": 120, "quantity": 8},
{"product": "ぶどう", "price": 300, "quantity": 5},
]
作成する関数:
calculate_total_revenue(sales_data): 総売上を計算find_best_selling_product(sales_data): 最も売れた商品(数量ベース)find_highest_revenue_product(sales_data): 最も売上の高い商品calculate_average_price(sales_data): 平均価格
チャレンジ: 結果を見やすく表示するdisplay_summary(sales_data)関数も作成してみましょう!
まとめ
今回は関数について学習しました。重要なポイントをおさらいします:
関数の基本
defキーワードで関数を定義する- 関数名は小文字とアンダースコアを使う
- コロン(
:)とインデントを忘れずに 関数名()で呼び出す
引数(パラメータ)
- 関数に値を渡して処理を柔軟にする
- 複数の引数を定義できる
- デフォルト値を設定できる
- キーワード引数で順番を気にせず呼び出せる
戻り値(返り値)
return文で値を返す- returnに到達すると関数は即座に終了
- 複数の値をタプルとして返せる
- return文がないとNoneが返される
スコープ
- 関数内の変数(ローカル変数)は関数外からは見えない
- グローバル変数は関数内から読める
- できるだけ引数と戻り値でデータをやり取りする
その他の重要概念
- docstring: 関数の説明を書く
- ラムダ式: 簡単な関数を1行で書く
- 再帰: 関数が自分自身を呼び出す
関数を使うメリット
- コードの再利用性が高まる
- プログラムが読みやすくなる
- 変更・修正が容易になる
- テストしやすくなる
- チームで分担しやすくなる

関数は、プログラミングにおける「部品化」の基本です。複雑なプログラムも、小さな関数の組み合わせとして考えることで、理解しやすく、保守しやすくなります。AI・機械学習の分野でも、データ処理、モデル構築、評価など、あらゆる場面で関数が活躍します!
次回予告
第7回では「複数のデータを扱う『リスト』と文字列操作」として、より高度なデータ構造と操作方法を学習します。リスト内包表記、タプル、辞書など、Pythonの強力なデータ処理機能を習得していきます。関数と組み合わせることで、さらに実践的なプログラミングができるようになります。お楽しみに!


コメント