関数定義
このレッスンで分かること
def 関数名(引数):で関数を作り、returnで値を返します- 同じ処理を再利用できるので、コードがすっきり短くなります
- 最小例は
def double(x):\n return x * 2
関数定義 とは
def で関数を定義し、引数を倍にして返す関数を書きます。本レッスンでは、関数定義 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
関数定義
プログラムが長くなってくると、同じような処理を何度も書きたい場面が増えてきます。そのときに登場するのが 関数 です。Python では def キーワードを使って関数を定義します。関数は処理に名前を付けて、必要なときに何度でも呼び出せる仕組みです。関数を使えるようになると、コードはぐっと整理され、読みやすくなり、バグも減らせます。
関数は「処理の名前」と「入力」と「出力」を 1 セットにした、再利用のための最小単位だと考えてください。
関数とは何か
関数は、入力 (引数 / argument) を受け取って、何らかの処理をしたあと、結果を 戻り値 (return value) として返す仕組みです。一度書いたら名前で何度でも呼び出せるので、同じコードを書き直さずに済みます。DRY 原則 (Don't Repeat Yourself) という考え方の中心にいる存在です。同じ処理を 10 箇所に書くと、修正が必要になったとき 10 箇所直さなければなりません。関数にまとめておけば 1 箇所だけ直せば全部に反映されます。
Python
def greet(name):
return f"こんにちは、{name}さん"
message = greet("太郎")
print(message)このコードは greet という関数を定義し、"太郎" を渡して呼び出しています。return で返された文字列が message に入ります。
文法を分解する
関数定義は次の 4 要素から成り立っています。
defキーワード- 関数名 (snake_case が慣例)
- 引数のリスト
(arg1, arg2, ...) - 関数本体 (インデントされたブロック)
Python
def double(x):
result = x * 2
return resultdef double(x): の x が引数、return result が戻り値です。Python ではインデント (通常 4 スペース) が文法そのものなので、ブロックの範囲は字下げで示します。中括弧 {} を使う他の言語と違って、見た目と構造が一致するのが Python の特徴です。
関数名は動詞または「動詞+名詞」で書くと読みやすくなります。
calc_totalやis_evenのように、何をするのかが名前から分かるのが理想です。
動きを追ってみる
double(5) と呼び出したとき、内部では次のように処理が進みます。
図の流れを箇条書きで書き直すと、次の通りです。
double(5)を呼び出す- 引数
xに5が代入される result = x * 2でresultに10が入るreturn resultで10が呼び出し元に戻る
関数の中で作った変数 result は、関数の外からは見えません。関数ごとに独立した スコープ (scope) を持っているので、x も result も外側の変数と衝突しません。これは大規模なコードでも安心して関数を使える理由のひとつです。関数の中の世界と外の世界がきちんと分離されているおかげで、副作用を最小限に抑えられます。
関数の3つのメリット
関数を使う動機を整理しておきましょう。次の 3 点が代表的なメリットです。
- 重複コードを減らせる (
DRY) - 名前を付けることで処理の意図が明確になる
- テストや差し替えがしやすくなる
たとえば、消費税込み価格を計算する add_tax を関数にしておけば、税率が変わったときも 1 箇所修正するだけで済みます。
Python
def add_tax(price):
return int(price * 1.1)よくある間違い
初学者がつまずきやすいポイントを 3 つ挙げておきます。
returnを書き忘れる。関数の最後にreturnがないと、暗黙的にNoneが返されますdefの行末に:を付け忘れる。SyntaxErrorになります- インデントが揃っていない。
IndentationErrorの典型です
Python
def bad(x)
return x * 2上のコードは def bad(x): の : がないので動きません。エディタのシンタックスハイライトを頼りに、def の行が緑や青で色付くか確認するのも有効です。
「関数の中で
returnで返した値」は別物です。
関数を呼び出す側の視点
関数は呼び出されて初めて中身が実行されます。定義しただけでは何も起きないことに注意してください。
Python
def double(x):
return x * 2
print("ここまでは double は呼ばれていない")
result = double(7)
print(result)2 行目の def で定義が登録され、double(7) の呼び出しで初めて関数本体が走ります。
ここまでの要点
関数は def 名前(引数): + return の形で書く。print と return は別物で、関数の答えを返すのは return。1 箇所修正で全体に反映できるのが関数の最大のメリット。
やってみよう
それでは、整数 n を受け取って n の 2 倍 を返す関数 double_number を書いてみましょう。return を必ず使い、print は使わないでください。テストでは return された値 を検証します。n * 2 という式さえ書ければ完成です。シンプルな問題ですが、ここで身に付く def と return の感覚は、これから書く全ての関数の土台になります。
よくある質問
Q. 関数を分けるとなぜ良いのですか?
A. 1 つの処理に名前が付くため可読性が上がり、テストや使い回しが容易になります。修正時の影響範囲も小さくなるので、20-30 行を超える関数は責務ごとに分割すると良いです。関数名は動詞 + 目的語(calc_tax, fetch_user)にすると意図が伝わりやすくなります。
Q. 引数のデフォルト値はどう使えば良いですか?
A. def greet(name='guest'): のようにデフォルト値を指定すると、呼び出し側で省略可能になります。ただしミュータブル(リストや辞書)をデフォルトにすると全呼び出しで共有されるバグの原因になるため、def f(x=None): ... if x is None: x = [] のパターンを使いましょう。
Q. 戻り値が複数あるときはどう書きますか?
A. return a, b のようにタプルで返し、x, y = func() で受け取るのが Python の定石です。意味のある名前で返したいときは namedtuple や dataclass、3 つ以上返すなら辞書を返した方が呼び出し側で何が来るか明確になります。
次のレッスン
次は デフォルト引数 で、def で関数を定義し、引数を倍にして返す関数を書きます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 関数定義 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 関数定義 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- def キーワードで double_number 関数を定義する
- 引数 n を 2 倍にした値を return する
- print は使わず return で値を返す
入出力例
test-cases.txt
double_number(5) → 10
double_number(0) → 0
double_number(-3) → -6
double_number(100) → 200