この記事では、Pythonの関数の定義と使い方を解説します。
関数とは、コードをグループ化して名前を付けたものです。関数を定義することで、付けた名前からグループ化した処理を何度も呼び出すことができ、コードの重複を避けることができます。
また、関数にはあらかじめ使用可能な「組み込み関数」と自分で定義する「ユーザー定義関数」がありますが、この記事では自分で定義する「ユーザー定義関数」について解説していきます。
組み込み関数については以下の記事を参照してください。
Link組み込み関数の使い方一覧
それでは、関数の定義方法と呼び出し方を見ていきましょう!
関数の基本的な使い方
まずは関数の基本的な構文を見ていきます。
関数の定義
関数を使用するには、「関数を定義する」必要があります。関数は「def
キーワード」を用いて以下のように定義します。コロン(:
)とインデントを忘れないように注意してください。
def 関数名():
なんらかの処理
インデントについて
インデントはスペース4つで表現する
例として簡単な関数を定義してみる :
def func():
result = 1 + 2
print(result)
上記コードでは、func
という名前の関数を定義しました。ブロック内では変数result
に1 + 2
の結果を代入し、print()
関数を用いてresult
をコマンドラインに出力しているだけです。
命名規則
関数に付ける名前には、以下のような規則や慣習、注意しなければならないことがあります。
関数名には英小文字を使う
関数名は全て英小文字で構成する慣習がある。
アンダーバー(_)で区切る
いくつかの単語を組み合わせて関数名を付ける場合は、単語をアンダーバーで区切る慣習がある。(get_data みたいな感じ)
予約語や組み込み関数と名前が被らないように注意する
予約語と同じ名前の関数を定義すると SyntaxError が発生し、組み込み関数と同じ名前の関数を定義するとその関数を上書きしてしまう。
上記を守りつつ、見ただけで何をする関数なのかわかる名前が好ましいとされています。先ほどの例ではfunc
という名前を使いましたが、function
の略称なので特に意味はありません。
実際に名前を付けるとしたら足し算の結果を出力している関数なのでoutput_addition_result
とかprint_addition_result
とかそのまんまな名前を付けると思います。
命名に困ったら プログラマーのためのネーミング辞書 codic を使うのもオススメです。
複合文
関数やif
文のように他の文を持つ文のことを「複合文」と呼んだりします。複合文が持つ処理を書く場所のことを「コードブロック(code block)」、または省略して「ブロック」と呼びます。
def func():
# ここのことをブロックと呼ぶ
Pythonでは、ブロックはインデントを使って表現します。
ローカルとグローバル
関数内(ローカル)で定義された変数は関数外(グローバル)から呼び出すことはできません。
# 関数内で変数を定義
def func():
num = 1
# 関数外から呼び出す(NameErrorが発生)
print(num)
また、関数外で定義された変数に関数内からアクセスするにはglobal
キーワードを使う。
# 関数外の変数
g = 0
def func():
# グローバル変数を再宣言
global g
# グローバル変数の書き換え
g = 999
関数の呼び出し
定義した関数を使用するには、実行したい箇所で呼び出す必要があります。関数を呼び出すには、関数名の後に()
を付けて記述します。
関数名()
例として先ほどのfunc
関数を何回か呼び出してみます :
def func():
result = 1 + 2
print(result)
# 一回目の呼び出し
func()
# 二回目の呼び出し
func()
実行結果
3
3
関数を2回呼び出すことができました。
引数
関数に引数を定義することで呼び出し時に値を外部から受け取って関数内で使用することができます。同じ処理を値だけ変えて実行したい場合などに使用されます。
引数は関数定義時の()
内に記述します。関数定義時の引数を「仮引数」と呼びます。
def 関数名(仮引数):
なんらかの処理
引数は複数定義することができます。
def 関数名(仮引数1, 仮引数2, ..., 仮引数N):
なんらかの処理
引数が定義された関数は、以下のように呼び出します。関数呼び出し時に渡される値を「実引数」と呼びます。
関数名(実引数)
引数がいくつか定義されている場合は、以下のように呼び出します。
関数名(実引数1, 実引数2, ..., 実引数N)
例としてfunc
関数に引数を定義し、受け取った2つの値の和を出力する関数に変更してみます:
def func(a, b):
result = a + b
print(result)
func(1, 2) # 3
func(-10, 73) # 63
引数は、初期値を設定したり、1つの引数で複数の値を受け取ったりすることができます。さらに詳しい引数の使い方は以下の記事を参照してください。
戻り値・返り値
関数に戻り値を定義することで呼び出し元に値を返すことができます。戻り値は、「return
キーワード」を使って以下のように定義します。
def 関数名():
return 返す値
関数の結果を外部に渡したい時に使用します。
# 関数の結果を変数に代入したり、
変数 = 関数()
# 直接関数に渡したりする
print(関数())
return
は関数内にいくつでも記述可能で、if
文で処理が分岐した時なんかに複数使います。ただし、どれか1つでもreturn
が実行されたらその関数はそこで終了します。
def 関数名():
if 条件式:
return Trueの時に返す値
else:
return Falseの時に返す値
# 前にreturnがあるのでここには必ず到達しない
print(0)
タプルを使うことで1つのreturn
で複数の値を返すことができます。以下のように値をカンマ(,
)で区切って記述します。
def 関数名():
return 値1, 値2, ..., 値N
例として関数に戻り値を定義して呼び出し元で受け取ってみます :
# 戻り値を返す関数
def func(a, b):
return a + b
# result変数に戻り値を代入
result = func(1, 2)
print(result)
# 関数に直接渡す
print(func(13, 54))
実行結果
3
67
このようにreturn
キーワードを使って戻り値を定義することで、呼び出し元に関数の演算結果を返すことができます。
関数の参照を変数に代入する
関数の参照を変数に代入し、変数を通して関数を呼び出すことができます。関数の参照を変数に渡すには、()
を付けずに関数を変数に代入します。
変数 = 関数名
変数に代入された関数は通常の関数と同じく呼び出すことができます。
変数 = 関数名
変数() # 代入された関数の実行
例としてfunc()
関数の参照を適当な変数に代入して関数として実行してみます :
def func():
print(1 + 2)
# 変数fにfunc関数の参照を代入
f = func
# 参照の出力
print(f)
# fに代入されたfunc関数の呼び出し
f()
実行結果
<function func at 0x10f9904a0>
3
このように変数に関数の参照を代入することでその変数から関数を呼び出すことができます。また、変数に代入する参照を変えることで動的に呼び出す関数を変更したりすることができます。
型アノテーション
型アノテーションを使うことで引数と戻り値に使用する型を指定することができます。引数の型アノテーションは、引数名と型名を:
で区切って記述します。
def 関数名(引数名: 型名):
何かしらの処理
# 引数に初期値が定義されている場合
def 関数名(引数名: 型名=初期値):
何かしらの処理
戻り値の型アノテーションは、->
を使って記述します。
def 関数名() -> 型名:
何かしらの処理
ポイント
異なる型の値が渡されたとしてもエラーを発生させるような強制力はありませんが、その代わりmypy
を使って型通りに使用できているかチェックしたりすることができます。
例としてfunc
関数に型アノテーションを定義してみます :
def func(a: int, b: int) -> int:
return a + b
使っているエディタによっては、型アノテーションで定義した型を関数呼び出し時に表示してくれたりします。ちなみに、エディタはVisual Studio Code
を使っています。
さらに詳しく関数の使い方なんかを示したい時にはドキュメンテーション文字列を使います。
Linkドキュメンテーション文字列の書き方を解説【docstring】
空関数
何も処理しない空の関数を定義することができます。空関数はpass
文を使って定義します。
def func():
pass
空関数はとりあえず関数を定義したい場合に使います。後から中身を実装するのを忘れないように注意してください。
まとめ
この記事では、Pythonの関数の使い方を解説しました。
便利な関数を定義することで色々なプログラムで使い回すことができます。頻繁に使用する関数があったらモジュールなんかにまとめておくと財産になります。
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