ブロック・フロー制御・変数のスコープ
ブロック
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