【初心者向け】Pythonの関数完全ガイド|定義・引数・戻り値から応用まで

python

プログラムを書いていると、こんな困りごとがありませんか?

  • 「同じ処理を何度も書いていて面倒…」
  • 「コードが長くなって、どこに何が書いてあるかわからない」
  • 「計算結果を他の場所でも使いたい」

そんなときに活躍するのが関数(function)です。

関数を使えば、よく使う処理をひとまとめにして、必要なときに簡単に呼び出すことができます。

この記事では、Python初心者の方にもわかりやすく、関数の基本概念から実践的な使い方まで、たくさんの例を使って詳しく解説します。


スポンサーリンク

Pythonにおける関数とは?

関数の基本概念

関数とは簡単に言うと、「特定の処理をひとまとめにして、名前を付けたもの」です。

日常生活の例で考えてみましょう:

  • 「朝食を作る」という作業を「朝食関数」とする
  • 必要なときに「朝食関数を実行」すれば、毎回同じ手順で朝食ができる
  • 材料(引数)を変えれば、違う朝食も作れる

プログラミングでも同じで、よく使う処理を関数にまとめることで、コードが整理され、再利用しやすくなります。

関数を使うメリット

メリット詳細説明
再利用性一度定義すれば何度でも使える
読みやすさコードが整理されて理解しやすくなる
保守性修正するときは関数の中だけ直せばよい
分業複雑な処理を小さな部分に分けて考えられる

実際の例で比較してみよう

関数を使わない場合:

print("=== 学生1の成績 ===")
print("数学: 85点")
print("英語: 92点")
print("平均:", (85 + 92) / 2)

print("=== 学生2の成績 ===")
print("数学: 78点")
print("英語: 88点")
print("平均:", (78 + 88) / 2)

関数を使った場合:

def show_grade(name, math, english):
    print(f"=== {name}の成績 ===")
    print(f"数学: {math}点")
    print(f"英語: {english}点")
    print("平均:", (math + english) / 2)

show_grade("学生1", 85, 92)
show_grade("学生2", 78, 88)

どちらも同じ結果になりますが、関数を使った方がコードがすっきりしていますね!


Python関数の基本構文

関数の定義方法

Pythonで関数を作るときは、以下の形式を使います:

def 関数名():
    実行したい処理

重要なポイント:

  • defキーワードで関数を定義する
  • 関数名の後に()を付ける
  • コロン:を忘れない
  • 実行したい処理はインデント(字下げ)する

最もシンプルな関数

def say_hello():
    print("こんにちは!")
    
# 関数を呼び出す
say_hello()

実行結果:

こんにちは!

引数のある関数

関数に情報を渡したい場合は、引数を使います:

def greet(name):
    print(f"こんにちは、{name}さん!")
    
greet("太郎")
greet("花子")

実行結果:

こんにちは、太郎さん!
こんにちは、花子さん!
  • 引数は値を受け取る変数のようなもの
  • 関数名の後の()内に引数名を指定
  • 引数が複数ある場合はカンマ区切りで指定
  • 関数を呼び出す時に引数の値を指定

複数の引数を持つ関数

def introduce(name, age, hobby):
    print(f"私の名前は{name}です")
    print(f"年齢は{age}歳です")
    print(f"趣味は{hobby}です")
    
introduce("田中", 25, "読書")

実行結果:

私の名前は田中です
年齢は25歳です
趣味は読書です

defを使って関数を定義し、関数名を書いて呼び出すと中の処理が実行されます。


戻り値(return)の使い方

returnとは?

関数の中で計算した結果を、関数の外で使いたい場合があります。

そんなときに使うのがreturn文です。

def add(a, b):
    result = a + b
    return result

# 関数の結果を変数に保存
total = add(3, 5)
print(total)  # 8

より実用的な例

def calculate_tax(price, tax_rate=0.1):
    tax = price * tax_rate
    total = price + tax
    return total

