メインコンテンツへスキップ

2.1.2 データ型と変数

変数、オブジェクト、参照の関係図

この節の位置づけ

この節では、Python がデータをどのように表し、保存するのかを理解します。変数、数値、文字列、ブール値、そして型変換は、後で条件分岐を書いたり、表データを扱ったり、モデル API を呼び出したりするときの土台になります。まずは、これらの「最小のデータ単位」に慣れていきましょう。

学習目標

  • 変数とは何かを理解し、命名ルールを身につける
  • Python の基本データ型である整数、浮動小数点数、文字列、ブール値を理解する
  • データ型同士の変換を学ぶ
  • 動的型付けの意味を理解する

変数とは?

変数は、ラベルが貼られた箱だと考えてみましょう。中にものを入れて、ラベルで見つけることができます。

name = "小明"       # 箱に「name」というラベルを貼り、中には「小明」を入れる
age = 20 # 箱に「age」というラベルを貼り、中には 20 を入れる
height = 1.75 # 箱に「height」というラベルを貼り、中には 1.75 を入れる

Python の = は「等しい」ではなく、代入を表します。つまり、右側の値を左側の箱に入れるという意味です。

# 代入の向き:右から左
x = 10 # 10 を x という箱に入れる

# 箱の中身は変更できる
x = 20 # 今は x の中身は 20 になった(10 はなくなる)

# 変数の値を使って計算できる
y = x + 5 # y = 20 + 5 = 25
print(y) # 出力: 25

変数名のルール

Python には変数名に関するいくつかの決まりがあります。

ルール正しい例間違った例
英字、数字、アンダースコアのみ使えるuser_name, age2user-name, age!
数字で始められないname11name
Python のキーワードは使えないmy_classclass, if, for
大文字小文字を区別するNamename は別の変数

命名の慣例(必須ではないですが、みんなこうします)

# よい命名 ✅ —— 小文字 + アンダースコア(snake_case)
student_name = "小明"
learning_rate = 0.001
max_epochs = 100

# あまりよくない命名 ❌ —— 使えないわけではないが、わかりにくい
a = "小明" # a では何かわからない
x1 = 0.001 # x1 が何を表すのか不明
SN = "小明" # 略しすぎていて、他の人に伝わりにくい
命名の黄金ルール

変数名は、見ただけで何を表すか分かるようにしましょう。少し長くなっても(student_count)、意味の分からない略語(sc)よりずっとよいです。


数値型

整数(int)

整数は、小数点のない数です。正の数、負の数、0 のいずれも含みます。

age = 25
temperature = -10
count = 0
big_number = 1_000_000 # アンダースコアで区切ると見やすい。1000000 と同じ

print(type(age)) # <class 'int'>
type() 関数

type() は、どんな値の型でも確認できる関数です。学習中によく使います。変数の型を確認するときに便利です。

Python の整数には大きさの制限がありません(C/Java のような int の範囲制限はありません)。

huge = 99999999999999999999999999999999
print(huge + 1) # まったく問題ありません

浮動小数点数(float)

浮動小数点数は、小数点を含む数です。

pi = 3.14159
weight = 65.5
negative = -0.001

print(type(pi)) # <class 'float'>

浮動小数点数の精度に注意してください。これは、どのプログラミング言語にもある問題です。

>>> 0.1 + 0.2
0.30000000000000004 # 正確な 0.3 ではない!

これは Python のバグではなく、コンピュータが小数を 2 進数で保存することによる、もともとの性質です。AI 開発では、このわずかな誤差が結果に影響しないことが多いです。ただし、金融計算のように正確な結果が必要な場合は、decimal モジュールを使うことができます。

整数と浮動小数点数の計算

a = 10
b = 3

