【Python講座5】関数(function)

今回は久しぶりにPythonの勉強をしていきます。ところで、Pythonで画像処理をする方法として、OpenCVを用いる方法で以下のような方法がありました。

python+OpenCVで顔認識をやってみる(Qiita)

是非試してみて下さい。pythonを使ってOpenCVを利用する為に、環境設定などが大変だったので、後ほど紹介したいと思います。

さて、今回は、Pythonチュートリアルから、関数(function)について紹介します。関数は、メソッド、サブルーチンなど様々な言葉でさすが、一つの固まりを指します。

プログラミングで、よくfunction()という書き方を目にすると思いますが、あくまで一機能を示しているのです。

そして、関数は書く言語によって、どういう約束で書くかなどが決まっています。
まずは、以下の関数を見てみましょう。

これは、フィボナッチ数列というもので、葉の分岐に関係するとかしないとか。。!

ここでのdefはdefine(定義)の意味です。一番最初にこんな機能だよ!ということを紹介する挨拶みたいなものです。
def は関数の 定義 (definition) を導くキーワードです。 def の後には、関数名と仮引数を丸括弧で囲んだリストを続けなければなりません。関数の実体を構成する実行文は次の行から始め、インデントされていなければなりません。
via Pythonチュートリアル
def fib(n):と、最後に:コロンをつけて関数を定義することが出来ます。

fib(n)の(n)とは、仮の引数です。命令を書く時にどこまでの値を扱うかなどを決める時に使います。

因みに、defの中で定義されたnはあくまで仮の姿なので、あとから定義すれば、実引数は何を書いても良いそうです。

fibは、サブルーチンの一つです。
サブルーチンで検索すると以下のように紹介されます。
プログラミングにおいて、コード中で何度も必要とされる定型的な処理を一つのプログラムにまとめて外部から呼び出せるようにしたもの。汎用性の高いコードをサブルーチンとして切り出すことにより、似たようなコードを何度も記述する必要が無くなり、コード量の削減や開発効率の向上、不具合発生率の低減などが見込める。サブルーチンを呼び出す際に動作を指定する設定値を与える場合があり、この値を引数(ひきすう)、パラメータなどと呼ぶ。また、実行後に呼び出し元のプログラムに処理結果のデータなどを返す場合があり、この値を返り値、戻り値などと言う。引数と返り値のあるサブルーチンを特に関数と呼ぶことがある。C言語のようにサブルーチンをすべて関数とする言語や処理系もある。
via IT用語辞典:e-Words
例えば、while~という同じ処理をいちいち何度も書くのは凄い大変だし、書くのが煩雑になります。だから、サブルーチンというおまじないを使って、同じことが出来るようにするのでした。

上のa,b =b,a+bは並列的に代入を繰り返しています。bをaに代入し、a+bをbに代入することで、aの値が+bずつ増えていくことになります。

もう少し簡単なコードを見てみましょう。

f(x)を実行しようとすると

ここでn=3という箱が作られます。ただし、箱の引き渡しはせず、中身を渡します。

次に、n=10で上書きされるので、10が出力されます。

その後、関数が終了すると仮引数(n)は自動消滅します。なので、例えば、以下のように、関数の外でzと書いても、反応しません。

関数サブルーチンの名前を入力すると名前が示されます。ある関数から別の関数に渡すということも可能です。

また、同じ変数名で定義してしまうと上書きされます。

…b(x)の方が定義されます。

引数について見ていきましょう。以下では関数の中で定義するもの。関数の外で定義するものの違いを見ています。

ローカル:a,やb,nなど関数内で完結
グローバル:関数内で完結してないもの。

また、この関数が何をしたかったか分かるように、"""や#を使ってコメントを書いておくと
分かり易いですよ!

結果をすぐ表示するより、後で様々な統計処理をしたい時は、以下のように関数の内部で要素を追加するとよいです。

a,b = b, a+bの代入処理を行い、appendの命令により、要素を追加します。([]リストは要素がどんどん増えていく)

因みに、リストへの追加は以下のような感じになります。

と書くと、

と表示される。

returnは、while文の中身を終了させて、resultの結果を表示する役割をしています。
そもそものreturnの意味は、関数から一つの結果を表示することという意味です。

例えば、

これだけでは、returnがあっても何も返ってきません。

このように書くと、値が一つ返ってきます。

Javaのように厳密な書き方をする言語の場合は、実行する前にエラーが起こることがあります。(文字列と引数は比較出来ないなど)

以下のコードでは3つの引数が設定されています。
retriesやcomplaintはあらかじめ設定しておいて、ユーザー側にはpromptの中身だけ書いてもらいます。

while内のインデントに入っているが、もし関数から抜けたい時はraiseを使って無理矢理ループから抜けることが出来ます。

他にも、こんな応用方法があります。例えば、

と書くと、毎回リスト[]が作られるので、

と表示されます。

納品されるようなプログラミングはもっと複雑な関数の集まりになっています。
defの固まりで出来ているのです。

pythonの関数でよく出てくるものを見てみましょう。

要素をsortして中央値を取得すれば、medianを知ることが出来ます。

要素の数え方を覚えていますか?こんな感じでした。

もし、平面画像を取得する時は、このような形で書きます。

三次元とか四次元とかだったら、要素を付け加えればよいです。
こうしたデータ構造を扱わせるのが関数なのです。

いかがだったでしょうか?次回再びPythonをやりますので、お楽しみに!