繰り返して利用するような機能をまとめてモジュール化して利用する方法はプログラミングをする上で重要な手法です。プログラミング言語によっては関数と呼ばずにサブルーチンやモジュール、あるいはプロシージャと呼ぶものもあり、返却値があるものないもので手続きと関数を区別するケースもありますが、繰り返して利用するコードを1つにまとめて、それをプログラム中で呼び出して利用するという部分では考え方は同じです。
1960年代後半にエドガー・ダイクストラが構造化プログラミングの重要性を提示し、そこからトップダウン設計、処理の抽象化、モジュール化などの概念が広がっていきました。現在では、特にそのソフトウェア工学的な意味を意識することなく、処理をまとめる1つの方法として関数として使われている場面の方が多いでしょう。
プログラムの構造を設計する段階で機能をモジュール化し関数を作るというのがプログラミングとしては理想的ではありますが、プログラムを書き進めていくうちに、処理をまとめた方が便利である、あるいはすっきりしたプログラムになるというので関数にしてしまうのでも十分意味のあることです。また、プログラムがある程度動作する段階になっても、プログラムのコードを整理しロジックをすっきりさせ、またメンテナンスの向上をはかるために、重複しているコードを関数にしてしまうというのも1つの方法です。以前ではこのような事後にプログラムを変更することは好ましくないとされていましたが、現在ではコード・リファクタリングと呼ばれる技法における要素の1つとなっています。
関数定義は def 関数名 ( 引数, …) の形を取ります。
下記の例は2つの引数を “+” 演算しているものをreturn文で返却する関数ですが、引数はオブジェクトなので、funcsample(10,20)もfuncsample(“abc”,“efg”)の両方とも成立します。
# File: defsample.py
# 関数 (function)
##
def funcsample(x,y):
return x+y
print(funcsample(10,20))
print(funcsample("abc","efg"))returnは、関数の戻り値として返すための文です。return の引数がなくても機能します。また、returnが実行された時点で関数は呼び出しが終了しますので、たとえば関数の処理の途中のif文の中でreturnを書くこともできます。
定義された関数はシンボルとして扱えますので、関数を変数のように代入して使うこともできます。
f=funcsample
print(f(10,20))
print(f("abc","efg"))
def funca(x,y):
return(x,y)
def funcb(x,y):
return(y,x)
funcs=[funca,funcb]
print(funcs[0](1,2))
print(funcs[1](1,2))Pythonではデフォルトの引数の値を設定することができます。そして、引数を省略するとデフォルトの値が設定されます。
def triadd(k=10,l=20,m=30):
return (k+l+m)
print(triadd())
print(triadd(30))
print(triadd(30,50))
print(triadd(30,50,60))この例では最初のtriadd(30)はkに30が設定されてあとはデフォルト値が設定されます。triadd(30,50)はkとlが、そしてtriadd(30,50,60)ではkとlとmが設定されます。