Pythonは、その文法がシンプルで読みやすいことから広く支持されています。この「読みやすさ」を強制的に担保しているのが、**インデント(字下げ)**による厳格なルールです。
他の多くのプログラミング言語が _ (波括弧) などでコードの「ブロック(まとまり)」を定義するのに対し、Pythonはインデントの深さでそれを表現します。
この記事では、Pythonプログラムを構成する基本的な要素であるインデント、制御フロー(if文やforループ)、関数の定義(def)、そしてスクリプトとして実行するためのお決まりの構文について解説します。
インデント(字下げ)の重要性
Pythonにおいて、インデントは単なる「見た目の整形」ではなく、文法の一部です。if文、forループ、def(関数定義)などで始まる「ブロック」は、その次の行からインデントを下げることによって示されます。
インデントの深さが揃っていない場合、IndentationError というエラーが発生し、プログラムは実行されません。
# 良い例: インデントが揃っている
user_level = 10
if user_level > 5:
print("アクセスを許可します。")
print("ようこそ。")
# 悪い例: IndentationError になる
# if user_level > 5:
# print("アクセスを許可します。") # インデントがない
インデントにはタブまたはスペースが使えますが、公式のスタイルガイド(PEP 8)ではスペース4つの使用が強く推奨されています。
制御フロー
プログラムの流れを制御するための構文です。これらもインデントによって処理ブロックを定義します。
条件分岐 (if文)
if, elif (else if), else を使い、条件に応じて実行する処理を分岐させます。
def check_temperature(temp_celsius):
"""
摂氏温度を受け取り、状態を判定します。
"""
if temp_celsius >= 30:
print(f"{temp_celsius}度: 暑いです。")
elif temp_celsius <= 5:
print(f"{temp_celsius}度: 寒いです。")
else:
print(f"{temp_celsius}度: 快適です。")
# 実行例
check_temperature(32.5)
check_temperature(18.0)
繰り返し (forループ)
リストやタプルなどの「イテラブル(反復可能オブジェクト)」の要素を一つずつ取り出し、処理を繰り返します。
# ファイル名のリスト
file_list = ["report_2023.pdf", "image.png", "document.txt", "archive.zip"]
print("テキストファイルのみを検索します:")
for filename in file_list:
# .txt で終わるか(後方一致)を判定
if filename.endswith(".txt"):
print(f" - 発見: {filename}")
関数の定義 (def)
一連の処理をまとめて名前を付け、再利用可能にするのが「関数」です。def キーワードで定義します。関数本体もインデントで示されます。
def calculate_stats(numbers):
"""
数値のリストを受け取り、合計と平均を計算して返す。
"""
total = sum(numbers)
count = len(numbers)
if count == 0:
return (0, 0.0) # 合計と平均をタプルで返す
average = total / count
return (total, average)
# 関数の呼び出し
data_points = [15, 20, 25, 30, 35]
total_sum, avg_value = calculate_stats(data_points)
print(f"データ: {data_points}")
print(f"合計: {total_sum}, 平均: {avg_value}")
スクリプト実行のお決まりの形
Pythonファイルを直接実行した際に特定の処理を行うため、以下のような構文が用いられます。これは非常に一般的な記述方法です。
def main_process():
"""
このスクリプトの主要な処理
"""
print("メイン処理を開始します。")
results = calculate_stats([10, 20, 30])
print(f"計算結果: {results}")
# この .py ファイルが直接実行された場合のみ、以下のブロックが実行される
if __name__ == "__main__":
main_process()
__name__ という特別な変数は、そのファイルが直接実行された場合は "__main__" という文字列になります。
もしこのファイルが他のPythonファイルから import されてモジュールとして使われた場合、__name__ はファイル名(例: basic_code_structure)になるため、if ブロック内の main_process() は実行されません。これにより、モジュールとして再利用しやすくなります。
その他の構文
pass文
pass は「何もしない」ことを示す文です。構文上、インデントされたブロックが必要だが、実際には何も処理を行わない(あるいは後で記述する)場合に使用します。
# 例: 特定の条件では何もしない
for filename in file_list:
if filename.endswith(".png") or filename.endswith(".zip"):
# 画像やZipファイルは処理をスキップ
pass
else:
print(f"処理対象: {filename}")
行継続 (バックスラッシュ \ と 括弧)
コードが1行に収まらない場合、行の末尾にバックスラッシュ \ を置くと、次の行にコードが継続しているとみなされます。
# バックスラッシュによる行継続
total_score = 10 + 20 + 30 + 40 + 50 \
+ 60 + 70 + 80 + 90 + 100
ただし、() (丸括弧), [] (角括弧), {} (波括弧) の内側では、バックスラッシュを使わなくても自動的に行が継続されるため、こちらを使う方が推奨されます。
# 括弧内の改行(推奨される方法)
allowed_users = [
"user_alpha",
"user_beta",
"user_gamma",
"admin_delta",
]
まとめ
Pythonのコード構造は、インデントによって厳格に管理されています。if文、forループ、def関数定義はすべてインデントされたコードブロックを持ちます。また、if __name__ == "__main__": という構文は、スクリプトが直接実行されたかどうかを判定するための標準的な方法です。これらの基本的な構造を理解することが、読みやすく保守性の高いPythonコードを書く第一歩となります。
