🐍 わくわくPython入門

このサイトは、Pythonの基礎からオブジェクト指向やミニプロジェクトまで、コードの行ごとに丁寧な解説を付けて学べる点が魅力です。
白を基調としたシンプルで見やすいデザインと、コピー可能なコードブロックで実践的に学習できるのも大きな特徴です。

print と 型

# 文字列
print("こんにちは")

# 数字(整数・小数)
print(10)
print(3.14)

# ブール値
print(True, False)

# 型の確認
print(type("abc"), type(10), type(3.14), type(True))
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. print("こんにちは"):画面に文字列("こんにちは")を表示します。文字列はシングルかダブルクオートで囲みます。
  2. print(10):整数 10 を表示します。数値はクォートで囲みません。
  3. print(3.14):浮動小数点数(小数)を表示します。
  4. print(True, False):複数の値をカンマで区切って渡すとスペースで区切って表示されます。ここではブール値を表示。
  5. print(type(...))type() はオブジェクトの型を返し、デバッグや確認に使います。

よくある間違い: 文字列と数値を混ぜて演算しようとするとエラーになります(例: "10" + 5)。数値に変換するには int("10") を使います。

変数と代入

# 代入
x = 10
name = "Toma"
pi = 3.14159
flag = True

print(x, name, pi, flag)

# 複数代入
a, b = 1, 2
print(a, b)

# 値の更新
x = x + 5  # 古典的
x += 5     # 便利な短縮形
print(x)
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. x = 10:変数 x に整数 10 を代入。左が変数名、右が値です。
  2. name = "Toma":文字列を代入。
  3. pi = 3.14159:浮動小数点を代入。
  4. flag = True:ブール値を代入。
  5. print(x, name, ...):複数の変数を一度に表示(カンマで区切ると自動でスペースが入る)。
  6. a, b = 1, 2:複数代入。右側の値が左側の変数へ順に代入されます。
  7. x = x + 5:現在の x に 5 を足して再代入。
  8. x += 5:上の操作の省略形(インプレース演算子)。

ポイント: 変数名は意味が分かるものにしましょう。数字で始めない、予約語を避ける、といった基本ルールを守ると読みやすくなります。

入力と出力

name = input("名前を入力してください: ")
age_str = input("年齢を入力してください: ")
# 入力は常に文字列なので数値に変換する
age = int(age_str)

print(f"こんにちは、{name} さん。{age}歳ですね。")
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. name = input("..."):プロンプトを出してユーザーの入力を受け取り、文字列として name に保存します。
  2. age_str = input("..."):同様に入力を文字列として受け取ります。注意:input() は常に文字列を返します。
  3. age = int(age_str):文字列を整数に変換します。ユーザーが数値以外を入力すると例外(ValueError)が発生するので通常は try/except で保護します。
  4. print(f"..."):f-string を使って変数を文字列内に埋め込み、整形して表示します。

実務上の注意:ユーザー入力は信頼できないデータです。必ず検証とエラーハンドリングを行ってください。

演算・比較・論理

