この記事では Python を書く上で抑えておきたい基本的なコードの書き方やルールについて解説していきます。
Python には読みやすいコードを書くための [PEP8] というコーディングの規約があります。このコーディングの規約に基づいて、コードレイアウトやコメントのルール、命名規則を中心に解説しています。
これから Python を始めようとしている方は、本記事でしっかりと基礎を身につけておきましょう。
Python のインストールが完了していない方は、次のリンクからインストール方法を確認できます。
Pythonコードの書き方
Pythonには基本的なコーディングの規約が記載された[PEP8]という文書があります。
この文書には変数や関数名の付け方、空白に関する内容や、インデントの仕方、コメントの書き方など様々な基本的なルールが定義されています。
PEP8の定義を大きく3つに分類すると次のようになります。
[jin_icon_checkcircle color=”#5f7da5″ size=”184x”]PEP8で定義されている3つのルール
① コードレイアウトに関するルール
② コメントに関するルール
③ 命名規則に関するルール
ソースコードは一般的に「書く時間」よりも「読む時間」の方が長いです。
コーディング規約に従う事で、コードの書き方に一貫性が生まれて、誰が見ても読みやすいコード(コードの可読性の向上)になります。
はじめのうちはこれから記載するルールを意識しながら、読みやすいコーディングを心掛けてみてください。
コードレイアウトに関するルール
それでは Python のプログラミングで基本的なコードレイアウトに関するルールを解説していきます。
ステートメント
ステートメントとは Python の機能ブロックを構成する最小の命令文の事です。
このステートメントに関する基本ルールは次の通りです。
[jin_icon_pencil color=”#5f7da5″ size=”184x”]ステートメントのルール
・1行1ステートメント(命令文)にする。
・ステートメントの区切りは改行にする。
・ステートメントの末尾に「;(セミコロン)」は付けない。
ターミナルやコンソールに文字列を出力する print 関数を使って Python で命令文を記述してみます。
次のコードは画面に「Hello World」を出力する命令文です。
print('Hello World')
Python 以外のコードを記述した事がある方は少し違和感を覚えるかもしれません。他の言語(C言語やC#、Java)はステートメントの末尾に「;」を付けます。
Pythonも「;」を任意で付ける事も可能ですが、基本的には1行、1ステートメントとするという考え方があるので「;」を付けません。
同じ行に複数のステートメントをそのまま記述するとエラー「SyntaxError」が発生します。
print('Hello') print('World')
#-------------------------------------------------------
# 上記のコードを実行すると、以下のエラーが表示されます。
# SyntaxError: invalid syntax
#-------------------------------------------------------
複数のステートメントを記載する場合は必ず改行を使って区切るようにします。
以下が正しいコードの記載例になります。
print('Hello')
print('World')
どうしても1行に複数のステートメントを記載したい場合は「;」を1ステートメントの終わりに付ける事でエラーが発生せずに実行する事が可能になります。
print('Hello'); print('World')
ただし、後でコードを読み返す時や他の人がコードを見た時に読みづらくなるので極力避けることをオススメします。
インデント
インデントとは日本語で「字下げ」という意味で、文の行頭に空白を挿入して先頭の文字を右側へ移動させる事です。
Python ではブロックの範囲をインデントを使って表現するので非常に重要な役割を持っています。
このインデントに関する基本ルールは次の通りです。
[jin_icon_pencil color=”#5f7da5″ size=”184x”]インデントのルール
・インデントはタブではなく、半角スペースを使用する。
(Pythonではインデントにタブとスペースが混在するとエラー [TabError] が発生します)
・1ブロック毎にインデントは半角スペース4つで統一する。
Python の文法では、末尾に[ :(コロン)]がつく構文があります。例えば条件分岐文(if, elif, else)や繰り返し文(for, while)、関数、クラスの定義などがあります。
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 制御構文 if, while, for 条件式:
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 関数の定義 def 関数名():
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] クラスの定義 class クラス名():
Pythonは『基本的に末尾に : があったら、インデントする』という決まりがあります。
下のコードのように : が出てきた直後の行から半角スペース4つでインデントしています。Python は、このインデントがある事で処理のブロックとして扱います。
a = 10
if a < 10:
print('数値は10未満です')
print('この数値は負の値を含みます')
else:
print('数値は10以上です')
[jin-fusen2 text=”インデントの注意点“]
インデントは1つのブロックの中で半角スペースの個数を揃える必要があります。個数が揃っていない場合はエラー [IndentationError] が発生します。
例えば、4行目のコードの部分だけ半角スペースの個数が5つした場合はエラーが発生します。これは半角スペースの個数が揃っていないからです。
a = 10
if a < 10:
print('数値は10未満です')
print('この数値は負の値を含みます')
else:
print('数値は10以上です')
#-------------------------------------------------------
# 上記のコードを実行すると、以下のエラーが表示されます。
# IndentationError: unexpected indent
#-------------------------------------------------------
このように Python のインデントは重要な意味を持っているので、常に意識してコーディングする必要があります。
インポート
インポート(import)とは、Python のモジュールなどを利用する為にします。通常、ソースファイルの先頭に利用するモジュール名を指定します。
インポートに関する基本ルールは次の通りです。
[jin_icon_pencil color=”#5f7da5″ size=”184x”]インポートのルール
・import は1度に1つのモジュールをインポートする。
・同一モジュール内から複数の要素をインポートする場合はカンマで区切る。
・ライブラリ毎にグループ化する。
import は1行にまとめて書くのではなく、1度に1つのモジュールをインポートするようにします。
行を分けて書く事で、このエラーが発生したモジュールを特定しやすいメリットがあります。
import sys
import math
# import sys, math と書く事は推奨されていません。
同一モジュール内から複数の要素をインポートする場合はカンマで区切って並べます。
from datetime import datetime, date
# from datetime import datetime
# from datetime import date と書く事は推奨されていません。
Python の標準ライブラリ、サードパーティ(公式がサポートしてない第3者が開発している)のライブラリ、自身が作成したライブラリに分けます。
# 標準ライブラリ
import sys
import math
# サードパーティのライブラリ
import Requests
# 自身が作成したライブラリ
import my_module
グループ化が分かるようにグループとグループの間に1行の空白を入れましょう。
1行の文字数
1行の文字数に関する基本ルールは次の通りです。
[jin_icon_pencil color=”#5f7da5″ size=”184x”]1行の文字数のルール
・コード部分は半角で79文字以内に制限する。
・コメントやdocstring等、改行が入れやすい場合は半角で72文字以内に制限する。
この1行の文字数の制限は、1行が80文字のエディタが折り返して表示する機能を避けるためにあります。コードレビューする際に、エディタで勝手に改行されるとコードが読みづらくなるからです。
また長い行というのは多くのことが1行に混ざっているということが多く、一般的には可読性の低いコードの可能性が高いです。
1行のコードが79文字を超えるようであれば、コードを改行して複数行に変更します。
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”]バックスラッシュを使って改行する
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”]丸括弧を使って改行する
上記の内容で改行したコードが以下になります。
# 改行しない(改行を含む文字数:79文字)
from .models import aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii, jjj, kkk, lll
# バックスラッシュを使って改行する(改行を含む文字数:48文字)
from .models import aaa, bbb, ccc, ddd, eee, \
fff, ggg, hhh, iii, jjj, kkk, lll
# 丸括弧を使って改行する(改行を含む文字数:47文字)
from .models import (aaa, bbb, ccc, ddd, eee,
fff, ggg, hhh, iii, jjj, kkk, lll)
Python では任意の位置でバックスラッシュを入力して改行または丸括弧内の任意の位置で改行すると、行が継続していると見なされます。
空行の数
空行の数に関する基本ルールは次の通りです。
[jin_icon_pencil color=”#5f7da5″ size=”184x”]空行の数のルール
・トップレベルの関数やクラスは2行の空白を入れる。
・クラス定義内のメソッドは1行の空白を入れる。
モジュールのインデントがないトップレベルの関数定義やクラス定義に関しては、2行分の空白をいれて区切ります。
def sample_func_1(flag):
if (flag):
print('OK')
def sample_func_2(flag):
if (flag):
print('NG')
クラス定義内のメソッド定義に関しては、1行分の空白をいれて区切ります。
class SampleClass():
def sample_func_1(self, flag):
if (flag):
print('OK')
def sample_func_2(self, flag):
if (flag):
print('NG')
コメントに関するルール
次に Python のコメントに関するルールを解説していきます。
コメント
コメントはプログラムの説明・注釈として利用するほか、動作チェックの為の一時的にコードをコメントアウト(無効)する目的で使用されます。
コメントの書き方には以下の2種類があります。
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] ハッシュ文字(#)を行頭に入れる。
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] コメントにする文字列を(“””)で囲う。これを docstring と呼ぶ。
コメントに関する基本ルールは次の通りです。
[jin_icon_pencil color=”#5f7da5″ size=”184x”]コメントのルール
・コメント文字列は他の人が見ても分かりやすいようにする。
・コードとコメントが矛盾しないようにする。
・ハッシュ文字(#)とコメント文字列の間に半角スペースを1つ入れる。
・インラインコメントはハッシュ文字(#)の前に半角スペースを2文字以上入れる。
・公開するモジュールの関数には docstring で関数の説明をする。
ハッシュ文字(#)とコメント文字列の間に半角スペースが無くてもエラーになる事はありません。ただ、読みやすいという観点から半角スペースがある方がいいです。
# この1行は行全体がコメントになります。「ブロックコメント」と言います。
print('Hello')
インラインコメント(コードと同じ行に書くコメント)はコードの後に半角スペースを2つ以上を入れて書きます。
print('Hello') # ここからコメントになります。「インラインコメント」と言います。
モジュールを公開する場合は第3者が見ても分かるように説明文を記述します。
複数行に渡ってコメントを書ける docstring を使用します。
def func_1(flag):
"""関数の説明 タイトル
関数についての説明文をここに書く。
"""
命名規則に関するルール
次に Python の命名規則に関するルールを解説していきます。
命名規則とは変数やクラスなどに名前を付ける時の決まり事のです。Python に限った話ではなく他の全てのプログラミング言語にも共通する事ですが、命名規則がある事で見た目が統一されるので、コードを読む際、内容をすぐに読み取りやすくなります。
この命名規則は、PEP8では文字を見ただけで名前の種類が分かるように設定されています。
命名規則には次のような種類があります。どんな場面でどの種類を適用するのかをこれから解説します。
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 小文字1文字 (例:a)
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 大文字1文字 (例:A)
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 全て小文字 (例:lowercase)
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 全て小文字で単語間をアンダースコアで繋げる (例:lower_case)
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 全て大文字 (例:UPPERCASE)
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 全て大文字で単語間をアンダースコアで繋げる (例:UPPER_CASE)
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 単語の先頭を大文字 (例:CapitalizedWords)
[jin_icon_checkcircle color=”#5f7da5″ size=”14px”] 先頭の単語は小文字で次に続く単語の先頭は大文字 (例:capitalizedWords)
また、名前を付ける際の注意点として以下があります。これらに気を付けて名前を付けましょう。
[jin_icon_caution color=”#f2d45f” size=”184x”]注意点
・1文字目に数字は使えない。
・アンダースコア(_)以外の半角の記号(+, -, /等)は使用できない。
・Python の予約語(and, as, if ,case等)は使用できない。
パッケージの名前(フォルダ名)
モジュールの名前は全て小文字にします。名前を読みやすくする為に、必要に応じて単語間にアンダースコア(_)を入れて区切ります。
全小文字
Python のパッケージ名は、全て小文字の短い名前を使う事が推奨されており、アンダースコアを使う事は推奨されていません。
例えば、「tqdm」や「requests」、「samplepackage」のように名前を付けます。
モジュールの名前
モジュールの名前は全て小文字にします。名前を読みやすくする為に、必要に応じて単語間にアンダースコア(_)を入れて区切ります。
全小文字 + アンダースコア区切り
例えば、「os.py」や「sys.py」、「sample_module.py」のように名前を付けます。
関数・変数の名前
関数・変数の名前は全て小文字のみにします。名前を読みやすくする為に、必要に応じて単語間にアンダースコア(_)を入れて区切ります。
全小文字 + アンダースコア区切り
単語間をアンダースコアで区切る記法をスネークケース(snake_case)と言います。
# 関数の例
def sample_func():
pass
# 変数の例
user_id = 10
user_name = 'suzuki'
定数の名前
定数の名前は全て大文字にします。名前を読みやすくする為に、必要に応じて単語間にアンダースコア(_)を入れて区切ります。
全大文字 + アンダースコア区切り
すべての単語をすべて大文字にして、単語と単語はアンダーラインで繋げる記法をアッパースネークケース(UPPER_SNAKE_CASE)と言います。
# 定数の例
SAMPLE_CONST = 1
クラスの名前
クラスの名前は単語の先頭を大文字にします。単語間はそのまま繋げます。
最初大文字 + 大文字区切り
すべての単語を大文字から始めて、単語と単語はそのままつなげる記法をパスカルケース(PascalCase)と言います。
# クラスの例
class SampleClass:
例外の名前
例外の名前はクラスの命名規則を適用します。ただし、例外である事が分かるように末尾に「Error」を付けます。
最初大文字 + 大文字区切り + Error
例外の except だけではなく、以下のコードのようにエラーのクラスを指定します。
# 例外の例
try:
val = 10 / 0
except ZeroDivisionError:
print('この計算はできません')
まとめ
今回は Python のコーディングをする上で知っておきたいコードの書き方やルールについて紹介しました。
ここで紹介した内容に必ず従う必要はありません。開発するチーム内でコーディング規約があるなら、その規約を優先してコーディングを行いましょう。
以上、最後まで読んで頂きありがとうございました。