# 商品価格1000円、消費税10%
final_price = calculate_tax(1000)
print(f"税込み価格: {final_price}円")  # 税込み価格: 1100.0円

複数の値を返す

Pythonでは、複数の値をまとめて返すこともできます:

def analyze_score(score):
    if score >= 90:
        grade = "A"
        comment = "優秀です!"
    elif score >= 80:
        grade = "B"
        comment = "良好です"
    elif score >= 70:
        grade = "C"
        comment = "普通です"
    else:
        grade = "D"
        comment = "頑張りましょう"
    
    return grade, comment

# 複数の値を受け取る
student_grade, feedback = analyze_score(85)
print(f"成績: {student_grade}")  # 成績: B
print(f"コメント: {feedback}")   # コメント: 良好です

returnがない関数

returnを書かない関数は、Noneという特別な値を返します:

def show_message(message):
    print(f"メッセージ: {message}")
    # returnがない

result = show_message("こんにちは")
print(result)  # None

関数はreturnで値を返すことができ、計算結果を他の処理で活用できます。


関数の応用テクニック

デフォルト引数(省略可能な引数)

引数にあらかじめ値を設定しておくと、呼び出し時に省略できます:

def greet(name, greeting="こんにちは"):
    print(f"{greeting}、{name}さん!")

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

より実用的な例:

def create_user(name, age=18, city="東京"):
    print(f"ユーザー作成:")
    print(f"名前: {name}")
    print(f"年齢: {age}")
    print(f"都市: {city}")

create_user("田中")
# ユーザー作成:
# 名前: 田中
# 年齢: 18
# 都市: 東京

create_user("佐藤", 25, "大阪")
# ユーザー作成:
# 名前: 佐藤
# 年齢: 25
# 都市: 大阪

可変長引数(*args)

引数の数が決まっていない場合に使います:

def calculate_total(*numbers):
    total = 0
    for num in numbers:
        total += num
    return total

print(calculate_total(1, 2, 3))        # 6
print(calculate_total(10, 20, 30, 40)) # 100

より理解しやすい例:

def make_team(*players):
    print("チームメンバー:")
    for i, player in enumerate(players, 1):
        print(f"{i}. {player}")

make_team("田中", "佐藤", "鈴木")
# チームメンバー:
# 1. 田中
# 2. 佐藤
# 3. 鈴木

キーワード引数(**kwargs)

キーと値のペアを任意の数だけ受け取れます:

def show_profile(**info):
    print("プロフィール情報:")
    for key, value in info.items():
        print(f"{key}: {value}")

show_profile(name="太郎", age=25, city="東京", hobby="映画鑑賞")
# プロフィール情報:
# name: 太郎
# age: 25
# city: 東京
# hobby: 映画鑑賞

すべてを組み合わせた例

def flexible_function(required_arg, default_arg="デフォルト", *args, **kwargs):
    print(f"必須引数: {required_arg}")
    print(f"デフォルト引数: {default_arg}")
    
    if args:
        print(f"追加の引数: {args}")
    
    if kwargs:
        print("キーワード引数:")
        for key, value in kwargs.items():
            print(f"  {key}: {value}")

flexible_function("必須", "カスタム", 1, 2, 3, name="太郎", age=25)

引数のバリエーションを使いこなすと、柔軟で再利用性の高い関数が作れます。


実践的な関数の例

例1:パスワード強度チェック関数

def check_password_strength(password):
    issues = []
    
    if len(password) < 8:
        issues.append("8文字以上にしてください")
    
    if not any(c.isupper() for c in password):
        issues.append("大文字を含めてください")
    
    if not any(c.islower() for c in password):
        issues.append("小文字を含めてください")
    
    if not any(c.isdigit() for c in password):
        issues.append("数字を含めてください")
    
    if len(issues) == 0:
        return True, "強いパスワードです!"
    else:
        return False, issues

# 使用例
is_strong, message = check_password_strength("Pass123")
print(f"強度チェック結果: {message}")

例2:BMI計算と判定関数

