とらりもんHOME  Index  Search  Changes  Login

python入門: インデントが大事!

 この章は, 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行目のそれぞれの頭が3文字ぶんのスペースで下げられていることに注意! このようにスペースで行頭を下げることをインデントという。

さて, この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文字でも3文字でも4文字でもよい。
  • インデントはスペース記号でやること。タブでのインデントも動くが, トラブルのもとなので薦められない。
  • というのも, 複数の行について, 同じインデント(空白)に見えて, 実は片方はタブでもう片方はスペースでインデントされてた, みたいな状況では, pythonはエラーを出したり, 思い通りに動いてくれない。そして, このようなトラブルは, pythonトラブルの「あるある」の最上位なのである。
Last modified:2019/01/21 16:57:26
Keyword(s):
References:[python入門]