第03回 CoderコンポーネントのためのPython言語の基礎

Codeコンポーネントを活用するためにはPsychoPyがベースとしているPython言語の知識が必要になります。ここでは、特にPsychoPyで心理実験を作る際によく使う機能に絞って説明します。より一般的なPythonの知識を身に付けたいときには、公式サイトやWeb上に公開されている入門サイト(例えばこちら)などを参照してください。解説書籍も多数出版されています(Amazon)。

基本的ルール

Pythonのプログラムは命令を並べていくことによって作られます。この命令のことをステートメントと言います。

ステートメントは特に指定のない限りは上から順番に実行されていきます。これから説明するifステートメントなどを使えば、その順序を変えたり行をスキップすることは可能です。

Pythonではステートメントや式の中にあるスペースは、ほぼ無視されます。プログラム内容の理解を助けるためにコメントを入れたい場合には、先頭に「#」にすることで、それ以降の行が変わるまでの文字列はコメントとして解釈され、無視されます。

変数・演算子

変数とは数値や文字列などを入れる箱(「入れ物」)のようなものをイメージしてもらうといいと思います。例えば、3という数値をaという名前の箱に入れる(代入する)ときは、

a = 3

と書きます。変数名にはアルファベット・数字・アンダースコア(_)を用いることが出来ます(すべて半角のみ)。日本語の文字は使えません。また大文字と小文字を厳密に区別するので注意してください。さらに数字を変数名の先頭につかうことはできません(x5という変数名はOKだが、5xはダメ)。

代入した変数を使って演算を行うことができます。

a = 4
b = 5
c = a + b

と書くことによってcという変数にはaとbの値を加えた9が代入されます。

文字も同じように変数に代入することができます。文字を代入するときにはシングルクォーテーション(’)かダブルクォーテーション(”)で文字列を囲みます。

message = "Hello!"

これでmessageという名前の変数に「Hello!」という文字列が代入されました。数字を文字列として変数に代入することも出来ますが、その場合は四則演算をはじめとした数的な操作ができなくなります。

また日本語(2バイト文字)を変数に代入するときには、unicodeという形式にする必要があります。その場合はクォーテーションの前に小文字のuを置きます。詳しい説明はここでは省きますのでそういうものだと思って覚えておいてください。

message = u"こんにちは!"

後述する条件分岐では、変数の値を比較します。その時に使われる記号(演算子)の代表的なものに以下のものが挙げられます。

x < y         xがyより小さい
x <= y        xがy以下
x > y         xがyより大きい
x >= y        xがy以上
x == y        xがyと等しい
x != y        xとyが等しくない

数値同士だけでなく、文字列同士でも比較が行えますが、文字列に対して実用上意味があるのは「==」と「!=」だけです。さらに複数の比較を組み合わせることもできます(論理和・論理積)。

x < y and y>z    xがyより小さい、かつyがzよりも大きい
x > y or y>z     xがyよりも大きい、またはyがzよりも大きい

条件分岐

条件によって実行する処理を変えるためには、ifステートメントを使います。ifステートメントは後ろの式を評価して、正しければ(真であれば)、次のブ ロックのステートメントを実行するというものです。他にはelifステートメントやelseステートメントがあり、これらを組み合わせることで、複数の選択肢に分岐して処理を行うことができます。

if 条件式1:
  ステートメントA
elif 条件式2:
  ステートメントB
elif 条件式3:
  ステートメントC
else:
  ステートメントD

この場合、条件1が正しければステートメントAが、条件2が正しければステートメントB、条件3が正しければステートメントC、どれも正しくない場合にはステートメントDが実行されます。プログラムは上から順に実行されるので、どの順番に条件を評価するかが重要になります。例えば条件1 と条件3が正しいような場合、始めに評価される条件1の後ろにあるステートメントAは実行されますが、条件3のステートメントCは実行されないことに注意 してください。

ここで重要なポイントは、条件式を評価した後で実行されるステートメント行の先頭が字下げ(インデント)されていることです。Python言語においてはこのインデントが重要な意味を持っています。例えば条件1が真だった場合に、複数のステートメントを実行するような場合 には、それらを同じインデントに揃えることによってひとまとまりとして扱われます。このような構造をもつステートメントを複合ステートメントと呼びます。ifステートメントはその一つです。

複合ステートメントはヘッダ行とブロックの組み合わせで構成されます。複合ステートメントを使う際に は、まずヘッダ行を書き、末尾にコロン(:)をつけます。そして、次の行を一つ字下げをして、1つ以上のステートメントを書きます。同じレベルに字下げさ れたステートメントはまとめて「ブロック」となり、ひとまとまりで実行されます。

例えば、

if 条件式4:
  ステートメントE
  ステートメントF
else:
  ステートメントG
ステートメントH

というコードの場合、条件式4が正しかった場合、ステートメントEとFが実行され、そうでない場合にはステートメントGが実行されます。ステートメントHはifステートメントと同じインデントですので、条件4の真偽にかかわらず、実行されます。

さらにifステートメントを入れ子状にすることもできます。

if 条件式5:
    if 条件式6:
        ステートメントI
    else
        ステートメントJ
else:
    ステートメントK

という場合は、条件式5が真の場合は、条件式6が評価され、真ならステートメントI、偽ならステートメントJが実行されます。条件式5が真でない場合には、ステートメントKが実行されます。

このような形でif, elif, elseステートメントと上で紹介した比較演算子を活用することで、複雑な条件分岐も表記できるはずです。