Python を読む

AI がコードを書く時代になり、Python は最も頻繁に登場する言語のひとつです。機械学習スクリプト、データ処理ツール、自動化スクリプト——AI に頼むと高確率で Python が返ってきます。

このセクションの目的は Python を書けるようになること ではなく、AI が書いた Python コードを読んで理解できるようになること です。「このコードは何をしているのか」「ここを変えたらどうなるか」が分かれば、AI との共同作業の質が大きく上がります。

Python の特徴をざっくり理解する

他の言語のコードを見慣れた目でPythonのコードを開くと、まず「見た目がずいぶんシンプルだ」と感じるはずです。Java や JavaScript と比べたときの Python の特徴を押さえておくと、コードが読みやすくなります。

インデントがブロックを決める

Java は {} でブロックを囲みますが、Python はインデント(字下げ)でブロックを表現します。{} や ; はありません。

# Python
def greet(name):
    if name:
        print("Hello, " + name)
    else:
        print("Hello!")

greet("Taka")
// Java と比べると
public void greet(String name) {
    if (name != null && !name.isEmpty()) {
        System.out.println("Hello, " + name);
    } else {
        System.out.println("Hello!");
    }
}
/* C と比べると、さらに手続きが増える */
#include <stdio.h>
#include <string.h>

void greet(const char *name) {
    if (name != NULL && strlen(name) > 0) {
        printf("Hello, %s\n", name);
    } else {
        printf("Hello!\n");
    }
}
🎯 読み解きポイント:波括弧の有無ではなく「行末とインデント」に注目する

同じ「名前を挨拶する」処理でも、C は {} と ; でブロックと文の終わりを明示し、Java も {} を使いますが、Python はインデントの深さだけでブロックの範囲を表します。AIが生成したPythonコードでインデントがずれていたら、それは見た目の問題ではなく構文エラーそのものです。コピー&ペースト時にインデントが崩れていないか、真っ先に確認する癖をつけましょう。

型を書かなくてよい(でも型はある)

変数宣言に型を書く必要がありません。ただし「型がない」わけではなく、Python が実行時に型を判断します。AI が書くコードでは型ヒント(def greet(name: str) -> None:)が付いていることも多いですが、なくても動きます。

# 変数に型宣言は不要
message = "Hello"
count = 42
ratio = 3.14
items = [1, 2, 3]

# 型ヒント付き(省略可能)
def add(x: int, y: int) -> int:
    return x + y

インタープリタ型——コンパイル不要

Java や C は事前にコンパイルしてから実行しますが、Python はファイルを直接実行できます。python3 script.py で即実行です。ステップが少ない分、AI が書いたコードをすぐ試せます。

ライブラリが豊富

AI が書くコードには import 文がよく登場します。Python には標準ライブラリ(追加インストール不要)と外部ライブラリ(pip install で追加)があります。

# 標準ライブラリ(インストール不要)
import os
import json
import datetime

# 外部ライブラリ(pip install が必要)
import requests      # HTTP通信
import pandas as pd  # データ処理
import numpy as np   # 数値計算
requirements.txt を見たらまず中身を確認する

AIが生成したプロジェクトには requirements.txt というファイルが付いてくることがあります。これは「このプロジェクトを動かすのに必要な外部ライブラリの一覧」です。pip install -r requirements.txt で一括インストールできます。渡されたコードが動かないときは、まずこのファイルに書かれたライブラリが手元に入っているかを疑いましょう。

リスト内包表記——1行で書かれたfor文を読む

AIが生成したPythonコードで、for文を使わずに1行でリストを作っている記述を見て「これは何をしているんだ」と戸惑ったことはないでしょうか。それがリスト内包表記です。

# 通常のfor文で書くと
squares = []
for n in range(1, 6):
    squares.append(n * n)
# squares = [1, 4, 9, 16, 25]

# リスト内包表記で書くと同じ結果に
squares = [n * n for n in range(1, 6)]

# 条件付き(偶数だけ2乗する)
even_squares = [n * n for n in range(1, 6) if n % 2 == 0]
# even_squares = [4, 16]
🎯 読み解きポイント:内包表記は「右から左」に読むと理解しやすい

[n * n for n in range(1, 6) if n % 2 == 0] は、まず for n in range(1, 6)(1〜5を順に取り出す)を読み、次に if n % 2 == 0(偶数だけに絞る)を読み、最後に n * n(それを2乗する)と読むと、書かれている順番より理解しやすくなります。AIが出すコードは可読性より簡潔さを優先してこの書き方を選ぶことが多いので、慣れておくと読むスピードが上がります。

仮想環境(venv)——プロジェクトごとに専用の部屋を作る

AIに「このPythonスクリプトを動かして」と言われて実行したら、手元の環境にインストール済みの別バージョンのライブラリとぶつかってエラーになった——という経験をしたことがあるかもしれません。原因の多くは仮想環境を使っていないことです。

ハクスラゲームでたとえると、仮想環境はプロジェクトごとに用意する専用の倉庫のようなものです。倉庫を分けずに全部のアイテムを1つの袋にまとめて持ち歩くと、あるクエストで使う装備と別のクエストで使う装備が混ざってしまい、意図しない組み合わせで不具合が起きます。プロジェクトごとに倉庫(仮想環境)を分けておけば、ライブラリのバージョン違いが他のプロジェクトに影響しません。

# 仮想環境を作る(プロジェクトのフォルダで実行)
python3 -m venv venv

# 仮想環境を有効にする(Linux/Mac)
source venv/bin/activate

# 仮想環境を有効にする(Windows)
venv\Scripts\activate

# 有効化した状態でライブラリをインストール
pip install requests pandas

# 抜けるとき
deactivate
仮想環境まわりで見る言葉
venv
Python標準の仮想環境作成ツール。追加インストール不要で使える
activate
その仮想環境を「今から使う」状態にするコマンド。ターミナルのプロンプトの先頭に(venv)と表示されれば有効化できている
requirements.txt
その仮想環境に入れるべきライブラリの一覧。AIが生成したプロジェクトに付いてくることが多い

AIコードでよくあるはまりポイント

実際にAIが出したPythonコードを動かして遭遇した、初心者が特にはまりやすい落とし穴を紹介します。

ModuleNotFoundError で止まる

AIが出したコードに import pandas as pd と書かれていても、その環境に pandas がインストールされていなければ ModuleNotFoundError: No module named 'pandas' というエラーで止まります。コードそのものは正しいのに、環境側の準備が足りていないだけ、というケースです。

🎯 読み解きポイント:エラー名に「Module」と付いていたら、まずpip installを疑う

ModuleNotFoundError はコードのバグではなく「そのライブラリが手元にない」というだけの場合がほとんどです。エラーメッセージに書かれたライブラリ名をそのまま pip install ライブラリ名 で入れてから再実行すれば解決することが多いです。

Python 2 と Python 3 の違いに気づかず戸惑う

古いブログ記事やAIの学習データの中には、今では使われなくなった Python 2 の書き方(print "Hello" のように括弧なしで書く print 文など)が混ざっていることがあります。現在主流の Python 3 では print("Hello") のように必ず括弧を使うため、括弧なしの print を見かけたら、それは動かない古い書き方だと判断してよいでしょう。