Python の基本

この章では、 Python の変数の動作と制御構文について扱います。

変数

>>> a = 3
>>> b = a+2
>>> print(b)
5
>>> del b
>>> b
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'b' is not defined

php と同じく、変数に値を代入することで、新しい変数を定義することができます。

$ という記号が無いので見た目がすっきりしていますが、 if などのキーワードを変数にすることができないという欠点があります。 キーワードを変数にしたい場合は、 if_ のように後ろにアンダースコアを1つ つけるのが慣習になっています。大文字と小文字を区別することにも注意してください。

php の unset に相当する構文は del になっています。

php では、変数に入る値として、文字列型、数値型、array型、オブジェクト型など がありましたが、 Python は文字列も数値も配列もすべてオブジェクトになっています。

php でオブジェクト型を変数に代入している時のように、変数自体に値があるというより、 変数にはオブジェクトへの参照が入るような形になります。

>>> a = [1]     # 配列を作って代入する
>>> b = a       # 配列がコピーされるのではなく、配列への参照がコピーされる
>>> b.append(2)
>>> b
[1, 2]
>>> a  # b とa は同じオブジェクトを指しているので、 b への変更がa にも影響する.
[1, 2]

この、一見危険にも見える動作を使いこなすには、同値と同一を区別する必要があります。 php ではオブジェクトの同値性は == で、同一性は === を使っていましたが、 Python では同一性を調べる演算子に is を使います。

>>> b is a      # b と a は同じ配列オブジェクトを参照している
True
>>> c = [1, 2]  # 新しい [1, 2] という配列オブジェクトを c に代入
>>> c == a      # c と a は同値
True
>>> c is a      # だが、同一ではない.
False

Python の変数は他の変数への参照を格納することができません。 php で参照を 使って解決していた問題を Python でどう解決するかは、後で説明していきます。

php と大きく違う点として、一度も代入されていない変数の値を参照しようとすると、 例外が発生します。

>>> print(abc)
Traceback (most recent call last):
  File "<ipython-input-2-037277b7e5b8>", line 1, in <module>
    print abc
NameError: name 'abc' is not defined

分岐

分岐には if, elif, else というキーワードを使い、次のように書きます。

>>> a = 6
>>> b = 3
>>> if a == b:
...     print("foo")
... elif a % b == 0:
...     print("bar")
... else:
...     print("baz")
...
bar

キーワードとしては php の elseif が elif になっただけですが、ブロックを表現するのに {} ではなく、 : とインデントを利用しています。

繰り返し(while)

条件を満たす間繰り返しを行うためには、 while を使います。

>>> a = 1
>>> while a < 100:
...     print(a)
...     a *= 2
...
1
2
4
8
16
32
64

条件式の部分で代入することはできません。 break を使いましょう。

>>> b = 1
>>> while True:
...     a = b
...     if a >= 100:
...         break
...     print(a)
...     b *= 2
...
1
2
4
8
16
32
64

do-while はありません。 break を使いましょう。

>>> a = 1
>>> while True:
...     print(a)
...     a *= 2
...     if a >= 100:
...         break
...
1
2
4
8
16
32
64

列挙 (for)

php でいう foreach ($x as $c) は Python では for c in x になります。 php にある for 文はありません。よくある n 回繰り返しは、 range という 関数と組み合わせて次のように書きます。

>>> for i in range(3):
...     print(i)
...
0
1
2

switch が無い理由

Python には switch 構文がありません。 if-elif-else で十分簡潔に 書くことができるからです。例えば、次のような php の switch 文を Python に書き換えてみます。

<?php
switch ($v) {
   case FLAG_A:
      do_something();
      break;
   case FLAG_B:
   case FLAG_C
      do_anotherthing();
      break;
   default:
      throw new Exception("Unknown flag");
}
if v == FLAG_A:
   do_something()
elif v in (FLAG_B, FLAG_C):
   do_anotherthing()
else:
   raise Exception("Unknown flag")

条件式

Python では、 None, False, 数値なら 0, コンテナ型や文字列型なら 空の場合に、真偽値が偽になります。

論理演算子には、 and, or, not を使います。 and は左側の真偽値が真なら左側を、そうでないなら右側を返します。 0 and foo() のようにした場合、 foo() は実行されません。 or も同じく、左側が真なら右側は評価されません。

>>> not True
False
>>> True and 0
0
>>> False or 3
3
>>> 4 or 3
4

等号や不等号は、 and を使わなくてもそのまま組み合わせる事ができます。

>>> x = 3
>>> 1 < x and x <= 5
True
>>> 1 < x <= 5
True