Menu
日本語

Python 関数入門:def・return・引数の使い方

Pythonで関数を定義して使う基本を、def・return・引数・デフォルト値・キーワード引数まで、読みやすいコードを書くための命名のコツも交えて解説します。

関数とは「名前のついた処理のまとまり」

同じような数行のコードを何度も書いている自分に気づいたとき、あるいは小さなロジックに名前をつけたくなったときが、関数を書くタイミングです。Python の関数は、プログラムの複雑さをうまくさばくための最初の本格的な武器になります。

基本の形はこちらです。

main.py
Output
Click Run to see the output here.

構造を分解するとこんな感じです。

  • def は関数定義を始めるためのキーワード。
  • greet は関数名です。
  • (name) は仮引数のリスト。関数が受け取る入力ですね。
  • コロンでヘッダーが終わり、インデントされた下のブロックが関数の本体(ボディ)になります。
  • greet("Ada")呼び出し です。Python は name"Ada" を束縛した状態で本体を実行します。

関数は呼び出されるまで何もしません。定義しただけでは実行されず、greet("Ada") のように呼び出して初めて動き出します。

仮引数と実引数(パラメータとアーギュメント)

関数定義側に書く名前が 仮引数(parameter) 、呼び出すときに渡す値が 実引数(argument) です。普段の会話ではそこまで厳密に区別しなくてもいいのですが、エラーメッセージを読むときにこの違いを知っているとグッと理解しやすくなります。

main.py
Output
Click Run to see the output here.

ここで baseexponent が仮引数(パラメータ)で、210 が実引数(引数)です。Python は渡された順に、最初の引数を最初のパラメータに…というふうに割り当てていきます。

return の使い方:値を呼び出し元に返す

print は画面に出力するだけですが、return は呼び出し元に値を返し、その値を使えるようにします。

main.py
Output
Click Run to see the output here.

return を書かないと、関数は自動的に None を返します。

main.py
Output
Click Run to see the output here.

return はその時点で関数を抜ける役割も持っています。メインの処理に入る前に、例外的なケースをサクッと弾くために早期リターンを使うパターンは実際よく見かけます。

main.py
Output
Click Run to see the output here.

早期リターンを使えば、関数本体が if/else で深くネストするのを防げます。

デフォルト引数

引数にはデフォルト値を設定できます。呼び出し側が値を渡さなかったときに使われます。

main.py
Output
Click Run to see the output here.

デフォルト値を持つ引数は、デフォルト値のない引数の 後ろ に並べる必要があります。def f(a, b=1, c): のように書くと SyntaxError になります。

ミュータブルなデフォルト引数の落とし穴

これは Python でもっとも有名な罠のひとつです。こんなコードを見てみましょう。

main.py
Output
Click Run to see the output here.

呼び出すたびに空のリストから始まってほしいところですが、実際はデフォルトのリストがすべての呼び出しで共有されてしまい、要素がどんどん溜まっていきます。これは、Python がデフォルト値を関数の定義時に 1 回だけ 評価し、その同じリストをずっと使い回すためです。

安全な書き方は、デフォルトに None を指定して、関数の中でリストを生成することです。

main.py
Output
Click Run to see the output here.

items を渡さずに呼び出したときに、毎回新しいリストが用意されるようになりました。これはリストに限らず、辞書や集合など、ミュータブルなオブジェクト全般に当てはまるルールです。

キーワード引数

引数は位置ではなく名前で渡すこともできます。こうすると途中の引数を飛ばせますし、引数の多い呼び出しも一気に読みやすくなります。

main.py
Output
Click Run to see the output here.

位置引数とキーワード引数は混ぜて使えますが、必ず位置引数を先に書く必要があります。

main.py
Output
Click Run to see the output here.

関数の引数が3〜4個を超えてきたら、キーワード引数を使うようにすると、呼び出し側のコードがぐっと読みやすくなります。

位置専用引数とキーワード専用引数

Pythonでは、/ を使って位置でしか渡せない引数にしたり、* を使ってキーワードでしか渡せない引数にしたりと、引数の渡し方を制限できます。

main.py
Output
Click Run to see the output here.

初日から知っておく必要はありません。APIを設計するときや、呼び出し側の使い方を縛りたいときに初めて効いてくる機能です。

docstring と命名ルール

関数の中身の1行目には、docstring(ドックストリング)を書けます。三重引用符で囲まれた文字列で、Pythonはこれをドキュメントとして扱ってくれます。

main.py
Output
Click Run to see the output here.

help() やIDEのツールチップ、ドキュメント生成ツールは、docstringを自動で読み取ってくれます。一行だけでも書いておけば、何もないよりずっとマシです。

それから、命名にもぜひ気を配ってください:

  • 関数名は動詞にする: fetch_profilecompute_totalis_valid など。
  • lower_snake_case を使う。
  • 真偽値を返す関数は is_has_can_ で始めることが多い。

良い名前をつけておけば、呼び出し側を見ただけで何をしているのかがわかり、コメントがなくても意図が伝わります。

純粋関数はコードが追いやすい

「純粋(pure)」な関数とは、同じ入力に対して必ず同じ出力を返し、副作用を持たない関数のことです。つまり、グローバルな状態を書き換えたり、(デバッグ目的を除いて)標準出力に出力したり、ファイルに書き込んだりしません。

main.py
Output
Click Run to see the output here.

どちらにも使いどころはありますが、再利用やテストを意識するコードなら、できるだけ純粋関数に寄せておくのがおすすめです。

ちょっとした動作例

デフォルト引数・キーワード引数・return をまとめて使った、短めの関数の例を見てみましょう。

main.py
Output
Click Run to see the output here.

次回:可変長の引数リスト

関数を呼び出すとき、引数がいくつ渡されるかあらかじめ決められないことがあります。あるいは、受け取った引数をそのまま別の関数に渡したい場面もあるでしょう。そんなときに使うのが *args**kwargs です。次のページで詳しく見ていきます。

よくある質問

Pythonで関数はどう定義しますか?

def キーワードに続けて関数名、引数を囲むカッコ、そしてコロンを書きます。そのあとインデントしたブロックが関数の中身です。例えば def greet(name): print(f'Hi, {name}') のように書きます。

Pythonの return は何をするものですか?

return は関数を呼び出した側に値を返すためのものです。明示的に return を書かなかった関数は、自動的に None を返します。また return が実行された時点で関数はそこで終了するので、同じブロック内でそれより後ろに書いたコードは実行されません。

Pythonのデフォルト引数とは何ですか?

デフォルト引数は、呼び出し側が値を渡さなかったときに使われる「あらかじめ決めておいた値」のことです。def greet(name='friend'): と書いておけば、greet() のように引数なしで呼んだときに 'friend' が使われます。ただし [] のようなミュータブル(変更可能)なオブジェクトをデフォルト値にするのは厳禁です。安全な書き方は本文で紹介します。

Coddyでコードを学ぼう

始める