2.1.2 データ型と変数

このページを終えたら、この evidence card を残します。
- 概念
- 変数、型、演算子、入力/出力、分岐、ループ、構造、関数、またはモジュール
- コード
- この概念のための最小限の実行可能な Python スニペット
- 出力
- 印字値、型、branch結果、loop trace、または返り値
- 失敗確認
- 型不一致、インデント、オフバイワン、可変データ、または import パスの問題
- 期待される成果
- 概念が機能することを証明するコードと出力結果
この節の位置づけ
Section titled “この節の位置づけ”この節では、Python がデータをどのように表し、保存するのかを理解します。変数、数値、文字列、ブール値、そして型変換は、後で条件分岐を書いたり、表データを扱ったり、モデル API を呼び出したりするときの土台になります。まずは、これらの「最小のデータ単位」に慣れていきましょう。
- 変数とは何かを理解し、命名ルールを身につける
- Python の基本データ型である整数、浮動小数点数、文字列、ブール値を理解する
- データ型同士の変換を学ぶ
- 動的型付けの意味を理解する
変数は、ラベルが貼られた箱だと考えてみましょう。中にものを入れて、ラベルで見つけることができます。
service_name = "ログイン API" # 箱に「service_name」というラベルを貼るlatency_ms = 185 # 箱に「latency_ms」というラベルを貼るtimeout_seconds = 2.5 # 箱に「timeout_seconds」というラベルを貼るPython の = は「等しい」ではなく、代入を表します。つまり、右側の値を左側の箱に入れるという意味です。
# 代入の向き:右から左x = 10 # 10 を x という箱に入れる
# 箱の中身は変更できるx = 20 # 今は x の中身は 20 になった(10 はなくなる)
# 変数の値を使って計算できるy = x + 5 # y = 20 + 5 = 25print(y) # 出力: 25変数名のルール
Section titled “変数名のルール”Python には変数名に関するいくつかの決まりがあります。
| ルール | 正しい例 | 間違った例 |
|---|---|---|
| 英字、数字、アンダースコアのみ使える | service_name, task2 | service-name, task! |
| 数字で始められない | task1 | 1task |
| Python のキーワードは使えない | my_class | class, if, for |
| 大文字小文字を区別する | Service と service は別の変数 | — |
命名の慣例(必須ではないですが、みんなこうします)
Section titled “命名の慣例(必須ではないですが、みんなこうします)”# よい命名 ✅ —— 小文字 + アンダースコア(snake_case)service_name = "ログイン API"learning_rate = 0.001max_epochs = 100
# あまりよくない命名 ❌ —— 使えないわけではないが、わかりにくいa = "ログイン API" # a では何かわからないx1 = 0.001 # x1 が何を表すのか不明SN = "ログイン API" # 略しすぎていて、他の人に伝わりにくい整数(int)
Section titled “整数(int)”整数は、小数点のない数です。正の数、負の数、0 のいずれも含みます。
retry_count = 3queue_delta = -10count = 0big_number = 1_000_000 # アンダースコアで区切ると見やすい。1000000 と同じ
print(type(retry_count)) # <class 'int'>Python の整数には大きさの制限がありません(C/Java のような int の範囲制限はありません)。
huge = 99999999999999999999999999999999print(huge + 1) # まったく問題ありません浮動小数点数(float)
Section titled “浮動小数点数(float)”浮動小数点数は、小数点を含む数です。
pi = 3.14159timeout_seconds = 2.5negative = -0.001
print(type(pi)) # <class 'float'>浮動小数点数の精度に注意してください。これは、どのプログラミング言語にもある問題です。
>>> 0.1 + 0.20.30000000000000004 # 正確な 0.3 ではない!これは Python のバグではなく、コンピュータが小数を 2 進数で保存することによる、もともとの性質です。AI 開発では、このわずかな誤差が結果に影響しないことが多いです。ただし、金融計算のように正確な結果が必要な場合は、decimal モジュールを使うことができます。
整数と浮動小数点数の計算
Section titled “整数と浮動小数点数の計算”a = 10b = 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 / 25.0 # 5 ではなく 5.0
# 整数がほしいなら // を使う>>> 10 // 25文字列(str)
Section titled “文字列(str)”文字列はテキストです。文字の並びを引用符で囲みます。
文字列の作成
Section titled “文字列の作成”# シングルクォートとダブルクォートのどちらも使える。効果は同じservice = 'ログイン API'status = "ready"
# 文字列の中に引用符がある場合は、別の種類の引用符で囲むsentence = "レビュアーは言いました: 'リリースできます'"command = 'CLI フラグは "--dry-run" です'
# トリプルクォート:複数行のテキストを書けるrelease_notes = """ログイン API- タイムアウトを調整- リトライログを有効化"""print(release_notes)
print(type(service)) # <class 'str'>文字列の連結
Section titled “文字列の連結”module_name = "チケット"endpoint_name = " API"
# 方法 1: + で連結full_endpoint = module_name + endpoint_nameprint(full_endpoint) # チケット API
# 方法 2: f-string を使う(おすすめ!Python 3.6+)version = "v1"intro = f"{full_endpoint} は {version} で動きます"print(intro) # チケット API は v1 で動きます
# 方法 3: format() を使うintro2 = "{} は {} で動きます".format(full_endpoint, version)print(intro2) # チケット API は v1 で動きますよく使う文字列操作
Section titled “よく使う文字列操作”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 = "ログイン API,185,ready"parts = csv_line.split(",")print(parts) # ['ログイン API', '185', 'ready']文字列のインデックスとスライス
Section titled “文字列のインデックスとスライス”
文字列の各文字には**位置番号(インデックス)**があり、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]) # thoprint(text[:3]) # Pyt(先頭から。0 は省略できる)print(text[3:]) # hon(末尾まで。終了位置は省略できる)print(text[:]) # Python(文字列全体のコピー)print(text[::2]) # Pto(1 文字おきに取り出す)print(text[::-1]) # nohtyP(文字列を逆順にする!)文字列は変更できない
Section titled “文字列は変更できない”text = "Hello"# text[0] = "h" # エラー!TypeError: 'str' object does not support item assignment
# 変更したい場合は、新しい文字列を作るtext = "h" + text[1:] # "hello"ブール値(bool)
Section titled “ブール値(bool)”ブール値は True(真)と False(偽)の 2 つだけです。先頭は大文字にします。
is_deployed = Truehas_errors = False
print(type(is_deployed)) # <class 'bool'>ブール値は、主に比較演算から得られます。
print(5 > 3) # Trueprint(5 < 3) # Falseprint(5 == 5) # True(`=` が 1 つだと代入、2 つで比較)print(5 != 3) # True(`!=` は等しくないという意味)print("abc" == "abc") # Trueブール値は、後で学ぶ条件分岐(if/else)でたくさん使います。
Python では、いろいろなものをブール値として扱えます。次の値は「偽」と見なされます。
# 以下はすべて "偽"(Falsy)bool(0) # Falsebool(0.0) # Falsebool("") # False(空文字列)bool([]) # False(空リスト)bool(None) # False
# それ以外は "真"(Truthy)bool(1) # Truebool(-1) # True(0 でなければ真)bool("hello") # True(空でない文字列は真)bool([1, 2]) # True(空でないリストは真)None 型
Section titled “None 型”None は Python の特別な値で、**「何もない」**ことを表します。
result = Noneprint(result) # Noneprint(type(result)) # <class 'NoneType'>None は、「まだ値がない」や「結果がない」を表すときによく使います。
# 関数が返り値を持たない場合、デフォルトで None を返すdef say_hello(): print("Hello!")
result = say_hello() # Hello! を表示print(result) # Noneときには、ある型を別の型に変換する必要があります。
# 文字列 → 数値latency_str = "185"latency_ms = int(latency_str) # 文字列を整数に変換print(latency_ms + 10) # 195
timeout_str = "2.5"timeout_seconds = float(timeout_str) # 文字列を浮動小数点数に変換print(timeout_seconds) # 2.5
# 数値 → 文字列task_count = 12task_count_str = str(task_count) # 整数を文字列に変換print("タスク数: " + task_count_str) # タスク数: 12
# 整数 ↔ 浮動小数点数x = int(3.7) # 3(小数点以下をそのまま切り捨てる。四捨五入ではない)y = float(5) # 5.0よくあるエラー:文字列と数値は、+ でそのまま連結できない
latency_ms = 185# print("レイテンシ: " + latency_ms) # エラー!TypeError
# 正しい方法 1: 文字列に変換するprint("レイテンシ: " + str(latency_ms))
# 正しい方法 2: f-string を使う(おすすめ)print(f"レイテンシ: {latency_ms}")
# 正しい方法 3: カンマで区切る(print が自動で空白を入れる)print("レイテンシ:", latency_ms)型変換の早見表
Section titled “型変換の早見表”| 変換 | 関数 | 例 | 結果 |
|---|---|---|---|
| → 整数 | 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, 3print(a, b, c) # 1 2 3
# 2 つの変数の値を入れ替える(Python らしい簡潔な書き方)a, b = b, aprint(a, b) # 2 1
# 複数の変数に同じ値を代入x = y = z = 0print(x, y, z) # 0 0 0この変数の入れ替え方は、とても Pythonic(Python らしい)です。他の言語では、通常は一時変数が必要です。
# 他の言語での書き方temp = aa = bb = temp
# Python の書き方a, b = b, a # 1 行で完了!手を動かしてみよう
Section titled “手を動かしてみよう”練習 1: サービス状態カード
Section titled “練習 1: サービス状態カード”サービス状態を変数に保存し、f-string で出力してみましょう。
service = "ログイン API"latency_ms = 185timeout_seconds = 2.5is_ready = True
print(f"サービス: {service}")print(f"レイテンシ: {latency_ms} ms")print(f"タイムアウト: {timeout_seconds} 秒")print(f"準備完了: {is_ready}")print(f"15 ms 増えた場合: {latency_ms + 15} ms")練習 2: レイテンシ単位変換器
Section titled “練習 2: レイテンシ単位変換器”ミリ秒を秒に変換する式:seconds = milliseconds / 1000
latency_ms = 375.0latency_seconds = latency_ms / 1000print(f"{latency_ms} ms = {latency_seconds} 秒")latency_ms の値を変えて、いくつかのリクエスト時間を計算してみましょう。
練習 3: 文字列操作
Section titled “練習 3: 文字列操作”
# 1. 前後の空白を削除する# 2. 小文字に変換する# 3. @ の位置を見つける# 4. ユーザー名部分(@ の前)を取り出すヒント:.strip()、.lower()、.find()、スライスを組み合わせて使えます。
練習 4: 型を調べる
Section titled “練習 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")) # 文字列 + 文字列 = ?参考実装と解説
- サービス状態カードでは
str、int、float、boolを使います。f-string では変数の値に加え、latency_ms + 15のような式も表示できます。 375.0ms は0.375秒です。latency_msを変えるとlatency_secondsも変わるよう、答えを固定せず式をコードに残します。- 正規化後のメールアドレスは
[email protected]です。空白を除き小文字にした後の@のインデックスは11、ユーザー名はsupport.apiです。 - 型の出力は順に
int、float、str、bool、NoneType、int、float、strです。 - よくある間違いは
"1" + "2"を計算だと思うことです。これは文字列結合なので、結果は"12"です。
| 型 | キーワード | 例 | 用途 |
|---|---|---|---|
| 整数 | int | 42, -10, 0 | カウント、インデックス |
| 浮動小数点数 | float | 3.14, -0.5 | 正確な数値、科学計算 |
| 文字列 | str | "hello", 'world' | テキストデータ |
| ブール値 | bool | True, False | 条件分岐 |
| 空値 | NoneType | None | 「値がない」ことを表す |