関数とは「名前のついた処理のまとまり」
同じような数行のコードを何度も書いている自分に気づいたとき、あるいは小さなロジックに名前をつけたくなったときが、関数を書くタイミングです。Python の関数は、プログラムの複雑さをうまくさばくための最初の本格的な武器になります。
基本の形はこちらです。
構造を分解するとこんな感じです。
defは関数定義を始めるためのキーワード。greetは関数名です。(name)は仮引数のリスト。関数が受け取る入力ですね。- コロンでヘッダーが終わり、インデントされた下のブロックが関数の本体(ボディ)になります。
greet("Ada")は 呼び出し です。Python はnameに"Ada"を束縛した状態で本体を実行します。
関数は呼び出されるまで何もしません。定義しただけでは実行されず、greet("Ada") のように呼び出して初めて動き出します。
仮引数と実引数(パラメータとアーギュメント)
関数定義側に書く名前が 仮引数(parameter) 、呼び出すときに渡す値が 実引数(argument) です。普段の会話ではそこまで厳密に区別しなくてもいいのですが、エラーメッセージを読むときにこの違いを知っているとグッと理解しやすくなります。
ここで base と exponent が仮引数(パラメータ)で、2 と 10 が実引数(引数)です。Python は渡された順に、最初の引数を最初のパラメータに…というふうに割り当てていきます。
return の使い方:値を呼び出し元に返す
print は画面に出力するだけですが、return は呼び出し元に値を返し、その値を使えるようにします。
return を書かないと、関数は自動的に None を返します。
return はその時点で関数を抜ける役割も持っています。メインの処理に入る前に、例外的なケースをサクッと弾くために早期リターンを使うパターンは実際よく見かけます。
早期リターンを使えば、関数本体が if/else で深くネストするのを防げます。
デフォルト引数
引数にはデフォルト値を設定できます。呼び出し側が値を渡さなかったときに使われます。
デフォルト値を持つ引数は、デフォルト値のない引数の 後ろ に並べる必要があります。def f(a, b=1, c): のように書くと SyntaxError になります。
ミュータブルなデフォルト引数の落とし穴
これは Python でもっとも有名な罠のひとつです。こんなコードを見てみましょう。
呼び出すたびに空のリストから始まってほしいところですが、実際はデフォルトのリストがすべての呼び出しで共有されてしまい、要素がどんどん溜まっていきます。これは、Python がデフォルト値を関数の定義時に 1 回だけ 評価し、その同じリストをずっと使い回すためです。
安全な書き方は、デフォルトに None を指定して、関数の中でリストを生成することです。
items を渡さずに呼び出したときに、毎回新しいリストが用意されるようになりました。これはリストに限らず、辞書や集合など、ミュータブルなオブジェクト全般に当てはまるルールです。
キーワード引数
引数は位置ではなく名前で渡すこともできます。こうすると途中の引数を飛ばせますし、引数の多い呼び出しも一気に読みやすくなります。
位置引数とキーワード引数は混ぜて使えますが、必ず位置引数を先に書く必要があります。
関数の引数が3〜4個を超えてきたら、キーワード引数を使うようにすると、呼び出し側のコードがぐっと読みやすくなります。
位置専用引数とキーワード専用引数
Pythonでは、/ を使って位置でしか渡せない引数にしたり、* を使ってキーワードでしか渡せない引数にしたりと、引数の渡し方を制限できます。
初日から知っておく必要はありません。APIを設計するときや、呼び出し側の使い方を縛りたいときに初めて効いてくる機能です。
docstring と命名ルール
関数の中身の1行目には、docstring(ドックストリング)を書けます。三重引用符で囲まれた文字列で、Pythonはこれをドキュメントとして扱ってくれます。
help() やIDEのツールチップ、ドキュメント生成ツールは、docstringを自動で読み取ってくれます。一行だけでも書いておけば、何もないよりずっとマシです。
それから、命名にもぜひ気を配ってください:
- 関数名は動詞にする:
fetch_profile、compute_total、is_validなど。 lower_snake_caseを使う。- 真偽値を返す関数は
is_、has_、can_で始めることが多い。
良い名前をつけておけば、呼び出し側を見ただけで何をしているのかがわかり、コメントがなくても意図が伝わります。
純粋関数はコードが追いやすい
「純粋(pure)」な関数とは、同じ入力に対して必ず同じ出力を返し、副作用を持たない関数のことです。つまり、グローバルな状態を書き換えたり、(デバッグ目的を除いて)標準出力に出力したり、ファイルに書き込んだりしません。
どちらにも使いどころはありますが、再利用やテストを意識するコードなら、できるだけ純粋関数に寄せておくのがおすすめです。
ちょっとした動作例
デフォルト引数・キーワード引数・return をまとめて使った、短めの関数の例を見てみましょう。
次回:可変長の引数リスト
関数を呼び出すとき、引数がいくつ渡されるかあらかじめ決められないことがあります。あるいは、受け取った引数をそのまま別の関数に渡したい場面もあるでしょう。そんなときに使うのが *args と **kwargs です。次のページで詳しく見ていきます。
よくある質問
Pythonで関数はどう定義しますか?
def キーワードに続けて関数名、引数を囲むカッコ、そしてコロンを書きます。そのあとインデントしたブロックが関数の中身です。例えば def greet(name): print(f'Hi, {name}') のように書きます。
Pythonの return は何をするものですか?
return は関数を呼び出した側に値を返すためのものです。明示的に return を書かなかった関数は、自動的に None を返します。また return が実行された時点で関数はそこで終了するので、同じブロック内でそれより後ろに書いたコードは実行されません。
Pythonのデフォルト引数とは何ですか?
デフォルト引数は、呼び出し側が値を渡さなかったときに使われる「あらかじめ決めておいた値」のことです。def greet(name='friend'): と書いておけば、greet() のように引数なしで呼んだときに 'friend' が使われます。ただし [] のようなミュータブル(変更可能)なオブジェクトをデフォルト値にするのは厳禁です。安全な書き方は本文で紹介します。