# 四則演算
print(5 + 3, 5 - 3, 5 * 3, 5 / 2, 5 // 2, 5 % 2, 2 ** 3)

# 比較
print(5 > 3, 5 == 4, 5 != 4)

# 論理演算
print(True and False, True or False, not True)
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. +, -, *:加算・減算・乗算。
  2. /:除算。結果は常に浮動小数点(2/1 -> 2.0)。
  3. //:整数除算(切り捨て)。
  4. %:剰余(余り)。
  5. **:べき乗。
  6. 比較演算(== など)は真偽値を返し、論理演算(and, or, not)で複合条件を扱います。

条件分岐とループ

# if / elif / else
x = 10
if x > 0:
    print("正の数")
elif x == 0:
    print("ゼロ")
else:
    print("負の数")
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. x = 10:変数に値を代入。
  2. if x > 0::条件が True のときに次のインデント行を実行します。条件にはコロンが必要です。
  3. Python ではインデント(スペース)でブロックを表します。一般にスペース4つを推奨します。
  4. elif は "それ以外でさらに条件"、else はどれにも当てはまらない場合に実行されます。
# for ループ
for i in range(5):
    print(i)  # 0 1 2 3 4

# while ループ
n = 5
while n > 0:
    print(n)
    n -= 1
詳しい行単位解説(クリックで展開)
  1. for i in range(5)::0 から 4 まで順に i に代入してループします。
  2. while n > 0::条件が True の間ループが続きます。条件を変化させないと無限ループになります。
  3. n -= 1n = n - 1 の短縮形。ループを終わらせるために使います。

関数(詳細)

def greet(name):
    """引数 name を受け取り挨拶文を返す関数"""
    return f"こんにちは、{name}さん!"

print(greet("Toma"))

# デフォルト引数、キーワード引数
def add(a, b=10):
    return a + b

print(add(5), add(5, b=2))
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. def greet(name)::関数の定義を開始します。def の後に関数名と引数を記述し、最後にコロンを置きます。
  2. """...""":docstring(説明文)。関数の目的や引数、戻り値を記述しておくと後で便利です。
  3. return ...:呼び出し元に値を返します。ここでは文字列を返しています。
  4. print(greet("Toma")):関数を呼び出し、返り値を表示します。
  5. def add(a, b=10)::引数 b にデフォルト値を与えた例。呼び出し時に省略可能です。
  6. キーワード引数(add(5, b=2))で引数名を指定して渡すと可読性が上がります。

注意: 関数内でグローバル変数を直接書き換えると副作用が発生しやすく、バグの原因になります。可能な限り引数と戻り値でデータを受け渡しましょう。

リスト・タプル・辞書・集合

# リスト: 変更可 (mutable)
fruits = ["apple", "banana", "cherry"]
fruits.append("orange")
print(fruits)

# タプル: 変更不可 (immutable)
coords = (10, 20)
print(coords)

# 辞書: key -> value
person = {"name":"Toma", "age":18}
print(person["name"])  # Toma

# 集合: 重複を排除
s = {1,2,2,3}
print(s)
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. fruits = [...]:角括弧でリストを作成します。要素の追加・削除ができます。
  2. fruits.append(...):リストの末尾に要素を追加します。
  3. coords = (10,20):丸括弧でタプルを作成。変更不可なので不変データに向いています。
  4. person = {...}:辞書はキーと値の対応。キーで高速に値を取り出せます。
  5. s = {1,2,2,3}:集合は重複を自動で排除します。

モジュールと標準ライブラリ

import math
print(math.pi)
print(math.sqrt(16))

import random
print(random.randint(1, 10))
詳しい行単位解説(クリックで展開)
  1. import math:math モジュールを読み込みます。モジュール名をプレフィックスにして中の要素にアクセスします。
  2. math.pi:円周率の定数。
  3. math.sqrt(16):平方根を計算。
  4. import random:乱数モジュールの読み込み。
  5. random.randint(1,10):1〜10 のランダム整数を返します。

補足: from math import sqrt のようにすると関数を直接呼び出せますが、名前衝突に注意してください。

ファイル入出力

# 書き込み
with open('sample.txt', 'w', encoding='utf-8') as f:
    f.write('こんにちは
')

# 読み込み
with open('sample.txt', 'r', encoding='utf-8') as f:
    text = f.read()
print(text)
詳しい行単位解説(クリックで展開)
  1. with open(..., 'w') as f::ファイルを開いて f にファイルオブジェクトを割り当て、ブロック終了時に自動で閉じます。
  2. f.write(...):ファイルに文字列を書き込みます(改行は自分で入れる)。
  3. with open(..., 'r') as f::読み込みモードで開きます。
  4. text = f.read():ファイルの全内容を文字列として読み込みます。大きなファイルは逐次処理を検討してください。

オブジェクト指向(徹底解説)

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return f"{self.name}: ワン!"

# インスタンス化
pochi = Dog('Pochi', 3)
print(pochi.bark())
print(pochi.age)
詳しい行単位解説(クリックで展開)
概念(ざっくり)

クラスは《設計図》、インスタンスは《その設計図から作られた具体物》です。属性はインスタンスごとのデータ、メソッドはそれに対する操作です。

行ごとの解説
  1. class Dog::Dog という名前のクラスを定義します。クラス名は慣習的に先頭大文字。
  2. def __init__(self, name, age)::コンストラクタ。インスタンス生成時に実行され、初期値を受け取ります。self はそのインスタンス自身を指します。
  3. self.name = name:インスタンスの属性 name に引数の値を保存します。異なるインスタンスがそれぞれ異なる属性値を持てます。
  4. def bark(self)::インスタンスメソッド。メソッドの第1引数は常に self(暗黙的にインスタンスが渡る)。
  5. pochi = Dog('Pochi', 3):クラスからインスタンスを作る(インスタンス化)。この時点で __init__ が実行され属性が設定されます。
  6. pochi.bark():インスタンスのメソッドを呼び出します。内部で selfpochi を指します。

Q&A: __init__ と self は何をしたいの?
- __init__ は「そのインスタンスがどういうデータを持つべきか」を定義して初期化するための関数です。
- self は「このメソッドを呼んでいるそのインスタンス」を表すための名前で、インスタンスごとの値(属性)を参照・更新するために必要です。

ミニプロジェクト — 単語カウントツール

def word_count(text):
    words = text.split()
    counts = {}
    for w in words:
        w = w.strip().lower()
        counts[w] = counts.get(w, 0) + 1
    return counts

if __name__ == '__main__':
    sample = 'Python is great. Python is easy.'
    print(word_count(sample))
詳しい行単位解説(クリックで展開)
行ごとの解説
  1. def word_count(text)::関数定義。テキストを渡して解析結果を返します。
  2. words = text.split():空白で分割して単語リストを作る。句読点は残るので必要なら前処理が必要。
  3. counts = {}:単語と出現回数を保存する辞書を作る。
  4. for w in words::各単語を順に処理。
  5. w = w.strip().lower():空白を取り、すべて小文字にして同一視しやすくする。
  6. counts[w] = counts.get(w, 0) + 1:現在の値(無ければ 0)を取得して +1 する。get の便利さが分かります。
  7. if __name__ == '__main__'::このファイルが直接実行されたときだけテストコードを実行するための慣習です。