とらりもんHOME  Index  Search  Changes  Login

とらりもん - python入門: インデントが大事! Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

 この章は, pythonシェルではなく, pythonスクリプトをLinuxシェルから走らせる形で進める。pythonで複雑な処理をするようになると, pythonコマンドだけでなく, pythonスクリプトを使うことが多くなるからだ。

 では, テキストエディターなどで, 以下のpythonスクリプトを, test2.pyという名前で作成せよ($ gedit test2.pyなど):
x=0
for i in range(0, 5):
     x=x+i
     print(i, x)
ここで, 3行目と4行目のそれぞれの頭が4文字ぶんのスペースで下げられていることに注意! このようにスペースで行頭を下げることを{{fontc(インデント, red)}}という。

さて, このtest2.pyが完成したら, 走らせてみよう($ python3 test2.py)。結果は以下のようになるだろう:
0 0
1 1
2 3
3 6
4 10
では, test2.pyをちょっとだけ変えてみよう:
x=0
for i in range(0, 5):
     x=x+i
print(i, x)
何をやったかというと, 最後の行のインデントを削除した(行頭のスペースを削除した)のである。これで保存して, 再びtest2.pyを実行してみよう。すると,
4 10
という結果(さっきやった結果の最終行だけ)が表示される。このように, インデントの有無によって, pythonは実行結果が変わってしまうのだ!!

 ここでは, for文がまわす命令の範囲をインデントが決めていたのだ。pythonでは, for文の次に来る命令はfor文そのものよりも下げたインデントで始まる。そして, それと同じレベルのインデントが続く限り, それはfor文がまわす対象範囲として認識される。だから, 最初の例では, x=x+iとprint(i, x)という2つの命令が, forがまわるたびに実行されていた。
 ところが, 次の例では, print(i, x)のインデントが削除された。この状態では, それはもはやfor文がまわす対象ではない。そこでfor文はx=x+iという命令だけを繰り返し, それが終わったあとに, print(i, x)という命令が実行された。それはfor文の外側なので, 1回しか実行されない。そのため, 表示されたのは
4 10
という1行だけだったのである。

 このように, pythonは, 何かの命令の影響する範囲をインデントで表す。ここで注意:
* インデントのためのスペースの数(文字数)はユーザーが好きに決めてよい。1スペースでも2スペースでも3スペースでも4スペースでもよい。
* しかし慣習としては, 4スペースが推奨されている。特に理由がなければそれでいこう!!
* インデントはタブでやっても動く。しかしこれはトラブルの元なので薦められない。
* というのも, 複数の行について, 同じインデント(空白)に見えて, 実は片方はタブでもう片方はスペースでインデントされてた, みたいな状況では, pythonはエラーを出したり, 思い通りに動いてくれない。そして, このようなトラブルは, {{fontc(pythonトラブルの「あるある」の最上位, red)}}なのである。