大学院博士前期課程:計算生物学演習(2009年度後期)
pythonの使い方(2)
文法:関数(メソッド)の使い方
プログラムを作成するときには、ある定まった手続きをひとまとめにしてプログラムに記述するのが普通です。このひとまとまりのことを関数またはメソッドといいます。関数とメソッドは作り方やその位置づけがまったく異なりますので、以下では別々に説明します。ただし、頻繁に利用する手続きをまとめて記述するという考え方では、両者共通です。関数やメソッドにしてまとめておくと、その手続きが必要になったときに関数かメソッドを呼び出せばよいわけですし、その手続きを変更したいときには、1つの関数やメソッドを修正すればすべてが統一的に修正できます。プログラムのあちこちに同じことを記述している場合は、それらを整合性を維持して修正することは大変難しいです。
- 関数
例えば数値がリスト型で与えらているときに、その平均値を求める関数を作ってみましょう。以下のようになります。

この関数をプログラムで利用する方法は以下の通りです。

プログラムの前半で関数を定義し、後半でその関数を利用します。上記のプログラムでは、最後の2行がプログラムの主要部分です。最初に変数sに浮動小数のリストを代入し、2行目で変数sを関数に渡し、同時に関数を画面に表示しています。関数を定義してしまえば、プログラムの主要部分で細かい手続きをすべて隠すことができるので、プログラムの流れがわかりやすくなります。
関数を定義するときはdefに続いて関数名を書き、丸括弧の中に引数(ひきすう)をならべます。引数とは、プログラムの主要部分から関数を利用する際に、主要部分から関数に受け渡す変数のことです。上記例では、主要部分で定義して変数sが関数に渡されており、その値が変数vlistに代入されます。def文の最後に:をつけることを忘れずに。関数本体の記述は、ループを記述したときと同じです。最初に空白3文字をいつも入れてください(必ずしも「空白3」文字である必要はありません。一定の方式で字下げ(インデント)をすればよいのですが...)。関数の本体では、実行したい手続きを書いていきます。最後に計算結果をプログラムの主要部分に戻すために、計算結果が入っている変数をreturnします(戻り値)。これで完了です。もしもプログラムの主要部分に戻すものが何もなければ、returnの後に変数を記述する必要はありません。プログラムの主要部分で関数をいきなり画面に表示することになっています。これで戻り値が表示されます。pythonの関数には、もっといろいろな機能が付加できますが、今のところはここに説明したことを理解していれば十分でしょう。
- メソッド
関数を呼び出すのは、ちょっと面倒です。また関数で実行する手続きと関数に渡す引数との関係をしっかり覚えておかないと、関数で記述した手続きが正しく実行してくれなくなるかもしれません。このように感じるときは、変数と一群の手続きを一緒にしておけば便利です。これは日常生活でもよくあることです。コップは飲料水を飲むことに専用に使います(時々変な使い方をするかもしれませんが、それは例外です)。中に入れる液体はいろいろな種類がありますが、その液体を飲むためにコップは存在しています。コップといえば飲料水という強いつながりがあります。プログラムを作る場合も同じで、例えば、浮動小数のリストといえば平均値という強いつながりが必要になることも多々あります。こういうときは、変数の中に平均値を求める手続きを埋め込みます。この場合の手続き群のことを、関数と区別してメソッドとよびます。メソッドは変数(厳密に言うと型)の定義と同時に定義します。

メソッドと変数を同時に作るためには、クラスを定義します。classの次に定義しようとしているメソッドと変数の中身をよく表す名称を記します。その次のdef文はほとんど決まりごとです。変数が受け取る値の数だけ、内部変数名を定義します。内部変数は何個あってもかまいません。一番最初はselfと決まっています。その次のdef文はメソッドの定義です。これは関数とそっくりです。違いは引数に相当する部分です。ここはselfとします。メソッド内部ではself.変数名で変数の値を参照します。メソッドは何個あってもかまいません。

実際にメソッドを使うときは、変数名に続けてピリオドとメソッド名と()をつけるだけです。
以下には、もうちょっと複雑なメソッドの使い方の例として、円錐の様々な量を求めるメソッドを記します。この例の3行目にあるfrom文については、次の節で説明します。

文法:様々な関数やメソッドを利用する
プログラムを作る際には、三角関数や対数などがすぐに必要になります。これらを関数やメソッドとして自分で定義していくのは大変です。pythonではこれらの手続きを関数やメソッドとしてすでに定義しています。
関数はその種類によって分類されており、ライブラリとしてまとめられています。このライブラリを利用すれば、細かいことは考えずに複雑な関数を利用することができます。ライブラリを利用する際にはライブラリをプログラム内に”輸入”する必要があります。

輸入は上記第3行目にあるようにfrom (ライブラリ名) import *でできます。上記の例では数学ライブラリmathをインポートしています。これら以外のライブラリーとしてcsv, shelve, pickle, datetime, calendar, re, sys, os, random, urllib, urllib2, ftp, poplib, smtplib, thread, threadingなどが標準的に存在します。
importという命令から何となく想像できるように、from行では、mathに書かれているすべての関数を導入せよ、ということを意味しています。ですので、自分でいろいろな関数を定義したファイルをつくり、それをimportすることも可能です。1点注意すべきことがあります。自分で作るファイルの名称が、標準のライブラリー名と同一でだと、標準のライブラリーではなくて、自分で作ったファイルがインポートされます。mathライブラリをインポートしているはずなのに、プログラムがうまく動作しない場合は、その原因の多くは、自分でmath.pyというファイルをつくっており、そのファイルが今動作させようとしているプログラムと同じところにあることです。
文法:プログラムの外部からデータを読み込むには
今までのプログラムは、変数をプログラムの中で定義していました。これでは変数に代入する値が変わるごとにプログラムを書き換えないといけなくなります。そこで、プログラムを実行するときに別ファイルから変数に代入する値を読み込むようにすれば、プログラムを修正する必要がなくなります。エクセルファイルのデータをテキストファイルで保存して、pythonのプログラムの入力にすることもできます。そのためには、例えば、以下のようにします。

上記プログラムでは、外部ファイルに保存されている浮動小数の数値がval変数にリストとして代入されます。

外部ファイルには、1行に1個の浮動小数が記載されています。いろいろと工夫をすると、他の形式の外部ファイルからデータを読み込むことができるようになります。
おまけ:乱数を利用して円周率を求める

