この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: 文法
SEOタイトル: Python 文法の基礎完全ガイド — 変数・型・制御フロー・関数・クラス

この記事の要点
  • Python は インデントでブロックを表す動的型付け言語。 PEP 8 に従い 4 スペース推奨
  • 基本型: int / float / str / bool / list / tuple / dict / set / None
  • 制御フロー: if / elif / elsefor ... inwhilebreak / continue、 内包表記
  • 関数: def / lambda、 デフォルト引数、 キーワード引数、 *args / **kwargs、 type hints (3.5+)
  • 文字列フォーマットは f-string (3.6+) が最速かつ可読性高い。 リソース管理は with

Python 文法の特徴

Python は シンプルで読みやすい構文を最大の特徴とする言語です。 C 系言語の { } によるブロック表現ではなく、インデント(字下げ)でブロックを表現します。

# Hello World
print("Hello, World!")

# 変数(型宣言不要)
name = "Taro"
age = 30
pi = 3.14
is_active = True

# 型ヒント(推奨、Python 3.5+)
def greet(name: str, age: int) -> str:
    return f"{name} ({age} 歳) こんにちは"

print(greet("Hanako", 25))

基本データ型

用途ミュータブル
int42整数(多倍長精度)不可
float3.14倍精度浮動小数点不可
str"hello"Unicode 文字列不可
boolTrue / False真偽値不可
list[1, 2, 3]順序付きの可変配列
tuple(1, 2, 3)順序付きの不変配列不可
dict{"a": 1}キー/値マップ
set{1, 2, 3}重複なし集合
NoneNone値なし-
# リスト操作
fruits = ["apple", "banana", "cherry"]
fruits.append("orange")
fruits[0] = "grape"
print(fruits[1:3])         # ['banana', 'cherry']
print(len(fruits))         # 4

# 辞書
user = {"name": "Taro", "age": 30}
user["email"] = "taro@example.com"
print(user.get("phone", "未登録"))

# タプル(イミュータブル)
point = (10, 20)
x, y = point               # アンパック

# セット(集合演算)
a = {1, 2, 3}
b = {2, 3, 4}
print(a & b)               # {2, 3} 積集合
print(a | b)               # {1, 2, 3, 4} 和集合
print(a - b)               # {1} 差集合

演算子

分類演算子
算術+ - * / // % **7 // 2 = 3、2 ** 10 = 1024
比較== != < > <= >=a == b
論理and or notx > 0 and x < 10
所属in / not in"a" in ["a","b"]
同一性is / is notx is None
代入= += -= *= /=cnt += 1
セイウチ:= (3.8+)if (n := len(a)) > 10:

制御フロー

# if / elif / else
score = 85
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "D"

# for ループ
for i in range(5):           # 0 から 4
    print(i)

for fruit in ["apple", "banana"]:
    print(fruit)

for i, fruit in enumerate(["apple", "banana"]):
    print(i, fruit)

# while
n = 0
while n < 5:
    n += 1
    if n == 3:
        continue            # スキップ
    if n == 4:
        break               # 抜ける
    print(n)

# リスト内包表記(Pythonic)
squares = [x ** 2 for x in range(10)]
evens = [x for x in range(20) if x % 2 == 0]

# 辞書内包表記
sq_dict = {x: x ** 2 for x in range(5)}

# match 文 (3.10+)
def http_status(code: int) -> str:
    match code:
        case 200: return "OK"
        case 404: return "Not Found"
        case 500: return "Server Error"
        case _:   return "Unknown"

関数 (def / lambda)

# 基本
def add(a: int, b: int) -> int:
    return a + b

# デフォルト引数
def greet(name: str, msg: str = "Hello") -> str:
    return f"{msg}, {name}!"

greet("Taro")                  # Hello, Taro!
greet("Taro", msg="Hi")        # キーワード引数

# 可変長引数
def total(*args: int) -> int:
    return sum(args)
total(1, 2, 3, 4)              # 10

# キーワード可変長
def config(**kwargs):
    for k, v in kwargs.items():
        print(f"{k} = {v}")
config(host="localhost", port=8080)

# lambda(無名関数)
double = lambda x: x * 2
print(double(5))               # 10

# 高階関数
nums = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, nums))
evens = list(filter(lambda x: x % 2 == 0, nums))

クラス

class User:
    """ユーザクラス"""

    # クラス変数
    count = 0

    def __init__(self, name: str, age: int):
        # インスタンス変数
        self.name = name
        self.age = age
        User.count += 1

    def greet(self) -> str:
        return f"こんにちは、{self.name} です"

    def __str__(self) -> str:
        return f"User({self.name})"

    @classmethod
    def total(cls) -> int:
        return cls.count

    @staticmethod
    def is_adult(age: int) -> bool:
        return age >= 18

# 継承
class AdminUser(User):
    def __init__(self, name: str, age: int, level: int):
        super().__init__(name, age)
        self.level = level

    def greet(self) -> str:
        return f"管理者 {self.name} (Lv.{self.level})"

# dataclass (3.7+) — ボイラープレート削減
from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float = 0.0

p = Point(1.0, 2.0)
print(p)                       # Point(x=1.0, y=2.0)

f-string と文字列操作

name = "Taro"
age = 30
pi = 3.14159

# f-string (3.6+) — 推奨
s1 = f"{name} は {age} 歳"
s2 = f"円周率は {pi:.2f}"      # 小数点 2 桁
s3 = f"{age:>5d}"              # 右寄せ 5 桁
s4 = f"{age:0>5d}"             # ゼロ埋め: 00030

# 古い書き方
s5 = "{} は {} 歳".format(name, age)
s6 = "%s は %d 歳" % (name, age)

# 主要メソッド
"Hello".upper()                # "HELLO"
"  abc  ".strip()              # "abc"
"a,b,c".split(",")             # ["a","b","c"]
",".join(["a","b","c"])        # "a,b,c"
"hello".replace("l", "L")      # "heLLo"
"abc".startswith("ab")         # True

例外処理と with 文

# try / except / finally
try:
    n = int(input())
    result = 10 / n
except ZeroDivisionError:
    print("0 で割れません")
except ValueError as e:
    print(f"数値変換エラー: {e}")
except Exception as e:
    print(f"その他: {e}")
else:
    print(f"成功: {result}")
finally:
    print("必ず実行")

# with 文(リソース自動解放)
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()
# f.close() 不要

# 複数 with
with open("in.txt") as fin, open("out.txt", "w") as fout:
    fout.write(fin.read())

PEP 8 (公式スタイルガイド)

  • インデントは スペース 4 個(タブ禁止)
  • 1 行 79 文字以内(docstring 72 文字)
  • 変数・関数は snake_case、クラスは PascalCase、定数は UPPER_CASE
  • import は 標準ライブラリ → サードパーティ → 自作の順
  • 関数の間は 2 行空ける、メソッドの間は 1 行
  • black / ruff 等の formatter で自動整形が現代的

FAQ

Q: なぜインデントで構文を表すのか?
A: 「読みやすいコード = 動くコード」の哲学。{ } 不要で視覚的に構造がわかります。

Q: 型ヒントは必須?
A: 任意ですが、規模が大きくなるほど推奨mypy / pyright で静的解析できます。

Q: print デバッグから抜けたい
A: logging モジュール、pdb(標準デバッガ)、VS Code のデバッガを使いましょう。