大学院博士前期課程:計算生物学演習(2009年度後期)
pythonの使い方(1)
pythonを起動する
この演習では、Cygwin/MacOS X/LinuxのPythonを用いる。いずれのプラットフォームにおいても以下の手順でpythonを起動できる。
- ターミナルを立ち上げる
- プロンプトが出たら、pythonと打ち込む
pythonを終了する
contrlキーを押しながらdキーを押す。
文法
プログラムを作成するためには、作成のルール(文法)を覚える必要があります。幸いpythonは覚えるべき事項が少ない言語です。変数の概念、四則演算のやり方、プログラムの流れを制御する方法および、関数(メソッド)の使い方がわかれば、目的の処理(統計解析)をおこなうプログラムを自由に作成することができます。
- 変数
プログラムは、複雑な計算を何回も実行しなければならないときに作成します。1回しか行わない計算ならばかなり複雑な計算であっても、電卓を使って計算してしまうでしょう。何回も実行する計算であっても、簡単な計算ならば毎回暗算で行った方がよいかもしれません。複雑な計算を何回も実行するということは、ある決まった複雑な手続きの計算を、様々な数値で行うことを意味しています。その場合、複雑な手続きは抽象的に記述し、その記述の中に毎回別の数値を代入して計算を行っていくのが一番便利です。抽象的な手続きを記述する際に数値を代入する仮の値のことを「変数」とよびます。pythonでは変数を特別に準備する必要はありません。変数に値を代入することで、変数が自動的にできあがります。

上の絵では、sという変数を準備して、そこに2を代入しています。sという名前がついた箱をコンピュータの中に用意して、その箱の中に2という数字を入れたと解釈してもよいです。
変数の中には整数だけでなく、小数や文字を入れることもできます。文字を代入するときには、文字をシングルクオーテーションまたはダブルクオーテーションで囲みます。

変数の中身を知りたいときはprint命令を使います。print命令に変数を指定すると、変数の中身(箱に入っている値)が表示されます。

変数を2つ以上ならべて表示するには、print命令に対して複数の変数をカンマで区切って指定すればよいです。カンマを忘れるとエラーが表示されます。

ただ単に変数名を打ち込むだけでも、変数の中身を表示することができます。また何も入れていない変数(空っぽの箱)を指定すると、エラーが表示されます。

変数へ代入する値は1つである必要はありません。2つ以上の値を変数に代入することができます。その際は、四角括弧[ ]で複数の値を囲み、各値の間にはカンマを入れます。関連する値をこのようにひとつの変数に代入すると後の利用が簡単です。このようにして代入した変数には順番があります。最初の値を表示したいときはその値を変数名プラス[0]で指定することができます。2番目の値ならば変数名プラス[1]、3番目の値ならば変数名プラス[2]です。全部で3個しか値が入っていない変数で、4番目の値を参照しようとするとエラーがでます。また参照する番号に負の値を使うと、後ろからの順番で値を参照できます。[-1]は一番最後、[-2]は最後から2番目です。

上の図で、xの中身を表示したときに、少し妙なことが起こっています。xに代入した値は、1.414と1.732、2.369にもかかわらず、xを表示すると、1.414ではなくもっ長い数字が、また2.369ではなくもっと長い数字が表示されます。これはコンピュータの中で数値をどのようにして記憶しているかに依存する精度の問題です。コンピュータで小数計算をする時には避けられない問題です。精度や誤差については別の場所で説明します。
まとまりにして代入する値を小数に統一する必要はありません。文字や整数が混在しても代入ができます。この変数のことをリスト型変数とよびます。

- 四則演算
pythonでは電子卓上計算機と同じように四則演算ができます。以下の記号を用います;足す(+)、引く(-)、かける(*)、割る(/)、累乗(**)。計算結果を新しい変数に代入することもできます。イコール(=)の左側に新しい変数を、右側に計算式を書けばよいのです。イコールの左右に同一の変数があった場合はどうなるのでしょうか?正しい計算結果が左の変数に上書きされます。

