Pythonの関数とは
関数とは、ひとまとまりの処理に名前をつけて、何度でも呼び出せるようにしたものです。
同じ処理を何度も書く代わりに、関数として定義しておけばコードをすっきりまとめられます。プログラムが長くなるほど、関数の恩恵が大きくなります。
Pythonで関数を定義するには def キーワードを使います。
関数の基本的な書き方
defを使った定義の構造
def 関数名(引数):
# 処理内容
return 戻り値
最もシンプルな例として、挨拶メッセージを表示する関数を書いてみます。
def greet():
print("こんにちは!")
greet()
こんにちは!
def greet(): で関数を定義し、greet() と書くことで呼び出しています。関数名のあとに () を付けるのが呼び出しの基本です。
引数の書き方
引数とは、関数を呼び出すときに渡す値のことです。関数内でその値を使って処理を変えられます。
引数が1つの場合
def greet(name):
print(f"こんにちは、{name}さん!")
greet("田中")
こんにちは、田中さん!
name が引数です。呼び出し時に渡した "田中" が関数内の name に入ります。
引数が複数の場合
def add(a, b):
result = a + b
print(f"{a} + {b} = {result}")
add(3, 5)
3 + 5 = 8
カンマで区切ることで複数の引数を受け取れます。呼び出すときも同じ順番で値を渡します。
デフォルト引数
引数に初期値を設定しておくと、呼び出し時に値を省略できます。
def greet(name, message="こんにちは"):
print(f"{message}、{name}さん!")
greet("田中")
greet("鈴木", "おはようございます")
こんにちは、田中さん!
おはようございます、鈴木さん!
デフォルト引数はそれ以外の引数より後に書く必要があります。逆にするとエラーになります。
キーワード引数
引数の名前を指定して値を渡す方法をキーワード引数と呼びます。順番を気にせず渡せます。
def introduce(name, age):
print(f"名前:{name}、年齢:{age}")
introduce(age=30, name="田中")
名前:田中、年齢:30
戻り値(return)の使い方
処理した結果を呼び出し元に返すには return を使います。
def multiply(a, b):
return a * b
result = multiply(4, 6)
print(result)
24
return で返された値は変数に代入できます。print() で表示するだけの関数と違い、戻り値があると計算結果を次の処理に使い回せます。
return を書かない場合はNoneになる
return を書かなかった場合、関数はデフォルトで None を返します。
def greet(name):
print(f"こんにちは、{name}さん!")
result = greet("田中")
print(result)
こんにちは、田中さん!
None
戻り値を使って処理をつなげたい場合は return を忘れずに書きましょう。
よくある使い方
計算処理をまとめる
同じ計算を何度も行う場合、関数にまとめると管理しやすくなります。
def tax_included(price, rate=0.1):
return price * (1 + rate)
print(tax_included(1000))
print(tax_included(2000))
print(tax_included(5000, 0.08))
1100.0
2200.0
5400.0
rate にデフォルト値を設定しているので、消費税率が変わる場合だけ別途指定できます。
リストに対して処理をまとめる
def get_evens(numbers):
result = []
for n in numbers:
if n % 2 == 0:
result.append(n)
return result
nums = [1, 2, 3, 4, 5, 6]
print(get_evens(nums))
[2, 4, 6]
リストをそのまま引数に渡せます。処理内容を関数に切り出すことで、コードの見通しがよくなります。
よくあるミスと注意点
インデントのずれ
Pythonの関数内の処理はインデントで区別します。インデントがずれるとエラーになります。
def greet(name):
print(f"こんにちは、{name}さん!") # インデントなし
IndentationError: expected an indented block
def の直後の行は必ず半角スペース4つ(またはタブ1つ)分インデントします。
引数の数が違う
def add(a, b):
return a + b
add(1) # 引数が1つしかない
TypeError: add() missing 1 required positional argument: 'b'
定義した引数の数と、呼び出し時に渡す数が一致していないとエラーになります。デフォルト引数を設定しない限り、すべての引数が必要です。
returnの書き忘れ
計算した結果を変数に受け取りたいのに return を書き忘れると、None が入ります。
def add(a, b):
result = a + b # returnを書き忘れ
total = add(3, 4)
print(total)
None
戻り値を使う予定がある関数には必ず return を書きましょう。
変数のスコープに注意
関数の中で定義した変数は、関数の外からは参照できません。
def calc():
x = 10
calc()
print(x) # 関数の外からxを参照しようとしている
NameError: name 'x' is not defined
処理結果を外に持ち出したい場合は return を使います。
AI時代での補足
AIにコードを書かせる場面が増えても、関数の定義・引数・戻り値の構造を理解していると、出力されたコードが意図どおりに動くか確認しやすくなります。AIの出力を読んで直す力は、基礎知識があるほど上がります。
まとめ
この記事で解説した内容を整理します。
- 関数は
defキーワードで定義する - 引数を使うと、呼び出し時に値を渡して処理を変えられる
returnで処理結果を呼び出し元に返すreturnがない関数はNoneを返す- インデントや引数の数のミスが初心者のつまずきポイント
通常の def 関数に対して、短い処理を1行で書く方法として lambda(ラムダ)があります。lambdaの書き方や使いどころについては以下の記事で解説しています。
Pythonのlambda(ラムダ)とは?基本の書き方・引数・複数行の扱いをわかりやすく解説
また、どこまで体系的に学ぶかを考え始めたタイミングでは、以下の記事が判断の参考になります。