Pythonにおけるインデントのふるまい

Pythonでスクリプトを書いていて、インデントの扱いにおけるふるまいの違いを見つけたので記載。

参考資料は以下の書籍。

PythonでExcel、メール、Webを自動化する本
Amazonで中嶋 英勝のPythonでExcel、メール、Webを自動化する本。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。

ふるまい

ループ処理のスクリプトを作成

以下のスクリプトでリストを作成する。

no_indent.py

names = ["tanaka", "suzuki", "yamada"]
customers = []
for name in names:
    user = "Mr." + name
    customers.append(user)
print(customers)

実行結果は以下となる。

[‘Mr.tanaka’, ‘Mr.suzuki’, ‘Mr.yamada’]

同じスクリプトでprint行をインデントする

以下のスクリプトで新しいリストを追加する。

indent.py

names = ["tanaka", "suzuki", "yamada"]
customers = []
for name in names:
    user = "Mr." + name
    customers.append(user)
    print(customers)

実行結果は以下となる。

[‘Mr.tanaka’]
[‘Mr.tanaka’, ‘Mr.suzuki’]
[‘Mr.tanaka’, ‘Mr.suzuki’, ‘Mr.yamada’]

結果が異なる理由

Pythonの仕様

Pythonではインデントをfor文やif文のコードをグループ化するために使っているため。

以下に詳細を記載。

no_indent.pyの場合

user~(user)のインデントしている行を一つのグループ(ブロック)と見なしてfor文を実行する。

forでループした結果をprintするため、最終的な結果が出力される。

for name in names:
    user = "Mr." + name            ←インデントしている
    customers.append(user)         ←インデントしている
print(customers)

#結果
['Mr.tanaka', 'Mr.suzuki', 'Mr.yamada']

indent.pyの場合

user~(customers)のインデントしている行を一つのグループ(ブロック)と見なしてprint文も含めてfor文でループを実行する。ループが終わる毎にprint文が実行されるためappendされた結果が毎回出力される。

for name in names:
    user = "Mr." + name            ←インデントしている
    customers.append(user)         ←インデントしている
    print(customers)               ←インデントしている

#結果
['Mr.tanaka']              ←1回目
['Mr.tanaka', 'Mr.suzuki']        ←2回目

['Mr.tanaka', 'Mr.suzuki', 'Mr.yamada']  ←3回目

まとめ

Pythonではインデントが違うだけで結果が全く異なる。

初歩的な内容だけど忘れがちなので注意すること。

コメント

タイトルとURLをコピーしました