イコールの左右で同じ変数があらわれる場合のうち、変数に定まった値を足したり、定数から定まった値を引く計算では、記述を略記できます。かけ算や割り算ではこのような簡略表記はできません。

四則演算のうち、割り算には気をつける必要があります。pythonでは、整数の割り算をするときは、その答えが整数になるようにします。割り算して得られた値を超えない一番大きな整数にします。1/2は0.5ですから、この値を超えない最大の整数である0になります。ー1/2はー0.5なので、この値を超えない最大の整数であるー1になります。答えが小数でほしい場合は、計算に用いる数値のいずれかまたは両方を小数にしてください。

休憩はじめ:
何回も同じ操作を打ち込むのが、そろそろ面倒になってきたと思います。そう言うときは、テキストエディターを使ってコマンドをファイルに書き、そのファイルをpythonに読ませて操作を実行させましょう。Linuxならばviやnemacsを使ってファイルを作成します。

上の図で文字に色がついているのは、viの機能であり、pythonで実行するファイルとしては意味がありません。文字についている色はpythonではまったく解釈されません。ファイルを作る際の決まり事がいくつかあります。
- ファイル名は必ず.pyで終わること
- ファイルの第1行目に#!/usr/bin/env pythonと記載し、第2行目は何も書かないこと
ファイルができたら、ファイルに実行権を与え(chmod +x またはchmod 700)、コマンドラインにファイル名を打ち込んでください。ファイルの3行目から列挙した操作が実行されるはずです。

このファイルのことを「プログラム」や「ソースコード」とよびます。
:休憩おわり
- プログラムの流れを制御する方法
コンピュータに操作を命令する場合には、全操作を正確に記述しなければなりません。さまざまな値に同じ操作を適用する場合は、操作を1回だけ記述して、この操作を繰り返すように命令できれば便利です。このような繰り返し操作を記述するときにforループあるいはwhileループを使います。変数の性質によって行う操作を切り替えたい時もあります。このような条件判断はif文で記述します。
- forループ文
forループでは、リスト型変数にされた値を最初から順番に取ってきて、その値を用いて決められた命令を実行してきます。

上では、まずlist変数に1,2,3,4,5を代入しています。それからsum変数に0を代入しています。その次にループの形式を定義しています。list変数から順番に値を取ってきてelement変数に代入し、以下の命令群を実行せよ、という意味です。最後の:を忘れずにつけてください。:の後でenterキーを押すと左端の記号が...に変わります。forループに入ったことを意味します。「命令群」を明らかにするためにループ内の命令はすべて同じ形式で字下げする必要があります。上では、最初に3文字の空白を入れることに決めています。一定に決まっていればよいので、2文字の空白でもタブでもかまいません。決まっていることが肝心です。命令群の最初はelementを表示することです。その次はsum変数にelement変数を足し込むことです。その次には空行(文字を何も打ち込まずにenterキーを押す)を入力します。するとループの中の命令群が実行されます。element変数には、listから値が順番に代入されるわけですから、element変数ははじめは1です。ですので画面に1が表示されて、sum変数に1が足し込まれます。もともとsum変数は0でしたから0+1=1でsum変数に1が代入されます。これでforループの第1周目が完了です。次にlist変数から第2番目の値が取り出されelement変数に代入されますので、element変数は2です。2が画面に表示されて、sum変数に2が足し込まれ、sum変数に3が代入されます。どんどん繰り返して、element変数に5が代入され、5が画面に表示され、sum変数に5が足し込まれます。list変数はもうこれ以上ありませんからforループは終了します。画面には1,2,3,4,5が縦に並んで表示されます。その後sum変数を表示してみると、sum変数には15(1から5の和)が代入されていることがわかります。
それでは、いくつかの数字の合計を求めたいときにはどうすればよいのでしょうか?数字をリスト変数として代入し、リスト型変数が番号で参照できることを利用すれば、合計を求めることができます。

