Pythonを使ってプログラミングをしていると、様々な関数を利用します。
関数はすでに用意されている組み込み関数などを使うだけでなく、自分でオリジナルの関数を作ることもできます。
同じ処理を何度もする場合は関数としてまとめておけばコードが見やすくなりますし、再利用も簡単にできます。
今回は関数を定義する方法について解説します。
関数を定義する
Pythonで独自の関数を定義するには「def文」を使います。def文の使い方は以下の通りです。
def 関数名(引数1, 引数2, ………): 関数の中身
引数の数は自由で、引数が1つもない関数も定義できます。定義した関数を使うには組み込みの関数と同じく「関数名()」で関数を呼び出します。
関数名は関数の名前で、関数を呼び出すときに使います。引数はその関数に渡す変数です。
引数がある場合は引数に渡す変数を()の中に記述します。
def plus(x, y): print('x + y = {}'.format(x + y)) plus(4, 5)
x + y = 9
この例では2つの引数を持つ「plus」という関数を定義しました。
実行結果
関数は引数に渡された数字を足し合わせて、その答えを表示するという機能を持っています。
関数内で処理した結果を呼び出し元で使いたい場合は「return」を使って戻り値を返すことができます。
def plus(x, y): return x + y #xとyを足した答えを返す sum = plus(4, 5) print(sum)
9
変数のスコープ
実行結果
関数を使う上で気を付けないといけないのが変数の「スコープ」です。
スコープとはその変数を参照できる範囲を表します。
関数内で使用する変数にはスコープがあり、関数の中でしか参照することができません。
例えば、先ほどのplus関数で使われている「x」という変数を関数の外から参照しようとすると以下のようになってしまいます。
def plus(x, y): return x + y #xとyを足した答えを返す print(x)
NameError: name 'x' is not defined
xは定義されていない、つまり存在しない変数というエラーがでます。
実行結果
関数内で使われる変数は、関数の外からは参照できず、存在しないものと判断されてしまいますので注意しましょう。
高階関数を使う
pythonの関数は他の言語とは異なり、変数に格納したり、引数として別の関数に渡したりすることができます。
このうち、関数を引数に渡したり返り値として返したりする関数を高階関数と言います。
#引数が10より小さければ返す def low_ten(x): if(x < 10): return x #高階関数 def pick_up(list, define): new_list = [] for num in list: if(define(num)): new_list.append(num) return new_list list1 = [1, 15, 4, 7, 23, 45] list2 = pick_up(list1, low_ten) print(list1)
[1, 15, 4, 7, 23, 45] [1, 4, 7]
この例ではpick_up()が高階関数です。
実行結果
pick_upはリストと関数の2つの引数を持ちます。
引数で渡したリストの各要素に、引数で渡した関数を適用させ、戻り値があった要素を関数内で作ったリストに格納します。
そして、最後にそのリストを返します。
low_ten()は引数の数字が10以下の時だけその数字が返されます。
つまり、pick_upに数字で作られたリストを渡すと、10以下の数字だけで構成される新しいリストが返ってきます。
高階関数のメリットは、引数として渡す関数を変えるだけで簡単に処理を変更できる点にあります。
例えば10以上の数字だけで構成されるリストや、偶数だけで構成されるリストを返すようにしたい場合は、
low_ten()を10以上なら返す関数upper_ten()や偶数なら返す関数is_even()などに変えるだけで、すべての要素にアクセスする部分については変更する必要がありません。
ドキュメンテーション文字列
関数を定義する際に、その関数について説明する「ドキュメンテーション文字列」を書くことができます。
defで関数を定義した後に”””と”””の間に文字列で説明を書くとそれがドキュメンテーション文字列となり、help()でそのドキュメンテーション文字列を参照することができます。
def low_ten(x): """ この関数は引数xが10以下の時だけその数字を返す """ if(x < 10): return x help(low_ten)
Help on function low_ten in module __main__: low_ten(x) この関数は引数xが10以下の時だけその数字を返す
ドキュメンテーション文字列は必須ではありませんが、ドキュメンテーション文字列があれば他の人や後々自分が読んだときにその関数がどういったものなのかを理解しやすくなります。
実行結果
できるだけ、ドキュメンテーション文字列を書くようにしましょう。