この記事の要点
• リスト内包表記とf-stringがPythonの書き方の基本
• with文でファイル操作、try/exceptで例外処理
• dataclassとpathlibでモダンなPythonコードを書く
基本構文
変数と型
| コード | 説明 |
|---|---|
name = "Alice" | 文字列の変数 |
age = 25 | 整数の変数 |
price = 19.99 | 浮動小数点の変数 |
is_active = True | 真偽値の変数 |
type(name) | 型を確認 |
int("42") | 文字列を整数に変換 |
str(42) | 数値を文字列に変換 |
float("3.14") | 文字列を浮動小数点に変換 |
bool(1) | 数値を真偽値に変換 |
list("abc") | 文字列をリストに変換 |
文字列
| コード | 説明 |
|---|---|
f"Hello, {name}!" | f-string(推奨) |
"Hello, {}!".format(name) | format メソッド |
"Hello, %s!" % name | % 演算子 |
s.upper() | 大文字に変換 |
s.lower() | 小文字に変換 |
s.capitalize() | 先頭を大文字に |
s.title() | 各単語の先頭を大文字に |
s.strip() | 空白を除去 |
s.split() | 空白で分割 |
s.replace("l", "L") | 文字列を置換 |
s.startswith("h") | 先頭文字を判定 |
s.endswith("d") | 末尾文字を判定 |
"o" in s | 文字列に含まれるか判定 |
s[0] | 最初の文字 |
s[-1] | 最後の文字 |
s[0:5] | スライス(0-4) |
s[::2] | 2文字おきに取得 |
s[::-1] | 逆順 |
ポイント: f-string(f"Hello, {name}!")が最もPythonic。.format()や%よりも読みやすく高速です。
リスト
| コード | 説明 |
|---|---|
items = [1, 2, 3, 4, 5] | リストを作成 |
items = list(range(1, 6)) | range からリストを作成 |
items.append(6) | 末尾に追加 |
items.insert(0, 0) | 位置指定で追加 |
items.extend([7, 8]) | リストを結合 |
items.pop() | 末尾を削除して返す |
items.pop(0) | 位置指定で削除 |
items.remove(3) | 値指定で削除 |
items.index(2) | 値のインデックス |
items.count(2) | 値の出現回数 |
items.sort() | ソート(破壊的) |
items.reverse() | 逆順(破壊的) |
sorted(items) | ソート(非破壊的) |
len(items) | 長さ |
items[1:3] | スライス |
items[::2] | 2つおきに取得 |
items[-3:] | 最後の3つ |
[x**2 for x in range(10)] | リスト内包表記(二乗) |
[x for x in range(10) if x % 2 == 0] | リスト内包表記(フィルタ) |
[[i*j for j in range(3)] for i in range(3)] | ネストしたリスト内包表記 |
実践メモ: リスト内包表記([x**2 for x in range(10)])はforループより簡潔で高速。フィルタ条件もifで追加できます。
辞書
| コード | 説明 |
|---|---|
user = {"name": "Alice", "age": 25} | 辞書を作成 |
user = dict(name="Alice", age=25) | dict() で作成 |
user["email"] = "alice@example.com" | 追加/更新 |
user.get("name") | 値を取得 |
user.get("phone", "N/A") | デフォルト値付きで取得 |
user.keys() | キー一覧 |
user.values() | 値一覧 |
user.items() | キーと値のペア |
user.pop("age") | 削除して返す |
user.update({"city": "Tokyo"}) | 辞書をマージ |
"name" in user | キーの存在確認 |
{x: x**2 for x in range(5)} | 辞書内包表記 |
セット
| コード | 説明 |
|---|---|
s = {1, 2, 3} | セットを作成 |
s = set([1, 2, 2, 3]) | リストからセットを作成(重複除去) |
s.add(4) | 要素を追加 |
s.remove(1) | 削除(なければエラー) |
s.discard(1) | 削除(なくてもOK) |
s.pop() | ランダムに削除 |
a | b | 和集合 |
a & b | 積集合 |
a - b | 差集合 |
a ^ b | 対称差 |
注意: 辞書のキーアクセスはdict["key"]だとKeyErrorが発生します。.get("key", default)を使えばデフォルト値を返せて安全です。
制御構文
条件分岐
if x > 0:
print("positive")
elif x < 0:
print("negative")
else:
print("zero")
# 三項演算子
result = "even" if x % 2 == 0 else "odd"
# match文(Python 3.10+)
match status:
case "pending":
print("保留中")
case "approved":
print("承認済み")
case _:
print("不明")
ループ
# for
for i in range(5):
print(i)
for item in items:
print(item)
for i, item in enumerate(items):
print(i, item)
for key, value in user.items():
print(key, value)
# while
while condition:
# 処理
if should_break:
break
if should_skip:
continue
関数
# 基本
def greet(name: str) -> str:
return f"Hello, {name}!"
# デフォルト引数
def greet(name: str = "World") -> str:
return f"Hello, {name}!"
# 可変長引数
def sum_all(*args):
return sum(args)
def create_user(**kwargs):
return kwargs
# ラムダ
square = lambda x: x ** 2
sorted(items, key=lambda x: x["name"])
クラス
from dataclasses import dataclass
from typing import Optional
# 通常のクラス
class User:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def greet(self) -> str:
return f"Hello, {self.name}!"
# dataclass(推奨)
@dataclass
class User:
name: str
age: int
email: Optional[str] = None
def greet(self) -> str:
return f"Hello, {self.name}!"
ポイント: 型ヒント(def greet(name: str) -> str:)を使うとIDEの補完が効き、コードの意図も明確になります。
実践メモ: @dataclassを使えばクラス定義が大幅に簡潔に。__init__、__repr__、__eq__が自動生成されます。
ファイル操作
| コード | 説明 |
|---|---|
with open("file.txt", "r", encoding="utf-8") as f: content = f.read() | ファイルを読み込み |
with open("file.txt", "r", encoding="utf-8") as f: lines = f.readlines() | 全行を読み込み |
with open("file.txt", "w", encoding="utf-8") as f: f.write("Hello, World!") | ファイルに書き込み |
import json | JSON モジュールをインポート |
with open("data.json", "r") as f: data = json.load(f) | JSON ファイルを読み込み |
with open("data.json", "w") as f: json.dump(data, f, indent=2, ensure_ascii=False) | JSON ファイルに書き込み |
例外処理
| コード | 説明 |
|---|---|
try: | 例外が発生する可能性のあるコード |
except ZeroDivisionError: | 特定の例外をキャッチ |
except Exception as e: | 全ての例外をキャッチ |
else: | 例外が発生しなかった場合に実行 |
finally: | 常に実行 |
raise ValueError("無効な値です") | 例外を発生させる |
注意: ファイル操作は必ずwith文を使いましょう。with open(...) as f:なら例外発生時も自動でファイルがクローズされます。encoding="utf-8"も忘れずに。
よく使うモジュール
| コード | 説明 |
|---|---|
from pathlib import Path | Path モジュールをインポート |
path = Path("dir/file.txt") | パスオブジェクトを作成 |
path.exists() | パスの存在確認 |
path.is_file() | ファイルか判定 |
path.read_text() | ファイルを読み込み |
path.write_text("content") | ファイルに書き込み |
path.parent | 親ディレクトリ |
path.stem | 拡張子なしファイル名 |
from datetime import datetime, timedelta | 日時モジュールをインポート |
now = datetime.now() | 現在日時を取得 |
now.strftime("%Y-%m-%d %H:%M:%S") | 日時を文字列に変換 |
datetime.strptime("2025-01-10", "%Y-%m-%d") | 文字列を日時に変換 |
now + timedelta(days=7) | 日時を加算 |
import re | 正規表現モジュールをインポート |
re.match(r"\d+", "123abc") | 先頭からマッチ |
re.search(r"\d+", "abc123") | 文字列全体から検索 |
re.findall(r"\d+", "a1b2c3") | 全てのマッチを取得 |
re.sub(r"\d+", "X", "a1b2") | 置換 |
import requests | requests モジュールをインポート |
res = requests.get("https://api.example.com/data") | HTTP GET リクエスト |
res.json() | レスポンスを JSON にパース |
requests.post(url, json={"key": "value"}) | HTTP POST リクエスト |
参考リソース
- Python 3 Documentation - Python 公式ドキュメント
- Python Language Reference - 言語仕様
- Python Standard Library - 標準ライブラリリファレンス
- Python Tutorial - 公式チュートリアル
- PEP 8 - Style Guide - コーディング規約
関連記事
- Python環境構築 - 環境設定
- FastAPI入門 - Web API
- データ分析入門 - pandas/numpy