Pythonのdef文とは?関数の作り方を基礎から学ぼう

Pythonのdef文を使った関数の作り方を初心者向けに詳しく解説。基本的な書き方から引数、戻り値、実践的な使い方まで実例付きで説明します。

Learning Next 運営
26 分で読めます

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)) # 10
print(double(3.5)) # 7.0
# 複数の引数を受け取る関数
def add_numbers(a, b):
"""2つの数値を足し算する関数"""
return a + b
print(add_numbers(3, 7)) # 10
print(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°F
print(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 B
print(format_file_size(1536)) # 1.5 KB
print(format_file_size(2097152)) # 2.0 MB
print(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-5678
print(clean_phone_number("090 1234 5678")) # 090-1234-5678
print(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プログラミングの基礎中の基礎です。

最初は簡単な関数から始めて、徐々に複雑な処理を関数として作れるようになりましょう。 関数を上手に使いこなせるようになると、プログラミングがもっと楽しく効率的になりますよ!

ぜひ今回学んだ内容を参考に、いろいろな関数を作ってみてくださいね。

関連記事