Pythonで書いたコードは、その他の言語で書いたコードよりも比較的綺麗になると言われています。その大きな理由は「インデント」を揃えなければ動かないことにあります。ここでは、Pythonの統合開発環境(IDE)であるPyCharmで複数行インデントを一括で変更する方法を習得します。
こんにちは。wat(@watlablog)です。
統合開発環境PyCharmの便利機能の1つである、複数行インデント編集方法を紹介します!
前半は初心者向けにインデントについて説明をしています。もしてっとり早くPyCharmの便利機能が知りたい人は目次からジャンプしてみて下さい!
PyCharmのおさらい
僕がPythonのIDEにPyCharmをオススメする理由や、PyCharmのインストール方法等は「Pythonの統合開発環境(IDE)はPyCharmで良い?」に記載しましたので、IDEに何を選ぼうか迷っている人は是非こちらの記事を読んでみて下さい!
Pythonにインデントは必ずつけなければならない
インデントとは?
インデントとは、字下げのことです。「百聞は一見にしかず」ということで、以下の画像を見てみて下さい。
for文の2行目、「a=」の部分からインデントが入っています。この画像の例では半角スペース4つ分の間隔をあけています。
よくTabキーでは無く、半角スペースで4つ分を明示的に付けるのが良いと言われているけど、PyCharmでTabキーを打つと丁度半角スペース4つ分あきますね。
このように、Pythonのfor文やwhile文、def文といった文にはインデントが必要です。その他のプログラミング言語には必ずしもインデントを必要としないものもありますが、多くのプログラマは自主的にインデントを付けているようです。
HTMLは必ずしもインデントを必要としませんが、GoogleのHTMLソースコードを見てみると、しっかりインデントが付いていますよね。
インデントを付けているとfor文等の開始と終了がわかりやすくなり、結果としてコードの可読性が向上してわかりやすくなります。
Pythonでインデントを付けないとエラーになる
以下はPythonでfor文を書いているにも関わらずインデントを付けていないコードの例です。
1 2 3 4 5 6 7 8 |
import numpy as np for j in range(3): a = 0.001 x = np.arange(0, 100, a) y = np.arange(0, 100, a) z = x * y print(z) |
当然このようなコードを書くとfor文のすぐ下の行でエラーになります。エラーの内容はIndentationErrorと書いてあり、インデントが無いよ、というエラーです。
1 2 3 |
a = 0.001 ^ IndentationError: expected an indented block |
このように、Pythonではインデントが揃っていないとエラーになるので、必然的にインデントを意識してプログラミングしなければならず、初心者が書いたコードでも、動くものであれば最低限の可読性は保たれるという仕組みになっています。
複数行のインデントを手動で変えるのは大変!
例えば、一度while文を書いた後、そのwhile文を丸ごとさらにwhile文で繰り返す文を書きたくなったとしましょう。
例として、「Pythonでブログの広告が目立つかどうか「動的」に評価する方法」で載せていたコードからダブルwhileループの例を以下に抜粋します。
画像は縦と横の拡がりを持つので、画像処理の分野ではよくダブルループが使われていますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 縦方向の走査を行うループ while y + (j * y_step) < h: i = 0 # 横方向の走査が終わる度にiを初期化 ys = y0 + (j * y_step) # 高さ方向の始点位置を更新 yf = y + (j * y_step) # 高さ方向の終点位置を更新 # 横方向の走査をするループ while x + (i * x_step) < w: roi = img[ys:yf, x0 + (i * x_step):x + (i * x_step)] # 元画像から領域をroiで抽出 # ここからが領域に対する画像処理 # 領域毎に平均輝度を算出し、これまでの平均値と比べ大きかったらlatestを更新 ave = np.mean(roi).astype("uint8") if latest < ave: latest = ave coordinate = [i, j] else: pass img[ys:yf, x0 + (i * x_step):x + (i * x_step)] = np.full(roi.shape, ave) # ここまでが領域に対する画像処理 i = i + 1 # whileループの条件がFalse(横方向の端になる)まで、iを増分 j = j + 1 # whileループの条件がFalse(縦方向の端になる)まで、jを増分 |
先ほどの例のように、数行の文であれば楽に編集できましたが、文が長くなればなるほど1行ずつインデントをずらしていくのはかなり退屈な作業となると思います。
しかし、PyCharmを使えば簡単に複数行のインデント変更が出来てしまいます。
PyChatmで複数行のインデントを一括で変更する方法
動画で解説
PyCharmで複数行のインデントを一括で変更する方法を以下の動画にまとめました。
インデントを付ける場合は、つけたい行を複数行選択し「TABキー」を押すだけです。逆にインデントを無くす場合は、インデントを外したい行を複数行選択し「SHIFT + TABキー」を押すだけです。
これで大規模なコード編集も楽にこなせますね!
まとめ
PyCharmを使えば簡単に複数行のインデントを一括で変更できることがわかりました。
僕の場合はPyCharmを数か月使ってようやく気付いた機能でした…。意外と便利な機能は沢山ついているものですね。
PyCharmには「良いIDEはプログラマを育てる」のごとし機能が沢山あります!これからも特に役立つ機能があれば紹介したいと思います!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
記事参考になりました。ありがとうございます。
“インデントを無くす場合は、インデントを外したい行を複数行選択し「SHIFT + TABキー」を押す”とあるのですが、なぜかこれだけできませんでした。
Ctrl+[ならできます。
設定はSublimeTextにしています。
なぜかご教示いただけますと幸いです。
あと、インデントを空けたら一行だけ空いてしまう現象も出てしまい、
IndentationError: unindent does not match any outer indentation level
というエラーが出て、
スペースキーで一行消さないといけないケースもあります。
これも併せて原因を教えて頂けると幸いです。
ご訪問ありがとうございます。
こちらはデフォルト設定ですが、そのようなエラーは出ませんでした。
もしかしたらPreferenceの設定が違うのかも知れません。
「https://miyabikno-jobs.com/pycharm-setting/」
こちらの記事に設定変更方法が書いてありますが、いかがでしょうか?
ご教示頂きましてありがとうございます。
素のSublimeTextでは、「Shift+Tab」は機能しており、PycharmでSublimeTextに設定してからはしっかりと機能していたのですが、ある日を境に動かなくなりました。
お教えいただいたリンクの通り、Setting(Preference)を触ってみたのですが、「Shift+Tab」をショートカットキーとして追加しようとしても他のActionで設定されており、追加できませんでした。
Pycharmの”デフォルト”のショートカットキーとして「Shift+Tab」はアンインデントとして設定されているのですが、やはり変です。
原因は分かりませんでした。
力添えをしてくださり、感謝いたします。
ありがとうございます。