はじめに
前回の記事「Claude Code が書きがちな Python コードを読めるようになる」では、Claude Code が実行するコードの中でよく出てくるパターン(内包表記や f-string など)を扱いました。今回からは少し立ち止まって、Python の文法そのものを基礎から順番に整理していきます。
Python とは何か
本題に入る前に、Python がどんな言語なのかを、他の言語と対比しながら簡単に整理しておきます。
- インタプリタ言語である
python3 script.pyのように、ビルドの手順を挟まずソースコードをそのまま実行します。 - 動的型付けである
変数を使う前に型を宣言する必要がありません。同じ変数に、後から別の型の値を入れ直すこともできます。詳しくは後述します。 - データ処理がやりやすい
CSV や JSON ファイルの読み書きが標準ライブラリのモジュールだけで完結できます。さらに、pandasやnumpyなどの外部ライブラリ使うと、データ分析や数値計算が非常に効率的に行えます。
文とブロック
Python のプログラムは、「文」(statement)と呼ばれる 1 つ 1 つの命令を、上から順に並べたものです。
多くの言語のように、文の終わりを
;
で示す必要はなく、基本的には改行が文の区切りになります。ただし、丸括弧
()
、角括弧
[]
、波括弧
{}
の中では、1 つの文を複数行に分けて書くことができます。
ちなみに、Python でもセミコロンを使って複数の文を 1 行に書くことはできますが、可読性が下がるため、通常は行いません。
また、複数の文をひとまとまりの「ブロック」として扱いたいときは、インデントでそれを表します。
| 1 2 3 4 5 6 7 | # 合格判定の例 score = 80 if score >= 60: result = "合格" else: result = "不合格" print(result) |
if score >= 60:
の行末にはコロン
:
が付いています。その次の行から、インデントされている行が「
if
の条件が真のときに実行されるブロック」です。
Python では、
if
、
for
、
while
、
with
などは新しいスコープを作りません。そのため、これらのブロック内で代入された変数は、同じ関数やモジュール内の後続のコードからも参照できます。上の例では、
if
または
else
のどちらかで
result
に必ず値が代入されるため、ブロックの後にある
print()
から参照できます。
一方、関数やクラスなどを定義すると、固有のローカルスコープが作られます。
なお、ブロック内の処理が一度も実行されず、変数に値が代入されなかった場合は、その変数を参照できません。
| 1 2 3 4 | if False: message = "こんにちは" print(message) # NameError |
インデントは、1 段につき半角スペース 4 つが慣習です。これは、PEP 8 という Python のスタイルガイドで推奨されています。構文上は 4 スペース以外でも動作する場合がありますが、同じ階層のインデントは一貫させる必要があります。
インデントの対応が取れていない場合や、タブとスペースを不整合に混在させた場合はエラーになります。
また、コメントは
#
で書き始めます。
変数と型
変数への代入は
=
で行います。
| 1 | x = 10 |
変数名には英字、数字、アンダースコア
_
のほか、一定の Unicode 文字も使えます。ただし、数字から始めることはできず、
if
や
for
などの予約語も使用できません。
| 1 2 | user_name = "Alice" 利用者名 = "山田" # 構文上は有効 |
日本語などを変数名に使うこともできますが、一般的な開発では英字とアンダースコアを使うことが多いです。複数の単語からなる変数名は、
user_name
のようにアンダースコアで区切る snake_case が Python の慣習です。
型は自動で決まる
Python では変数の型を宣言しません。また、再代入により別の型の値を入れることもでき、動的型付けの特徴を持っています。
ただし、型ヒントや型チェッカーを利用すると、型安全性を高めることができます。
| 1 2 3 4 5 | x = 10 print(type(x)) # <class 'int'> x = "文字列に変わった" print(type(x)) # <class 'str'> |
代表的な型や値には、次のようなものがあります。
-
int… 整数(10、-3など) -
float… 浮動小数点数(3.14、-0.5など) -
str… 文字列("hello"、'こんにちは'など) -
bool… 真偽値(True/False) -
None… 値が存在しないことなどを表す、NoneType型の特別な値
None
は、値が「ない」状態を表現するためなどに使われます。この値を確認するときは、
== None
ではなく
is None
を使うのが Python の慣習です。
is
は、2 つの参照が同じオブジェクトを指しているかを判定します。
| 1 2 3 4 5 6 7 8 | x = None if x is None: print("値はありません") # 値があることを確認する場合 y = "こんにちは" if y is not None: print(f"値は {y} です") |
== と is の違い
値を比較するときには、主に
==
と
is
の 2 つの演算子がありますが、その役割は異なります。
-
==は値が等しいか(equality)を判定します。 -
isは同じオブジェクトかどうか(identity)を判定します。
| 1 2 3 4 5 | list1 = [1, 2, 3] list2 = [1, 2, 3] print(list1 == list2) # True: 値は同じ print(list1 is list2) # False: 別々のオブジェクト |
None
は Python において唯一無二の特別なオブジェクト(シングルトン)であるため、値の比較ではなく「そのオブジェクト自体かどうか」を判定する
is None
を使うのがルールです。
条件分岐とループ
if / elif / else
条件によって処理を分けるには
if
を使います。複数の条件を順に試すときは
elif
(else if を短縮した綴り)、どれにも当てはまらない場合は
else
を使います。
| 1 2 3 4 5 6 7 | n = 9 if n % 2 == 0: print("偶数") elif n % 3 == 0: print("3の倍数") else: print("その他") |
比較には
==
(等しい)、
!=
(等しくない)、
<
、
>
、
<=
、
>=
を使います。複数の条件を組み合わせるには
and
/
or
/
not
を使います。
match / case
Python 3.10 以降では、値の形や内容によって処理を分けるために
match
を使えます。
| 1 2 3 4 5 6 7 8 9 10 | command = "start" match command: case "start": print("開始します") case "stop": print("停止します") case _: print("不明なコマンドです") |
match
の後ろに調べたい値を書き、各
case
に一致するかを上から順に確認します。最初に一致した
case
の処理だけが実行されます。
case _:
の
_
は、どのパターンにも一致するワイルドカードで、
if
文の
else
に近い役割を持ちます。
match
文は、単純な値の比較だけでなく、タプルやリストなどの構造に応じた分岐にも使えます。
なお、JavaScriptのようなフォールスルーはありません。一度条件に一致すると、そのブロックのみを実行してmatch文を抜けます。
そのため、複数の値にマッチさせたい場合には `case
for
Python の
for
は、C 言語などにある「カウンタを回すループ」ではなく、「並んでいるものを 1 つずつ取り出すループ」です。
| 1 2 3 | fruits = ["apple", "banana", "cherry"] for fruit in fruits: print(fruit) |
回数を指定して繰り返したいだけのときは、
range()
と組み合わせます。
| 1 2 | for i in range(3): print(i) # 0, 1, 2 の順に出力される |
range(3)
は
0, 1, 2
という 3 つの数を順番に生成します。終了値の
3
自体は含まれない点に注意してください。
while
条件が真である間、処理を繰り返すには
while
を使います。
| 1 2 3 4 | count = 0 while count < 3: print(count) count += 1 |
Python には、他の言語にある do-while のような「最低 1 回は実行してから条件を判定する」構文はありません。
さいごに
今回は、Python がどんな言語かという概観から、文・インデント・コメント・変数・型、そして制御構文まで、Python の文法の土台にあたる部分を扱いました。他の言語の経験があれば、個々の概念自体は馴染みのあるものだったと思います。それでも、インデントでブロックを表すことは、Python ならではの部分として押さえておくと、この先のコードが読みやすくなるはずです。
次回は、関数を扱います。Python の関数は数値や文字列と同じように受け渡しできる「値」であることや、関数の定義と呼び出しの順序にまつわるハマりどころを中心に見ていきます。