はじめに
こんにちは。あかべこすです。
2025年はAIエージェントの一年となり、AI開発に強いPythonは日に日に人気が増している気がします。C++などの言語と異なり、メモリ管理が不要で文法もわかりやすいPythonは、プログラミング初学者やプロトタイプ開発に向いた、非常にヒューマンフレンドリーな言語と言えるでしょう。
また、コーディングエージェントの性能が増し、非プログラマが趣味や業務効率化のために、PythonでAIにサクッとアプリを作らせる機会も今後どんどん増えていきそうです。
そこで今回はPython開発を行う上で最低限知っておきたい基礎知識を10個ピックアップして、QA形式でまとめてみました。Pythonに限定した内容でなく、広く開発全般に使える知識も書いているので、ぜひ読んで覚えていただければと思います!
対象読者
- 基礎や理論を大まかにでも正しく理解してPython開発したい読者
- 初学者Pythonプログラマー
- 新卒エンジニア
知らなきゃマズイ!?Python開発の10の知識
Q1 「Pythonはインタプリタ言語なので、実行速度が遅い」とはどういう意味でしょうか?
コンピュータでアプリケーションを動かすには、プログラムによるコンピュータへの指令が必要となります。しかし、コンピュータは0と1の単なる演算装置なので、ヒトにとって分かりやすい指示を直接理解することができず、機械語と呼ばれる機械が読み取りやすい形での指示でしか受けとることができません。
CやRustなどのコンパイラ言語と呼ばれるプログラミング言語では、「人が読みやすい指示を、機械が読みやすい指示に変換するコンパイルという作業」をプログラムが実行される前段階で行います。実行前にプログラム実行指示の翻訳作業を行なっておくことで、機械はマシンフレンドリーな指示を高速で読み取り、アプリケーションを実行することができます。
一方で、普段Pythonのプログラムを実行する際、コンパイルの作業を意識したことがあるでしょうか?
インタプリタ言語と呼ばれるPythonのような言語では、このコンパイル作業を事前には行わず、プログラムを実行する度に機械語へ都度翻訳しながら、コンピュータに指示を送ります。
既に日本語に翻訳済みのハリーポッターの書籍を読むのと、原著のまま逐一英日翻訳をしながら読むのではどちらの方が速く読めるでしょうか?
この違いがコンパイル言語とインタプリタ言語の違いです。
Pythonは手作業でのコンパイルが不要な分、実行速度が遅い点は開発を行う時点でしっかりと意識しておく必要があります。
Q2 ライブラリ・フレームワーク・パッケージ・モジュール・コンポーネントはどう違うのでしょうか?
Pythonの魅力の1つが、numpy, padas, polars, pytorch, langchainなど、AI系の豊富なライブラリがある点です。またdjangoやfastapiのようなwebフレームワークもたくさん存在しています。
ライブラリやフレームワークの実体は、フォルダによって階層分けされたコードファイルの集合体です。
この集合体を構成する要素の粒度として、「パッケージ/モジュール/コンポーネント」があります。
最も小さなプログラムの構成要素がコンポーネントです。コンポーネントは歯車のようなプログラムの実行部品であり、クラスや関数もコンポーネントに属します。
機能ごとにコンポーネントをまとめて、1つのpythonスクリプト(.py)としてまとめたものがモジュールとなります。外部のライブラリから特定の機能を読み込んで使う場合「from 〇〇 import モジュール名」のように、モジュール単位で機能を読み込むことが可能です。
さらに、もっと広い機能的な括りによって、複数の.pyファイルをフォルダによってまとめたものがパッケージになります。フォルダという包み紙で複数のファイルをラッピングしているようなイメージを持つと分かりやすいかと思います。
複数のフォルダによってまとめられたスクリプト群を、さらにフォルダの階層構造によってまとめた大きな道具箱がライブラリです。PyPIやGitHubなどではこのライブラリがたくさん公開されており、外部ライブラリとして欲しいものをインストールし、開発環境で利用することが可能です。
大きな要素から、これらの包含関係をまとめると下記のようになります。
ライブラリ ⊃ パッケージ ⊃ モジュール ⊃ コンポーネント
最後に、ライブラリとフレームワークの違いについてです。
これらの違いは「処理呼び出しの主体がどちらにあるか?」です。
ライブラリは道具箱のイメージの通り、さまざまな便利ツールを開発コード側が主体となって呼び出し利用します。
一方で、djangoのようなフレームワークはファイルやフォルダの構成要素としてはライブラリと同一ですが、コード呼び出しの主体はフレームワーク側です。
あくまでフレームワークという「型」が用意されており、その型に合わせる形で開発者がコードを実装します。すなわち、すでに一連の処理はフレームワーク内に実装しており、そのカスタマイズ部分のみを開発者が調整します。
Pythonで開発を行っていると、どの要素も日常的に耳にするので、ぜひ違いを理解しておきましょう。
Q3 仮想環境とは何でしょうか?なぜ仮想環境でのライブラリインストールが必要なのでしょうか?
Pythonにおける仮想環境とは、プロジェクトに応じて独立したPythonの実行環境を作成・切り替えできる仕組みのことです。
Pythonは現在も盛んに日々開発されている言語であり、また公開されているライブラリもバージョンの違いによって、互換性がなかったり、処理の書き方が変化していたりとバージョンの違いによってさまざまな変化があります。
そこで、Python開発者はアプリケーションを作る際、Pythonのバージョンやライブラリのバージョンを固定したくなると思いますが、1つのコンピュータで複数のプロジェクトを開発するとどうなるでしょうか?
プロジェクトAではPython3.12でnumpyが2.3系のバージョンを、プロジェクトBではPython3.13でnumpyが2.4系のバージョンを使いたい場合、共有の開発・実行環境を利用することはできません。
そこで、venvのような仮想環境を利用することで、pythonの実行バージョンやライブラリをプロジェクトごとに固定し、ライブラリのバージョンの依存関係などでプログラムが実行できなくなってしまうことを防ぎます。
近年では、uvというライブラリの依存関係を自動で解決してくれるパッケージマネージャーも登場し、プロジェクトごとのPython実行環境の管理が非常に楽になってきています。
Q4 Pythonのコードでよく見かける「if __name__ == "__main__":」とは何でしょうか?
__name__変数とはPythonの特殊変数で、モジュールの名前を保持します。この変数はモジュール(.pyっスクリプト)がどのように実行されるかによって値が変わります。
例えば、次のような足し算、引き算の関数を持つcalculator.pyスクリプトを実装した場合、スクリプトを直接実行する場合と別のスクリプトからインポートして使用する場合では、それぞれ下記のような値が格納されます。
# calculator.py
def add(a:int, b:int)->int:
"""
整数同士の足し算を行う関数
"""
return a + b
def subtract(a:int, b:int)->int:
"""
整数同士の引き算を行う関数
"""
return a - b
def main():
"""
簡易テスト
"""
print("テスト実行中...")
assert add(2, 3) == 5
assert subtract(10, 5) == 5
print("すべてのテストが成功!")
if __name__ == "__main__":
main()
スクリプトとして直接実行
$ python calculator.py
__name__ の値は__main__となり、main()関数が実行される。
cli.pyからモジュールとしてインポート
# cli.py
import calculator
print(add(1, 4))
$ python main.py
__name__ の値は__main__となり、calculatorのmain()関数は実行されない。
Q5 JSONとは何ですか?
JSON(JavaScript Object Notation)とは、データを保存・交換するための軽量なテキスト形式のデータ構造です。
ヒトが読みやすく、かつ入れ子状のデータ構造も完結に記載できるため、現代的なWebAPIではJSONがデータを運ぶ入れ物として広く採用されています。
JSONには次のようなメリットがあります。
- 可読性が高い - 人間が読める
- 軽量 - XMLより簡潔
- 言語非依存 - どの言語でも扱える
- Web標準 - REST APIの標準フォーマット
一方で下記のような制約もあるので覚えておきましょう。
- コメントが書けない
- 日付型がない - 文字列で表現
- バイナリデータは扱えない - Base64エンコードが必要
- 循環参照は不可
Q6 Pythonにおける並列処理、マルチプロセス、マルチスレッドの違いを説明できますか?
並列処理はハードウェアの能力が向上し、使用可能なリソースが大きくなった現代のコンピュータではごく当たり前に使われています。単一のPythonスクリプトからでも、実装の仕方によって一部の処理を並列で走らせることが可能であり、上手く利用することでアプリケーションの応答速度やシステムの処理速度を速めることができます。
まず、並列処理を理解するために「プロセス」と「スレッド」の違いを押さえましょう。
プロセスとは、実行中のプログラムそのものを指します。プロセスはそれぞれ独立したメモリ空間を持ち、他のプロセスとは隔離されています。例えるなら、別々の部屋で作業する人たちのようなものです。
スレッドとは、プロセス内で実行される処理の単位です。同一プロセス内の複数のスレッドはメモリ空間を共有します。例えるなら、同じ部屋で複数の作業を同時進行させるようなイメージです。
マルチプロセス
マルチプロセスは、複数のプロセスを立ち上げて処理を並列実行する方法です。各プロセスが独立したメモリ空間を持つため、CPU負荷の高い計算処理(数値計算、画像処理など)に向いています。
from multiprocessing import Pool
def heavy_calculation(x):
return x ** 2
if __name__ == "__main__":
with Pool(processes=4) as pool:
results = pool.map(heavy_calculation, range(10))
print(results)
マルチスレッド
マルチスレッドは、1つのプロセス内で複数のスレッドを立ち上げて処理を並列実行する方法です。I/O待ち(ファイル読み書き、ネットワーク通信など)が多い処理に向いています。
import threading
import time
def fetch_data(url):
print(f"Fetching {url}...")
time.sleep(1) # I/O待ちをシミュレート
print(f"Done: {url}")
threads = []
urls = ["https://api1.example.com", "https://api2.example.com"]
for url in urls:
t = threading.Thread(target=fetch_data, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
PythonのGIL(Global Interpreter Lock)
PythonにはGILという仕組みがあり、同一プロセス内では一度に1つのスレッドしかPythonコードを実行できません。これはPythonのメモリ管理を安全に行うための制約です。
そのため、CPU負荷の高い処理をマルチスレッドで実行しても、期待したほど速くならないことがあります。CPU負荷の高い処理にはマルチプロセス、I/O待ちが多い処理にはマルチスレッドを使い分けることがポイントです。
| 特徴 | マルチプロセス | マルチスレッド |
|---|---|---|
| メモリ空間 | 独立 | 共有 |
| GILの影響 | 受けない | 受ける |
| 適した処理 | CPU負荷が高い処理 | I/O待ちが多い処理 |
| オーバーヘッド | 大きい | 小さい |
Q7 GitとGitHubの違いは何ですか?
開発現場では「Gitにプッシュして」「GitHubでプルリク出して」といった会話が日常的に飛び交いますが、GitとGitHubは別物です。
Gitは、ソースコードの変更履歴を記録・管理するための「バージョン管理システム」です。Gitを使うことで、「いつ」「誰が」「どのような変更を加えたか」を追跡でき、過去の状態に戻したり、複数人で同時に開発を進めたりすることが可能になります。Gitはローカル環境(自分のPC)だけでも利用できます。
GitHubは、Gitリポジトリをインターネット上でホスティングする「Webサービス」です。GitHubを利用することで、チームメンバーとコードを共有したり、プルリクエストを通じてコードレビューを行ったり、Issueで課題管理をしたりと、チーム開発に必要な機能が揃っています。
両者の関係を例えるなら、Gitは「日記を書くためのノート」、GitHubは「そのノートを保管・共有できるクラウドサービス」のようなものです。
【Gitの基本コマンド】
$ git init # リポジトリを初期化
$ git add . # 変更をステージング
$ git commit -m "メッセージ" # 変更を記録
$ git switch # ブランチの切り替え、2019年~追加
$ git push # リモートに送信
$ git pull # リモートから取得
なお、GitHub以外にもGitLabやBacklogGitといった類似サービスがあります。いずれもGitをベースとしたホスティングサービスですので、Gitの基本操作を覚えておけばどのサービスでも応用が利きます。
Q8 「.gitignore」はどう使えば良いのでしょうか?
.gitignoreは、Gitのバージョン管理対象から除外したいファイルやフォルダを指定するための設定ファイルです。
開発を行っていると、「ソースコードとしては管理したくないけれど、ローカル環境には必要なファイル」が出てきます。例えば次のようなものです。
- 環境変数ファイル(.env):APIキーやパスワードなどの機密情報
- 仮想環境フォルダ(venv/):容量が大きく、環境ごとに再構築すべきもの
- キャッシュファイル(pycache/):Pythonが自動生成する中間ファイル
- IDE設定ファイル(.vscode/、.idea/):個人の開発環境設定
- ビルド成果物(dist/、build/):ソースから生成されるファイル
これらをGitで管理してしまうと、機密情報の漏洩や不要なコンフリクトの原因となります。
特にAPIキーや環境情報を記載した.envファイルを、パブリックリポジトリで一瞬公開してしまうだけでも、悪意のあるユーザーに不正利用され、莫大な損失を被る場合があります。
くれぐれも注意しましょう。
.gitignoreの書き方
プロジェクトのルートディレクトリに.gitignoreファイルを作成し、除外したいパターンを記述します。
*はワイルドカードとして任意の文字列にマッチし、/で終わる場合はディレクトリを指定します。
環境変数(機密情報)
.env
.env.local
仮想環境
venv/
.venv/
Pythonキャッシュ
pycache/
*.pyc
*.pyo
IDE設定
.vscode/
.idea/
ビルド成果物
dist/
build/
*.egg-info/
OS生成ファイル
.DS_Store
Thumbs.db
なお、Python開発では、GitHubが公開しているhttps://github.com/github/gitignore/blob/main/Python.gitignore を参考にすると、漏れなく設定できて便利です。
Q9 TCP/IPとは何ですか?
TCP/IPは、インターネット通信の基盤となる通信プロトコル(通信規約)の集まりです。Webアプリケーション開発やAPI連携を行う際、TCP/IPの基本を理解しておくと、ネットワーク関連のトラブルシューティングに役立ちます。
TCP/IPは階層構造になっており、それぞれの層が異なる役割を担っています。
| 層 | 名称 | 役割 | 代表的なプロトコル |
|---|---|---|---|
| 4 | アプリケーション層 | アプリケーション間の通信 | HTTP, HTTPS, FTP, SMTP |
| 3 | トランスポート層 | データの信頼性を担保 | TCP, UDP |
| 2 | インターネット層 | ネットワーク間のルーティング | IP |
| 1 | ネットワークインターフェース層 | 物理的な通信 | Ethernet, Wi-Fi |
TCPとUDPの違い
トランスポート層のプロトコルとして、TCPとUDPがあります。
TCP(Transmission Control Protocol)は、データの到達を保証する信頼性の高いプロトコルです。データが届いたかどうかを確認し、届かなければ再送します。Webブラウジングやメール送信など、データの欠落が許されない通信に使われます。
UDP(User Datagram Protocol)は、データの到達を保証しない代わりに高速なプロトコルです。動画ストリーミングやオンラインゲームなど、多少のデータ欠落よりもリアルタイム性が重視される通信に使われます。
PythonでのHTTP通信
Pythonではrequestsライブラリを使って簡単にHTTP通信(TCP/IPのアプリケーション層)を行えます。
import requests
# GETリクエスト
response = requests.get("https://api.example.com/users")
print(response.status_code) # 200
print(response.json()) # JSONレスポンスを辞書に変換
# POSTリクエスト
data = {"name": "太郎", "email": "taro@example.com"}
response = requests.post("https://api.example.com/users", json=data)
Web開発を行う上で、HTTP通信の仕組みやステータスコード(200: 成功、404: 見つからない、500: サーバーエラーなど)を理解しておくことは非常に重要です。
Q10 SOLID原則を知っていますか?
SOLID原則は、オブジェクト指向プログラミングにおける5つの設計原則の頭文字を取ったものです。これらの原則に従うことで、保守性が高く、拡張しやすいコードを書くことができます。
Pythonはオブジェクト指向言語であり、クラスを使った設計を行う機会も多いため、SOLID原則を知っておくと設計の質が向上します。
S - 単一責任の原則(Single Responsibility Principle)
1つのクラスは1つの役割的責任だけを持つべきという原則です。
# 悪い例:1つのクラスが複数の責任を持つ
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def save_to_database(self): # データベース操作
pass
def send_email(self): # メール送信
pass
# 良い例:責任を分離
class User:
def __init__(self, name, email):
self.name = name
self.email = email
class UserRepository:
def save(self, user):
pass
class EmailService:
def send(self, user):
pass
O - 開放閉鎖の原則(Open/Closed Principle)
拡張に対して開いており、修正に対して閉じているべきという原則です。新機能を追加する際に、既存コードを修正せずに拡張できる設計を目指します。
L - リスコフの置換原則(Liskov Substitution Principle)
派生クラスは基底クラスと置換可能であるべきという原則です。子クラスは親クラスの振る舞いを壊してはいけません。
I - インターフェース分離の原則(Interface Segregation Principle)
クライアントが使わないメソッドへの依存を強制すべきではないという原則です。大きなインターフェースより、小さく特化したインターフェースを複数用意する方が良いとされています。
D - 依存性逆転の原則(Dependency Inversion Principle)
上位モジュールは下位モジュールに依存すべきではなく、両者とも抽象に依存すべきという原則です。
# 悪い例:具体的な実装に依存
class OrderService:
def __init__(self):
self.email_sender = GmailSender() # 具体クラスに依存
# 良い例:抽象に依存
from abc import ABC, abstractmethod
class EmailSender(ABC):
@abstractmethod
def send(self, message):
pass
class OrderService:
def __init__(self, email_sender: EmailSender): # 抽象に依存
self.email_sender = email_sender
SOLID原則は一朝一夕で身につくものではありませんが、意識してコードを書くことで徐々に設計力が向上していきます。まずは単一責任の原則から意識してみると良いでしょう。
まとめ
本記事では、Python開発で最低限知っておきたい基礎知識を10個紹介しました。
- インタプリタ言語の特性 - コンパイルと実行速度の関係
- ライブラリ・フレームワーク等の違い - 各概念の包含関係と使い分け
- 仮想環境の重要性 - プロジェクトごとの環境分離
- if name == "main":の意味 - スクリプトとモジュールの使い分け
- JSONの基礎 - 現代Web開発の標準データ形式
- 並列処理の理解 - マルチプロセスとマルチスレッドの使い分け
- GitとGitHubの違い - バージョン管理とホスティングサービス
- .gitignoreの活用 - 機密情報や不要ファイルの除外
- TCP/IPの基礎 - ネットワーク通信の仕組み
- SOLID原則 - 保守性の高い設計指針
これらの知識は、Pythonに限らずソフトウェア開発全般で活きるものばかりです。AIエージェントにコードを書かせる時代だからこそ、生成されたコードの品質を評価し、適切な指示を出せるよう、基礎知識をしっかり身につけておきましょう。
最後まで読んでいただき、ありがとうございました!
参考資料
- 入門 Python 3 第2版、オライリー・ジャパン、Bill Lubanovic (著), 鈴木駿 (著), 長尾高弘 (著)
- VTuberサプーが教える! Python 初心者のコード/プロのコード、技術評論社、サプー(著)
- マスタリングTCP/IP 入門編(第6版)、オーム社、井上 直也 (著), 村山 公保 (著), 竹下 隆史 (著), 荒井 透 (著), 苅田 幸雄 (著)
- https://docs.python.org/ja/3/
- https://github.com/github/gitignore
- https://github.com/astral-sh/uv