概要(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 と型ヒントで意図を伝える。関数を値として扱えば高階関数・クロージャ・再帰まで広がる。副作用は最小化し、小さくテストしやすい関数に分割する——これがプロが現場で通用させる「関数設計」の土台です。

