ブロック・フロー制御・変数のスコープ

ブロック

C/C++Perl ではブロックは {} でくくるが、
Python ではインデントでブロックを決める。
同じインデントの連続した行がひとつのブロックとなる。

if cond:
    ret_code=1  #┬この2行が同じブロック
    print "ok"  #┘
else:
    ret_code=2  #┬この2行が同じブロック
    print "NG"  #┘

Python で一般的なインデントは半角スペース 4 つだが、
タブや任意の数の半角スペースでもかまわない。
ただし、コード中でインデントを混在させることは出来ない。
最初のインデントが半角スペース 4 つであれば、それ以降の
すべてのインデントはこれに従う必要がある。
インデントが2段ならば半角スペース 8 つ、3段ならば 12 個となる。
ブロック中には空白文字しか含まない行をはさむことが出来る。

if ret_code>0:
    print "ok"                         #                          ┬ if ret_code>0 のブロック
    if ret_code==1:                   #                          |
        print "ret_code is 1."         # if ret_code==1 のブロック|
    else:                              #                          |
        print "ret_code is not 1."     # else のブロック          |
# コメントをおいても空白行とみなされる #                          |
    print ret_code                     #                          ┘

フロー制御

Python では、if-elif-else、while、for が使える。

if-elif-else

if の構文は以下の通り。

if 条件1:
    条件1が真の場合の処理
elif 条件2:
    条件2が真の場合の処理
else:
    すべての条件に当てはまらない場合の処理

C/C++ のように条件を () でくくる必要はなく、
条件の後にコロンを付与する。
if 文の最後のブロックの終わりは、
次の行のインデントで見分ける。

if cond:
    print 0  # if cond のブロック
print 1      # if cond のブロックではない
while

while の構文は以下の通り。

while 条件:
    条件が真の場合に繰り返す処理

while を途中で抜けたい場合には break が使える。

for

for は Perl の foreach に近い。

for 変数 in イテレータ:
    各変数に対する処理

イテレータは次々と要素を提供するオブジェクトである。
リストはイテレータとして使われる機会が非常に多い。
また、辞書の各要素を処理する場合も多い。

>>> a = [0, 1, 2]
>>> for x in a:
...     print x
...
0
1
2
>>> d = {"a":0, "b":1, "c":2}
>>> for v in d.values():
...     print v
...
0
1
2

C/C++ の for 文のような使い方をしたい場合は、
range() を使用する。 range は 0 から始まり、
指定された数の要素を含むリストを返す*1

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

変数のスコープ

Python の変数は宣言の必要は無く、値を代入した時点で作成される。
if や while, for のブロック中で作成した変数には
そのブロック以降でもアクセスできる。
しかし、すでに存在している変数と同名のブロックローカルな
変数は作成できない*2

if True:
	x = 0
print x  # OK

y = 0
if True:
	y = 1
print y  # 1 を出力

*1:始めの数やいくつずつ増えるかを指定することもできる

*2:ブロックローカルな変数というのが無い