最初に数値をlist変数に代入しています。それからsum変数に0.0を代入しています。list変数の内容が小数なので、sum変数も小数にしています。次にforループが始まります。range(0,4)は0から始まる4個の整数を値に持つリスト型変数を作る操作です。ですのでこの部分は[0,1,2,3]ということです。forループの最初の行はsum変数にlist変数のelement番目の数値を足し込むことを意味しており、第2行目はsum変数の値を表示すること指示しています。forループの中では、まず最初にelement変数は0ですから、sum変数にlist[0]つまり22.1を足し込みます。sum変数の値(つまり22.1を表示後に、forループは2周目に入りますので、element変数は1になり、sum変数にlist[1]つまり596.3を足し込みます。sum変数は22.1でしたので、この操作でsum変数は618.4(=22.1+596.3)になります。forループが最後まで回転するとlist変数にあるすべての値がsum変数に足し込まれるので、sum変数の値は747.5 ( = 22.1+696.3+38.6+90.5)になります。この値をlist変数の値に個数(=4)で割ると、平均値186.875が得られます。これで任意の数値を参照して操作をすることができるようになりました。
- whileループ文
forループとまったく同じことが、whileループでもできます。ただし今回は変数がひとつ増えています。ct変数は最初が0でwhileループが回転するごとに1ずつ増加します。whileループの書き方はforループとそっくりですが、whileの直後にはループを継続する条件を書きます。条件の書き方はif文のところで詳しく説明します。以下の例では、ctが5よりも小さい間は、whileループを継続しなさい、という意味です。

こちらにもct変数が存在します。whileループが回転するごとにctは1ずつ増加し、ctが4未満の間はwhileループが継続されます。

休憩はじめ:
ループを使えるようになると、複雑な操作を含むプログラムも書けるようになります。そのような操作はファイルに保存して何回も利用できるようにした方がよいでしょう。

このプログラムがあれば、listの数値を変更してrangeの最後の数値をlist変数内の数値の数にあわせれば、すぐに和と平均を求めることができます。ファイルに操作を記述する場合は、forループの最後の空行はなくても大丈夫です。print文のところに見慣れない書き方があらわれていますが、実行結果を見ると、どうなっているのかが想像つくと思います。" "で囲まれた部分が表示されていますが" "内に%で記されている部分が、" "外の%以降に記されている変数で置き換わっています。" "内の%の次に続く文字は、置き換える変数がどのような数値であるかを示しています。小数ならばf、整数ならばd、文字ならばsです。
:休憩おわり
- if文
条件によって行う操作を変える場合にはif文を用います。例えば変数が正の数ならばある操作をして、変数が負の数ならば別の操作をする場合などです。

そろそろ操作が複雑になってきたので、ソースコードをつくって説明します。if文はwhile文とよく似ており、ifの後に条件を書きます。そしてその条件を満たしている場合は、if文以下の操作群を実行します。操作群の表し方はforループやwhileループの時と同様、字下げを使います。判別条件が複数ある場合は、andやorを使います。xが0以上1未満ならば if x >= 0 and x < 1: と書きます。xが1ではないという条件は x != 1です。条件文全体を否定したい場合はnotを使います。例えばxが0未満または1以上ならば、if not (x >= 0 and x <1):です。

条件に階層性がある場合には、elifとelseを使います。elifはelse ifの省略形です。最初のif文の条件を満たさなかった場合に、さらに条件判定をする場合にelif文を使います。elif文は何回でも使うことができます。すべてのif文の条件を満たさなかった場合に何か処理が必要ならば、else文で残りすべてを受け取ることができます。else文はなくても問題ありません。

xの値を変えることで、if文の条件にしたがって異なる文章が画面に表示されるようになっています。