Python | 関数:def

Python
スポンサーリンク

概要(def は「処理に名前をつけて再利用」するためのキーワード)

def は、よく使う処理をひとまとめにして名前をつけ、何度でも呼び出せるようにするためのキーワードです。関数化すると、重複コードが減って読みやすく保守しやすいコードになります。基本の流れは「定義してから呼び出す」。定義は def 関数名(引数…): の形で、行末のコロンとインデントが重要です。

def greet():
    print("Hello, World!")

greet()  # 呼び出し
Python

基本構文と「引数・戻り値」(ここが重要)

最小の定義とインデント・コロン

def の直後に関数名、丸括弧、コロン。次の行からインデントして処理を書きます。Pythonはインデントが文法の一部なので、スペースやタブの混在に注意します。

def hello():
    print("Hi")  # 本体はインデントして書く
Python

引数で「入力」を受け取り、return で「結果」を返す

引数は関数の外から値を受け取る入口、return は結果の出口です。return が無い場合、戻り値は None になります。

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

result = add(3, 5)  # 8
Python

位置引数・キーワード引数・デフォルト引数

  • 位置引数は順番で渡す、キーワード引数は名前で渡す、デフォルト引数は「省略時の既定値」。組み合わせると呼び出しの柔軟性が上がります。
def power(x, exp=2):
    return x ** exp

print(power(3))            # 9(exp省略→2)
print(power(x=2, exp=3))   # 8(キーワード引数)
Python

可変長引数(*args, **kwargs)

引数の数が可変のときに使います。args は位置引数のタプル、*kwargs はキーワード引数の辞書として受け取ります。

def summarize(*nums, **options):
    total = sum(nums)
    if options.get("avg"):
        return total / len(nums)
    return total

print(summarize(1, 2, 3))               # 6
print(summarize(1, 2, 3, avg=True))     # 2.0
Python

変数のスコープと副作用(正しく設計するための勘所)

ローカル変数とグローバル変数

関数の中で定義した変数はローカル(関数の外から見えない)。モジュール直下の変数はグローバル。グローバルを書き換えるのはバグの温床になりがちで、引数と戻り値でデータを渡す設計が基本です。

count = 0  # グローバル

def inc():
    global count   # 書き換えは慎重に
    count += 1
Python

ミュータブルを直接書き換えない(副作用の管理)

リストや辞書を引数でもらって中で書き換えると、呼び出し元にも影響します。返す値で「新しい結果」を渡す方が安全です。

def add_user(users, name):
    return users + [name]  # 新しいリストを返す(元を壊さない)
Python

現場で効く設計テクニック(ドキュメント・型ヒント・テスト)

ドキュメンテーション文字列(docstring)

関数直下に文字列を書くと、help() に表示されます。目的・引数・戻り値を簡潔に残しましょう。

def bmi(height_m: float, weight_kg: float) -> float:
    """BMIを計算して返す。
    height_m: 身長(メートル)
    weight_kg: 体重(キログラム)
    """
    return weight_kg / (height_m ** 2)
Python

型ヒント(annotations)

型は実行時に強制されませんが、可読性と静的解析に効きます。IDEの補完やエラー検出が向上します。

def greet(name: str) -> str:
    return f"Hello, {name}!"
Python

小さく作ってテストしやすく

  • 1関数1責務、引数は少なく、戻り値は明確に。副作用を減らすとテストが簡単になります。関数名は動詞+目的(snake_case)で意図を伝える。

応用:関数は「第一級の値」(高階関数・クロージャ・再帰)

関数を引数・戻り値として扱う(高階関数)

関数は値として渡せます。ロジック差し替えが容易になります。

def apply(nums, op):
    return [op(n) for n in nums]

print(apply([1, 2, 3], lambda x: x * 2))  # [2, 4, 6]
Python

クロージャ(外の値を覚えた関数)

関数が作られた環境の変数を保持します。設定値を閉じ込めた小さな関数を量産できます。

def make_adder(step):
    def add(x):
        return x + step
    return add

plus10 = make_adder(10)
print(plus10(5))  # 15
Python

再帰(関数が自分を呼ぶ)

分割統治や木構造で役立ちます。終了条件(ベースケース)を必ず用意します。

def fact(n):
    if n <= 1:
        return 1
    return n * fact(n - 1)
Python

つまずきやすいポイントと安全策(エラー・インデント・未実装)

定義より前に呼ぶと NameError

Pythonは上から順に実行します。呼び出しは定義の後に書くか、if name == “main“: の実行ブロックに分けます。

def main():
    print(greet("Hanako"))

def greet(name):
    return f"Hello, {name}"

if __name__ == "__main__":
    main()
Python

インデント・コロン漏れは IndentationError / SyntaxError

行末のコロンとインデント幅(スペース4推奨)を揃えます。

def ok():
    print("indent OK")
Python

形だけ用意するなら pass

あとで中身を書くとき、空の関数は pass で占位します。

def todo():
    pass  # 後で実装
Python

例題で身につける(定番から一歩先まで)

例題1:キーワード引数+デフォルトで柔軟に呼ぶ

def format_price(amount, currency="JPY", with_tax=False):
    total = round(amount * (1.1 if with_tax else 1))
    return f"{currency} {total}"

print(format_price(350))                         # JPY 350
print(format_price(350, with_tax=True))          # JPY 385
print(format_price(10, currency="USD"))          # USD 10
Python

例題2:*args と **kwargs で拡張可能な API を作る

def render_button(label, *classes, **attrs):
    cls = " ".join(classes) if classes else ""
    attr = " ".join(f'{k}="{v}"' for k, v in attrs.items())
    return f'<button class="{cls}" {attr}>{label}</button>'

print(render_button("OK", "primary", id="ok-btn", disabled=True))
# <button class="primary" id="ok-btn" disabled="True">OK</button>
Python

例題3:クロージャで設定値を閉じ込める

def make_rounder(ndigits):
    def rounder(x):
        return round(x, ndigits)
    return rounder

r2 = make_rounder(2)
print(r2(3.14159))  # 3.14
Python

例題4:副作用を避けた集計

def revenue(orders):
    return sum(o["qty"] * o["price"] for o in orders)

orders = [{"qty": 2, "price": 350}, {"qty": 1, "price": 280}]
print(revenue(orders))  # 980
Python

まとめ

def は「処理に名前を与えて再利用する」ための中核。コロンとインデントに注意して定義し、引数と戻り値でデータの流れを明確にする。位置・キーワード・デフォルト・可変長引数で呼び出しを柔軟にし、docstring と型ヒントで意図を伝える。関数を値として扱えば高階関数・クロージャ・再帰まで広がる。副作用は最小化し、小さくテストしやすい関数に分割する——これがプロが現場で通用させる「関数設計」の土台です。

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