Pythonのdef文とは?関数の作り方を基礎から学ぼう
Pythonのdef文を使った関数の作り方を初心者向けに詳しく解説。基本的な書き方から引数、戻り値、実践的な使い方まで実例付きで説明します。
Pythonのdef文とは?関数の作り方を基礎から学ぼう
みなさん、Pythonで「関数」という言葉を聞いたことありますか?
「def文って何?」「関数の作り方がわからない」 「いつ関数を使えばいいの?」
こんな疑問を持っている人も多いですよね。
関数は、Pythonプログラミングの基礎中の基礎です。 この記事では、def文を使った関数の作り方を初心者向けにやさしく解説します。
基本的な書き方から実践的な活用法まで、コード例とともに一緒に学んでいきましょう!
関数って何だろう?
関数の基本的な考え方
関数とは、特定の処理をまとめて名前を付けたものです。
数学の関数と似ていて、「入力」を受け取って「出力」を返します。 イメージとしては、材料を入れて料理を作る機械のようなものですね。
# 数学の関数のイメージ# f(x) = x + 1# x=5を入力すると、6が出力される
# Pythonの関数def add_one(x): return x + 1
result = add_one(5) # 6が返されるprint(result) # 6
この例では、add_one
という関数に数値5を渡すと、1を足した6が返ってきます。
とてもシンプルですよね!
なぜ関数を使うの?
関数を使う理由は主に3つあります。
1. コードの再利用ができる
同じ処理を何度も書く必要がありません。
# 関数を使わない場合(同じ処理を何度も書く)name1 = "田中"print(f"こんにちは、{name1}さん!")
name2 = "佐藤"print(f"こんにちは、{name2}さん!")
name3 = "鈴木"print(f"こんにちは、{name3}さん!")
# 関数を使う場合(処理を一度定義して再利用)def greet(name): print(f"こんにちは、{name}さん!")
greet("田中")greet("佐藤")greet("鈴木")
関数を使うと、コードがスッキリして読みやすくなります。
2. コードの整理ができる
複雑な処理を関数で分けることで、プログラムが理解しやすくなります。
# 複雑な処理を関数で整理def calculate_total_price(price, quantity, tax_rate): """合計金額を計算する関数""" subtotal = price * quantity tax = subtotal * tax_rate total = subtotal + tax return total
# 使用例apple_total = calculate_total_price(100, 3, 0.1) # りんご3個banana_total = calculate_total_price(150, 2, 0.1) # バナナ2個
print(f"りんごの合計: {apple_total}円")print(f"バナナの合計: {banana_total}円")
何をしているかが一目でわかりますね。
3. エラーの発見がしやすい
問題が起きた時に、どの部分に原因があるかを特定しやすくなります。
# 関数に分けることで、問題の箇所を特定しやすくなるdef validate_email(email): """メールアドレスの形式をチェック""" if "@" not in email: return False if "." not in email: return False return True
def send_email(email, message): """メール送信処理""" if not validate_email(email): print("無効なメールアドレスです") return False print(f"{email}にメッセージを送信: {message}") return True
# エラーがあっても、どの関数に問題があるかすぐわかる
機能ごとに分けることで、デバッグが楽になります。
def文の基本的な書き方
基本の構文
Pythonで関数を作るにはdef
文を使います。
基本的な構文はこのようになります。
# 基本的なdef文の構文def 関数名(): """関数の説明(オプション)""" 処理の内容 return 戻り値 # 必要に応じて
実際の例を見てみましょう。
最もシンプルな関数
# 引数なし、戻り値なしの関数def say_hello(): print("こんにちは!")
# 関数の呼び出しsay_hello() # 「こんにちは!」が表示される
この関数はsay_hello
という名前で、呼び出すと「こんにちは!」と表示されます。
とてもシンプルですが、これも立派な関数です。
わかりやすい関数名を付けよう
関数名は、何をする関数なのかがすぐにわかるようにしましょう。
# 良い関数名の例def calculate_area(): # 面積を計算する pass
def get_user_name(): # ユーザー名を取得する pass
def send_notification(): # 通知を送信する pass
# 避けるべき関数名def func(): # 何をする関数かわからない pass
def a(): # 短すぎて意味不明 pass
関数名を見ただけで、どんな処理をするかがわかるのが理想です。
関数の説明を書こう
関数にコメントを書くことで、使い方がより明確になります。
def calculate_circle_area(radius): """ 円の面積を計算する関数 Args: radius (float): 円の半径 Returns: float: 円の面積 """ area = 3.14159 * radius * radius return area
# 簡単なコメントの場合def greet_user(name): """ユーザーに挨拶するメッセージを表示""" print(f"ようこそ、{name}さん!")
コメントがあると、後から見た時に理解しやすくなります。
引数を使って値を渡そう
基本的な引数の使い方
関数に値を渡すための仕組みが引数です。
関数を呼び出す時に、必要な情報を渡すことができます。
# 1つの引数を受け取る関数def double(number): """数値を2倍にする関数""" result = number * 2 return result
print(double(5)) # 10print(double(3.5)) # 7.0
# 複数の引数を受け取る関数def add_numbers(a, b): """2つの数値を足し算する関数""" return a + b
print(add_numbers(3, 7)) # 10print(add_numbers(1.5, 2.5)) # 4.0
引数を使うことで、関数をより柔軟に活用できます。
もっと実用的な例
実際のプログラムでよく使われるような関数を作ってみましょう。
# BMI計算の関数def calculate_bmi(weight, height): """BMIを計算する関数 Args: weight (float): 体重(kg) height (float): 身長(m) Returns: float: BMI値 """ bmi = weight / (height ** 2) return round(bmi, 2)
# 使用例my_bmi = calculate_bmi(65, 1.70)print(f"BMI: {my_bmi}") # BMI: 22.49
# 挨拶メッセージの関数def create_greeting(name, time_of_day): """時間帯に応じた挨拶メッセージを作成""" if time_of_day == "morning": return f"おはようございます、{name}さん!" elif time_of_day == "afternoon": return f"こんにちは、{name}さん!" elif time_of_day == "evening": return f"こんばんは、{name}さん!" else: return f"こんにちは、{name}さん!"
print(create_greeting("田中", "morning")) # おはようございます、田中さん!print(create_greeting("佐藤", "afternoon")) # こんにちは、佐藤さん!
このように、引数を使うことで汎用性の高い関数が作れます。
デフォルト引数で便利に
引数にデフォルト値を設定することもできます。
# デフォルト引数の使用def greet(name, greeting="こんにちは"): """挨拶する関数(デフォルトの挨拶は「こんにちは」)""" return f"{greeting}、{name}さん!"
# デフォルト値を使う場合print(greet("田中")) # こんにちは、田中さん!
# デフォルト値を上書きする場合print(greet("佐藤", "おはよう")) # おはよう、佐藤さん!print(greet("鈴木", "こんばんは")) # こんばんは、鈴木さん!
# より実用的な例:税込み価格計算def calculate_price_with_tax(price, tax_rate=0.1): """税込み価格を計算(デフォルトの税率は10%)""" return price * (1 + tax_rate)
print(calculate_price_with_tax(1000)) # 1100.0(10%税込み)print(calculate_price_with_tax(1000, 0.08)) # 1080.0(8%税込み)
デフォルト引数を使うと、よく使う値を省略できて便利です。
キーワード引数でもっと自由に
引数の名前を指定して値を渡すこともできます。
def create_profile(name, age, city, job="未設定"): """プロフィール情報を作成""" return f"名前: {name}, 年齢: {age}, 住所: {city}, 職業: {job}"
# 位置引数で呼び出しprofile1 = create_profile("田中", 25, "東京")print(profile1)
# キーワード引数で呼び出し(順番を変えても良い)profile2 = create_profile(city="大阪", name="佐藤", age=30, job="エンジニア")print(profile2)
# 混在も可能(位置引数が先)profile3 = create_profile("鈴木", age=28, city="福岡")print(profile3)
キーワード引数を使うと、どの値が何の引数かわかりやすくなります。
return文で値を返そう
returnの基本的な使い方
関数から値を返すためにreturn
文を使います。
# 値を返す関数def multiply(a, b): result = a * b return result # 計算結果を返す
answer = multiply(6, 7)print(answer) # 42
# より簡潔に書くことも可能def multiply_simple(a, b): return a * b # 直接計算結果を返す
return
文を使うことで、関数の結果を他の場所で使えるようになります。
複数の値を返すこともできる
Pythonでは、一度に複数の値を返すことができます。
# 複数の値をタプルで返すdef calculate_stats(numbers): """数値リストの統計情報を計算""" total = sum(numbers) count = len(numbers) average = total / count if count > 0 else 0 return total, count, average # 3つの値を返す
# 複数の値を受け取るscores = [85, 92, 78, 96, 88]total, count, avg = calculate_stats(scores)
print(f"合計: {total}")print(f"件数: {count}")print(f"平均: {avg:.2f}")
# 辞書で返すこともできるdef analyze_text(text): """テキストを分析して結果を辞書で返す""" return { "文字数": len(text), "単語数": len(text.split()), "大文字の数": sum(1 for c in text if c.isupper()), "小文字の数": sum(1 for c in text if c.islower()) }
result = analyze_text("Hello World Python Programming")print(result)
複数の値を返すと、関数の結果をより詳しく知ることができます。
return文がない場合
return
文を書かない場合、関数は自動的にNone
を返します。
# return文がない関数は自動的にNoneを返すdef print_message(message): print(f"メッセージ: {message}") # return文なし
result = print_message("こんにちは")print(result) # None が表示される
# 条件によってreturnする場合def check_password(password): """パスワードの強度をチェック""" if len(password) < 8: return "パスワードが短すぎます" if not any(c.isdigit() for c in password): return "数字を含めてください" if not any(c.isupper() for c in password): return "大文字を含めてください" return "パスワードは安全です"
print(check_password("abc")) # パスワードが短すぎますprint(check_password("abcdefgh")) # 数字を含めてくださいprint(check_password("abcdefg1")) # 大文字を含めてくださいprint(check_password("Abcdefg1")) # パスワードは安全です
条件に応じて異なる値を返すこともできます。
実用的な関数を作ってみよう
日常で使えるユーティリティ関数
実際のプログラムでよく使われる関数を作ってみましょう。
# 温度変換の関数def celsius_to_fahrenheit(celsius): """摂氏温度を華氏温度に変換""" fahrenheit = (celsius * 9/5) + 32 return round(fahrenheit, 1)
def fahrenheit_to_celsius(fahrenheit): """華氏温度を摂氏温度に変換""" celsius = (fahrenheit - 32) * 5/9 return round(celsius, 1)
print(f"25°C = {celsius_to_fahrenheit(25)}°F") # 25°C = 77.0°Fprint(f"77°F = {fahrenheit_to_celsius(77)}°C") # 77°F = 25.0°C
# ファイルサイズの単位変換def format_file_size(bytes_size): """バイト数を読みやすい単位に変換""" if bytes_size < 1024: return f"{bytes_size} B" elif bytes_size < 1024 ** 2: return f"{bytes_size / 1024:.1f} KB" elif bytes_size < 1024 ** 3: return f"{bytes_size / (1024 ** 2):.1f} MB" else: return f"{bytes_size / (1024 ** 3):.1f} GB"
print(format_file_size(500)) # 500 Bprint(format_file_size(1536)) # 1.5 KBprint(format_file_size(2097152)) # 2.0 MBprint(format_file_size(5368709120)) # 5.0 GB
このような関数は、いろいろなプロジェクトで再利用できます。
データ処理関数
リストや文字列を処理する関数も作ってみましょう。
# リストの統計情報を計算する関数def calculate_statistics(numbers): """数値リストの統計情報を計算""" if not numbers: return None return { "最小値": min(numbers), "最大値": max(numbers), "平均値": sum(numbers) / len(numbers), "合計": sum(numbers), "件数": len(numbers) }
test_scores = [85, 92, 78, 96, 88, 91, 83]stats = calculate_statistics(test_scores)print("テストスコアの統計:")for key, value in stats.items(): if key == "平均値": print(f"{key}: {value:.2f}") else: print(f"{key}: {value}")
# 文字列処理の関数def clean_phone_number(phone): """電話番号から不要な文字を除去して統一フォーマットに""" # ハイフン、スペース、括弧を除去 cleaned = phone.replace("-", "").replace(" ", "").replace("(", "").replace(")", "") # 数字のみを抽出 digits_only = ''.join(c for c in cleaned if c.isdigit()) # 11桁の場合はハイフン付きフォーマットに if len(digits_only) == 11: return f"{digits_only[:3]}-{digits_only[3:7]}-{digits_only[7:]}" else: return digits_only
print(clean_phone_number("090-1234-5678")) # 090-1234-5678print(clean_phone_number("090 1234 5678")) # 090-1234-5678print(clean_phone_number("(090)1234-5678")) # 090-1234-5678
データを処理する関数は、実際の業務でもよく使われます。
ビジネスロジックの関数
お店やサービスで使えそうな関数も作ってみましょう。
# 割引価格計算の関数def calculate_discount_price(original_price, customer_type="一般"): """顧客タイプに応じた割引価格を計算""" discount_rates = { "一般": 0.0, "学生": 0.1, # 10%割引 "シニア": 0.15, # 15%割引 "VIP": 0.2 # 20%割引 } discount_rate = discount_rates.get(customer_type, 0.0) discount_amount = original_price * discount_rate final_price = original_price - discount_amount return { "元の価格": original_price, "割引率": f"{discount_rate * 100:.0f}%", "割引額": discount_amount, "最終価格": final_price }
# 使用例price_info = calculate_discount_price(10000, "学生")print("価格情報:")for key, value in price_info.items(): print(f"{key}: {value}")
このように、ビジネスで使える計算も関数にまとめられます。
関数を使う時の注意点
変数のスコープ(有効範囲)
関数の中で作った変数は、関数の外では使えません。
# グローバル変数とローカル変数global_var = "グローバル変数"
def demo_scope(): local_var = "ローカル変数" print(f"関数内から: {global_var}") # グローバル変数にアクセス可能 print(f"関数内から: {local_var}") # ローカル変数にアクセス可能
demo_scope()print(f"関数外から: {global_var}") # グローバル変数にアクセス可能# print(f"関数外から: {local_var}") # エラー!ローカル変数にはアクセス不可
変数の使える範囲を理解することは大切です。
引数は参照渡し
リストや辞書を引数に渡すと、元のデータが変更される可能性があります。
# リストや辞書は参照渡しされるdef modify_list(my_list): my_list.append("追加された要素") print(f"関数内: {my_list}")
original_list = ["要素1", "要素2"]print(f"変更前: {original_list}")modify_list(original_list)print(f"変更後: {original_list}") # 元のリストが変更されている!
# 元のリストを変更したくない場合def safe_modify_list(my_list): new_list = my_list.copy() # コピーを作成 new_list.append("追加された要素") return new_list
original_list2 = ["要素1", "要素2"]result_list = safe_modify_list(original_list2)print(f"元のリスト: {original_list2}") # 変更されていないprint(f"新しいリスト: {result_list}") # 新しいリストに追加されている
元のデータを保護したい時は、コピーを作ることが大切です。
エラーハンドリング
エラーが起きても大丈夫なように、適切な処理を入れましょう。
# 適切なエラーハンドリングを含む関数def safe_divide(a, b): """安全な割り算を行う関数""" try: if b == 0: return None, "ゼロで割ることはできません" result = a / b return result, "成功" except TypeError: return None, "数値以外が入力されました" except Exception as e: return None, f"予期しないエラー: {e}"
# 使用例print(safe_divide(10, 2)) # (5.0, '成功')print(safe_divide(10, 0)) # (None, 'ゼロで割ることはできません')print(safe_divide(10, "a")) # (None, '数値以外が入力されました')
エラーハンドリングがあると、プログラムが止まらずに済みます。
まとめ
Pythonのdef文を使った関数について、基礎から実践まで詳しく解説しました。
関数の基本
def
文で関数を定義する- 引数で値を受け取る
return
文で値を返す- わかりやすい名前とコメントを付ける
関数を使うメリット
- コードの再利用ができる
- プログラムが整理される
- エラーの発見がしやすくなる
実践的なポイント
- デフォルト引数で柔軟性を高める
- キーワード引数で可読性を向上
- 複数の値を返すこともできる
- エラーハンドリングを忘れずに
注意点
- 変数のスコープを理解する
- 参照渡しに注意する
- 適切なエラー処理を行う
関数はPythonプログラミングの基礎中の基礎です。
最初は簡単な関数から始めて、徐々に複雑な処理を関数として作れるようになりましょう。 関数を上手に使いこなせるようになると、プログラミングがもっと楽しく効率的になりますよ!
ぜひ今回学んだ内容を参考に、いろいろな関数を作ってみてくださいね。