def calculate_bmi(weight, height):
    bmi = weight / (height ** 2)
    
    if bmi < 18.5:
        status = "やせ型"
    elif bmi < 25:
        status = "標準"
    elif bmi < 30:
        status = "軽度肥満"
    else:
        status = "肥満"
    
    return round(bmi, 1), status

# 使用例
bmi_value, health_status = calculate_bmi(65, 1.70)
print(f"BMI: {bmi_value}")
print(f"判定: {health_status}")

例3:リストの統計情報を取得する関数

def get_statistics(numbers):
    if not numbers:
        return "リストが空です"
    
    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, 96, 88]
stats = get_statistics(scores)

for key, value in stats.items():
    print(f"{key}: {value}")

関数でよくあるエラーと対策

エラー1:TypeError – 引数の数が合わない

間違った例:

def greet(name, age):
    print(f"こんにちは、{name}さん({age}歳)")

greet("太郎")  # ageが足りない!

エラーメッセージ:

TypeError: greet() missing 1 required positional argument: 'age'

正しい書き方:

def greet(name, age=0):  # デフォルト値を設定
    print(f"こんにちは、{name}さん({age}歳)")

greet("太郎")  # OK

エラー2:NameError – 関数が定義されていない

間違った例:

say_hello()  # 関数を定義する前に呼び出している

def say_hello():
    print("こんにちは")

正しい書き方:

def say_hello():
    print("こんにちは")

say_hello()  # 定義の後に呼び出す

エラー3:IndentationError – インデントのミス

間違った例:

def calculate(x, y):
print(x + y)  # インデントがない!

正しい書き方:

def calculate(x, y):
    print(x + y)  # 半角スペース4つでインデント

エラー4:returnを忘れる

問題のある例:

def add(a, b):
    result = a + b
    # returnを忘れている

total = add(3, 5)
print(total)  # None が表示される

正しい書き方:

def add(a, b):
    result = a + b
    return result  # 結果を返す

total = add(3, 5)
print(total)  # 8 が表示される

デバッグのコツ

関数で問題が起きたときは、以下をチェックしてください:

  1. 関数の定義と呼び出しの引数の数は一致しているか
  2. 関数を定義してから呼び出しているか
  3. インデントは正しいか(半角スペース4つ)
  4. 戻り値が必要な場合、returnを書いているか
  5. 関数名のスペルは正しいか

関数のエラーは「引数の数」「定義の順序」「インデント」「return」を重点的にチェックしましょう。


関数設計のTips

良い関数の特徴

  1. 単一責任の原則: 1つの関数は1つのことだけを行う
  2. わかりやすい名前: 何をする関数か一目でわかる
  3. 適切な長さ: 長すぎず、短すぎない(一般的に20行以内)
  4. 適切なコメント: 複雑な処理には説明を付ける

良い例と悪い例

悪い例:

def process_data(data):
    # 何をする関数かわからない
    result = []
    for item in data:
        if item > 0:
            result.append(item * 2)
        else:
            result.append(0)
    return result

良い例:

def double_positive_numbers(numbers):
    #リストの正の数を2倍にし、負の数は0に変換する

    processed_numbers = []
    for num in numbers:
        if num > 0:
            processed_numbers.append(num * 2)
        else:
            processed_numbers.append(0)
    return processed_numbers

関数名の付け方

  • 動詞で始める: calculate_tax, check_password, get_user_info
  • 具体的にする: process より validate_email
  • 一貫性を保つ: 同じ種類の処理は同じ命名パターンを使う

まとめ

Pythonの関数は、繰り返し処理をまとめ、コードを整理し、再利用性を高めるために欠かせない機能です。

基本構文:

  • defで関数を定義し、()で呼び出す
  • 引数で情報を渡し、returnで結果を返す

エラー対策:

  • 引数の数、インデント、returnの有無をチェック
  • わかりやすい関数名と適切なコメントを心がける

コメント

タイトルとURLをコピーしました