print(a + b) # 13 足し算
print(a - b) # 7 引き算
print(a * b) # 30 掛け算
print(a / b) # 3.333... 割り算(結果は常に float)
print(a // b) # 3 切り捨て除算
print(a % b) # 1 余り
print(a ** b) # 1000 べき乗(10 の 3 乗)

よくある落とし穴:

# 割り算 / の結果は、割り切れても必ず float
>>> 10 / 2
5.0 # 5 ではなく 5.0

# 整数がほしいなら // を使う
>>> 10 // 2
5

文字列(str)

文字列はテキストです。文字の並びを引用符で囲みます。

文字列の作成

# シングルクォートとダブルクォートのどちらも使える。効果は同じ
name = '小明'
greeting = "こんにちは"

# 文字列の中に引用符がある場合は、別の種類の引用符で囲む
sentence = "彼はこう言った: 'こんにちは'"
sentence2 = '英語名は "Tom"'

# トリプルクォート:複数行のテキストを書ける
poem = """
静夜思
床前明月光,
疑是地上霜。
"""
print(poem)

print(type(name)) # <class 'str'>

文字列の連結

first_name = "張"
last_name = "三"

# 方法 1: + で連結
full_name = first_name + last_name
print(full_name) # 張三

# 方法 2: f-string を使う(おすすめ!Python 3.6+)
age = 20
intro = f"私の名前は{full_name}です。{age}歳です"
print(intro) # 私の名前は張三です。20歳です

# 方法 3: format() を使う
intro2 = "私の名前は{}です。{}歳です".format(full_name, age)
print(intro2) # 私の名前は張三です。20歳です
f-string はベストプラクティス

f-string(f"...{変数}...")は、現代の Python で最もよく使われる文字列フォーマット方法です。簡潔で分かりやすく、この先の授業でもたくさん使います。

よく使う文字列操作

text = "Hello, Python!"

# 長さを取得
print(len(text)) # 14

# 大文字・小文字の変換
print(text.upper()) # HELLO, PYTHON!
print(text.lower()) # hello, python!

# 部分文字列を探す
print(text.find("Python")) # 7(7 番目の位置から)
print("Python" in text) # True

# 置換
print(text.replace("Python", "AI")) # Hello, AI!

# 前後の空白を削除
messy = " hello "
print(messy.strip()) # "hello"

# 分割
csv_line = "張三,20,北京"
parts = csv_line.split(",")
print(parts) # ['張三', '20', '北京']

文字列のインデックスとスライス

文字列のインデックスとスライス図解

文字列の各文字には**位置番号(インデックス)**があり、0 から始まります。

text = "Python"
# P y t h o n
# index: 0 1 2 3 4 5
# 負の index: -6 -5 -4 -3 -2 -1

print(text[0]) # P(最初の文字)
print(text[5]) # n(6 番目の文字)
print(text[-1]) # n(最後の文字)
print(text[-2]) # o(後ろから 2 番目の文字)

スライスを使うと、一部の文字列を取り出せます。

text = "Python"

print(text[0:3]) # Pyt(index 0 から index 3 まで、3 は含まない)
print(text[2:5]) # tho
print(text[:3]) # Pyt(先頭から。0 は省略できる)
print(text[3:]) # hon(末尾まで。終了位置は省略できる)
print(text[:]) # Python(文字列全体のコピー)
print(text[::2]) # Pto(1 文字おきに取り出す)
print(text[::-1]) # nohtyP(文字列を逆順にする!)
スライスの書き方

text[start:stop:step] —— start から始めて、stop で終わる(ただし stop は含まない)、step ごとに 1 つ取り出します。覚えておきましょう:左閉右開(開始位置は含み、終了位置は含まない)。

文字列は変更できない

text = "Hello"
# text[0] = "h" # エラー!TypeError: 'str' object does not support item assignment

# 変更したい場合は、新しい文字列を作る
text = "h" + text[1:] # "hello"

ブール値(bool)

ブール値は True(真)と False(偽)の 2 つだけです。先頭は大文字にします。

is_student = True
is_raining = False

print(type(is_student)) # <class 'bool'>

ブール値は、主に比較演算から得られます。

print(5 > 3)       # True
print(5 < 3) # False
print(5 == 5) # True(`=` が 1 つだと代入、2 つで比較)
print(5 != 3) # True(`!=` は等しくないという意味)
print("abc" == "abc") # True

ブール値は、後で学ぶ条件分岐(if/else)でたくさん使います。

真値と偽値

Python では、いろいろなものをブール値として扱えます。次の値は「偽」と見なされます。

# 以下はすべて "偽"(Falsy)
bool(0) # False
bool(0.0) # False
bool("") # False(空文字列)
bool([]) # False(空リスト)
bool(None) # False

# それ以外は "真"(Truthy)
bool(1) # True
bool(-1) # True(0 でなければ真)
bool("hello") # True(空でない文字列は真)
bool([1, 2]) # True(空でないリストは真)

None 型

None は Python の特別な値で、**「何もない」**ことを表します。

result = None
print(result) # None
print(type(result)) # <class 'NoneType'>

None は、「まだ値がない」や「結果がない」を表すときによく使います。

# 関数が返り値を持たない場合、デフォルトで None を返す
def say_hello():
print("Hello!")

result = say_hello() # Hello! を表示
print(result) # None

型変換

ときには、ある型を別の型に変換する必要があります。

# 文字列 → 数値
age_str = "25"
age = int(age_str) # 文字列を整数に変換
print(age + 1) # 26

price_str = "99.9"
price = float(price_str) # 文字列を浮動小数点数に変換
print(price) # 99.9

# 数値 → 文字列
score = 95
score_str = str(score) # 整数を文字列に変換
print("得点: " + score_str) # 得点: 95

# 整数 ↔ 浮動小数点数
x = int(3.7) # 3(小数点以下をそのまま切り捨てる。四捨五入ではない)
y = float(5) # 5.0

よくあるエラー:文字列と数値は、+ でそのまま連結できない

age = 20
# print("年齢: " + age) # エラー!TypeError

# 正しい方法 1: 文字列に変換する
print("年齢: " + str(age))

# 正しい方法 2: f-string を使う(おすすめ)
print(f"年齢: {age}")

# 正しい方法 3: カンマで区切る(print が自動で空白を入れる)
print("年齢:", age)

型変換の早見表

変換関数結果
→ 整数int()int("25")25
→ 浮動小数点数float()float("3.14")3.14
→ 文字列str()str(100)"100"
→ ブール値bool()bool(0)False

動的型付け

Python は動的型付けの言語です。つまり、変数を先に宣言して型を決める必要はなく、同じ変数にいつでも別の型を代入できます。

x = 10          # x は整数
print(type(x)) # <class 'int'>

x = "hello" # 今度は x が文字列になった
print(type(x)) # <class 'str'>

x = True # 今度は x がブール値になった
print(type(x)) # <class 'bool'>

とても柔軟ですが、注意も必要です。もともと数値を入れていた変数を、うっかり文字列にしてしまわないようにしましょう。

Java(静的型付け言語)と比べてみましょう。

int x = 10;       // x は整数と宣言する
x = "hello"; // エラー!Java では型を変えられない

多重代入

Python には、便利な代入の書き方があります。

# 複数の変数に同時に代入
a, b, c = 1, 2, 3
print(a, b, c) # 1 2 3

# 2 つの変数の値を入れ替える(Python らしい簡潔な書き方)
a, b = b, a
print(a, b) # 2 1

# 複数の変数に同じ値を代入
x = y = z = 0
print(x, y, z) # 0 0 0

この変数の入れ替え方は、とても Pythonic(Python らしい)です。他の言語では、通常は一時変数が必要です。

# 他の言語での書き方
temp = a
a = b
b = temp

# Python の書き方
a, b = b, a # 1 行で完了!

手を動かしてみよう

練習 1: 個人情報カード

自分の情報を入れる変数を作り、f-string で表示してみましょう。

name = "あなたの名前"
age = 25
city = "あなたの都市"
is_student = True

print(f"名前: {name}")
print(f"年齢: {age}")
print(f"都市: {city}")
print(f"学生ですか: {is_student}")
print(f"来年は {age + 1} 歳になります")

練習 2: 温度変換器

摂氏から華氏への変換式:F = C × 9/5 + 32

celsius = 37.5
fahrenheit = celsius * 9 / 5 + 32
print(f"{celsius}°C = {fahrenheit}°F")

celsius の値を変えて、いくつかの温度を計算してみましょう。

練習 3: 文字列操作

email = "  [email protected]  "

# 1. 前後の空白を削除する
# 2. 小文字に変換する
# 3. @ の位置を見つける
# 4. ユーザー名部分(@ の前)を取り出す

ヒント:.strip().lower().find()、スライスを組み合わせて使えます。

練習 4: 型を調べる

type() を使って、次の値の型を確認しましょう。まず予想してから確かめてみてください。

print(type(42))
print(type(3.14))
print(type("3.14"))
print(type(True))
print(type(None))
print(type(1 + 2))
print(type(1 + 2.0)) # 整数 + 浮動小数点数 = ?
print(type("1" + "2")) # 文字列 + 文字列 = ?

まとめ

キーワード用途
整数int42, -10, 0カウント、インデックス
浮動小数点数float3.14, -0.5正確な数値、科学計算
文字列str"hello", 'world'テキストデータ
ブール値boolTrue, False条件分岐
空値NoneTypeNone「値がない」ことを表す
核心の理解

Python では、すべてがオブジェクトです。数値もオブジェクト、文字列もオブジェクト、さらに TrueNone もオブジェクトです。それぞれのオブジェクトには型(type)があり、型によってできる操作が決まります。