数値・文字列・真偽値|Pythonの最初の1行
このページはプロモーション(広告)を含みます。
Pythonの最初の1行(初級・読む25分+演習30分)
この授業のゴール
- 整数(int)・小数(float)・文字列(str)・真偽値(bool)を、見た目と
type()の結果から見分けられる 1000と'1000'で、足し算・掛け算の結果が変わることを実行して説明できる- 小数の計算誤差(0.1 + 0.2 など)が起きる理由と、金額計算での避け方を述べられる
- 0・空の文字列・
None(値がない)の違いを、集計の場面に結びつけて説明できる
仕事でどう使うか
データ分析の失敗の多くは、値の種類(型)の取り違えから始まります。CSVから読み込んだ金額が文字列のままで、合計が計算できない。「0」と「入力なし」を同じに扱い、平均がずれる。こうした問題は、型を意識すれば防げます。
| 路線 | この授業の使いどころ |
|---|---|
| DS(データサイエンティスト) | 集計前に、各列が数値か文字列かを確認する。売上0円と未入力(欠損)を分け、平均や件数の分母を正しく決める |
| ML(機械学習エンジニア) | 特徴量は数値で与える。カテゴリを表す文字や、真偽の列を、どの数値に変えるかを設計する。小数の誤差が評価値にどれだけ影響するかを見積もる |
| DX(DX推進・AI企画) | 業務システムの項目定義で、郵便番号や電話番号を「数」でなく「文字列」で持つ理由を説明する(先頭の0が消えるため)。金額は整数の円で持つ、などのルールを決める |
| RS(研究者) | 測定値の有効桁数と、計算機上の小数の近似を区別する。欠損値を0と誤って扱った解析結果が出ていないかを確認する |
この授業では、4つの基本の型と、「値がない」ことを表す None を扱います。型は、この先のPythonの学習すべての土台です。
前提
次の内容を使います。
- 変数と代入(
price = 1000で名前に値を結びつける)→ 変数と代入 printで値を表示する、コードは上から順に実行される → コードを実行して結果を見る- 小数・分数・比の表し方(0.1 は 10%)→ 分数と小数と比
- 文字コードと全角・半角(文字は番号で区別される)→ 文字コードと安全なファイル確認
この授業では、画面に表示される見た目が同じでも、型が違えば別の扱いになることを実行して確かめます。
身近な状況:注文1件の記録に、4種類の値が混ざっている
ネットショップの注文を1件、変数で表します。
| 項目 | 値 | 何を表すか |
|---|---|---|
| 商品名 | 'りんご' |
文字 |
| 数量 | 3 |
個数(整数) |
| 単価 | 120 |
円(整数) |
| 割引率 | 0.1 |
割合(小数) |
| 会員か | True |
はい / いいえ |
見た目の区別は簡単そうですが、CSVファイルから読み込んだ瞬間、数量の 3 も単価の 120 も、文字として読み込まれることがあります。このとき '3' * 120 を計算すると、Pythonは「文字 3 を120回繰り返す」という計算をして、エラーも出さずに長い文字列を返します。
name = 'りんご'
qty = 3
unit_price = 120
rate = 0.1
is_member = True
print(name, type(name))
print(qty, type(qty))
print(unit_price, type(unit_price))
print(rate, type(rate))
print(is_member, type(is_member))
出力の <class 'str'> などが、値の型(種類)です。type(値) で調べられます。型が違えば、足し算や掛け算の意味が変わります。
直感的な説明:同じ「1000」でも、紙に書いた数と、ラベルに書いた文字
財布の中の千円札と、「1000円」と印字されたラベルを想像してください。千円札は払うことができ、足し算もできます。ラベルは文字の並びで、数えることも引き算もできません。ただし、2枚並べて貼れば「10001000円」のような長いラベルを作れます。
Pythonの型もこれと同じです。
- 数(
int/float):足し算・引き算・掛け算ができる。 - 文字列(
str):文字の並び。つなげる(+)、繰り返す(*)、長さを数える(len)ことはできるが、数としての計算はできない。 - 真偽値(
bool):「そうだ(True)」か「違う(False)」の2つだけ。比較の結果として得られる。
画面に 1000 と出ても、それが数なのか文字列なのかは、出力の見た目だけでは区別できません。区別したいときは type() や repr()(文字列なら引用符付きで表示する関数。printと入力値 で扱います)を使います。
正確な定義:Pythonの基本の型
型とは、値の種類のことで、その値に対してできる操作を決めます。
| 型 | 名前 | 書き方の例 | 主な使い道 |
|---|---|---|---|
int |
整数 | 3、-5、0 |
個数、円の金額、ID |
float |
小数(浮動小数点数) | 0.1、3.0、-2.5 |
割合、温度、測定値 |
str |
文字列 | 'りんご'、"1000" |
名前、コード、日付の文字 |
bool |
真偽値 | True、False |
条件、フラグ(印) |
NoneType |
値がない | None |
未入力、該当なし |
詳しい決まりを確認します。
- int:整数。Pythonの
intは桁数に上限がなく、2 ** 100も正確に計算できます。 - float:小数。コンピューターは2進法で近似して持つため、誤差が生じることがあります(後述)。
3.0のように小数点があれば、整数に見えてもfloatです。 - str:シングルクォート
'...'またはダブルクォート"..."で囲んだ文字の並び。'1000'は文字列で、1000は整数です。+は文字をつなげ('1' + '2'は'12')、*は繰り返し('ab' * 2は'abab')、len('りんご')は文字数3を返します。 - bool:
TrueとFalse(先頭が大文字)。3 == 3.0のような比較の結果として生まれます。 - None:「値がない」ことを表す特別な値。
0や空文字''とは別物です。
ここで、型の確認に使う道具を決めます。type(x) は x の型を返す関数で、type(x).__name__ と書くと型の名前だけを文字列で得られます。たとえば type(3).__name__ は 'int' です。
注意:== で数と文字を比べても、エラーにはなりません。3 == '3' は False になります。型が違えば等しくないので、比較の結果がいつも False になる原因に気づけないことがあります。
段階付き例題:注文1件の小計を、型を確かめながら求める
問題:単価 120 円のりんごを 3 個買う。小計と、会員割引(10%)後の金額を求め、各値の型を確認する。
ステップ1:数式で意味を確認する。小計 $= \text{単価} \times \text{数量} = 120 \times 3 = 360$(円)。割引後 $= \text{小計} \times (1 - \text{割引率}) = 360 \times 0.9 = 324$(円)。単価は円、数量は個、割引率は 0 以上 1 以下の割合です。
ステップ2:コードにして、各変数の型も出す。
unit_price = 120
qty = 3
rate = 0.1
is_member = True
subtotal = unit_price * qty
discounted = subtotal * (1 - rate)
print('小計', subtotal, type(subtotal).__name__)
print('割引後', discounted, type(discounted).__name__)
print('会員?', is_member, type(is_member).__name__)
print('割引後は小計より小さいか?', discounted < subtotal, type(discounted < subtotal).__name__)
ステップ3:1行ずつ読む。
| 出力 | 値 | 型 | 読み方 |
|---|---|---|---|
| 小計 | 360 |
int |
int × int は int |
| 割引後 | 324.0 |
float |
0.1 が float なので結果も float |
| 会員? | True |
bool |
真偽値 |
| 割引後は小計より小さいか? | True |
bool |
比較の結果も bool |
ステップ4:意味を確認する。割引後の金額が 324 円(324.0)で、手計算の 360 × 0.9 = 324 と一致しました。324.0 の .0 は「小数の型である」という印で、金額としては 324 円です。最終的に円の整数が必要なときの変換は、次の授業 演算子と型変換 で扱います。
ステップ5:型が混ざると何が起きるか。同じ計算を、文字列の '120' で行うとどうなるかを見ます。
unit_price_text = '120'
qty = 3
print(unit_price_text * qty)
print(len(unit_price_text * qty))
print(type(unit_price_text * qty).__name__)
出力は 120120120、9、str です。エラーにはならず、「'120' を3回つないだ9文字の文字列」ができます。これは数としての小計 360 とは全く別の値です。
操作して理解する:型を予想してから確かめる
次の式の型と値を、実行する前に予想してください。そのあと実行して答え合わせをします。
print(type(3).__name__, type(3.0).__name__, type('3').__name__, type(True).__name__)
print(3 == 3.0, 3 == '3', '3' + '3', 3 + 3)
print(len('りんご'), len(str(1000)), len('1000'))
print(True + 1, 5 > 3, 'a' < 'b')
予想の手順と答えは、次のとおりです。
intfloatstrboolが並びます。3 == 3.0は数として等しいのでTrue。3 == '3'は型が違うのでFalse。'3' + '3'は文字の連結で'33'、3 + 3は6。出力はTrue False 33 6です。'りんご'は3文字なので3。str(1000)は整数 1000 を文字列'1000'に変えるので長さ4。'1000'も長さ4。出力は3 4 4です。True + 1は2(Trueは 1 として計算される)。5 > 3はTrue。文字どうしの比較'a' < 'b'もTrue(文字コード順)。出力は2 True Trueです。
自分で値を書き換えて遊んでみてください。print(type(None).__name__) は NoneType を出します。print(type(1 / 1).__name__) は float です。割り算 / は、割り切れても必ず float になります。
表示された値を、次の観点で確認する習慣を付けます。(1) 型は期待どおりか、(2) 数と文字が混ざっていないか、(3) True / False を 1 / 0 と取り違えていないか。
発展:浮動小数点の誤差、bool が int の仲間であること、NaN
浮動小数点数の誤差:コンピューターは小数を2進法で保存します。$0.1$ は2進法では循環小数になり、有限の桁で打ち切るため、わずかな誤差が生じます。0.1 を小数点以下20桁まで表示すると 0.10000000000000000555 で、真の 0.1 とはわずかに違います。double(64ビット)の精度は、およそ10進法で15〜16桁です。
import math
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
print(abs((0.1 + 0.2) - 0.3) < 1e-9)
print(math.isclose(0.1 + 0.2, 0.3))
print(round(0.1 + 0.2, 2) == 0.3)
出力は 0.30000000000000004、False、True、True、True です。小数の等しさは == ではなく、許容誤差内で等しいか(abs(a - b) < 1e-9 または math.isclose)で判定します。金額は、円を整数で持つ(または decimal.Decimal を使う)ことで、誤差を避けられます。
bool は int の仲間:True は 1、False は 0 として計算できます。isinstance(True, int) は True です。この性質は、True の個数を sum で数えるときに便利ですが、True + 1 のような式が意図せず通ってしまう原因にもなります。
NaN:float('nan')(Not a Number:数ではない値)は、計算できない結果を表す小数です。NaN は自分自身とも等しくなく(nan == nan は False)、None とは別の値です。pandas では欠損値の表現として NaN が使われます(「型と欠損」(有料版))。「0」「空」「欠損」を区別する考え方は、データ分析全体で重要です。
よくある失敗
失敗1:文字列と数を足す/掛ける
誤り:CSVから読んだ数量が文字列のまま計算に使われる。
qty_text = '3'
unit_price = 120
print(qty_text * unit_price == '3' * 120) # 文字の120回繰り返し
code = "print('数量:' + 3)\n"
try:
exec(compile(code, 'sample.py', 'exec'), {})
except Exception as e:
print(type(e).__name__, ':', e)
1行目の出力は True です。'3' * 120 は「文字 3 を120個つないだ文字列」で、エラーなしで間違った値を返します。もう1つの '数量:' + 3 は TypeError(can only concatenate str (not "int") to str)になります。
直し方:数が必要なら int('3') で変換し、文字列に数を入れたいときは str(3) や f文字列(printと入力値)を使う。エラーになる場合は気づけますが、* のようにエラーが出ない型の取り違えが最も危険です。出力の型と長さを確かめます。
失敗2:文字列の真偽を `bool()` で判定する
誤り:'False' という文字を bool() に渡して、偽になると考える。
print(bool('False'))
print(bool('0'))
print(bool(''))
print(bool(0))
print(bool(0.0))
出力は True、True、False、False、False です。空でない文字列はすべて True になります。'False' も '0' も、中身にかかわらず True です。フォームやCSVから 'True' / 'False' の文字列が来たとき、bool(text) では判定できません。
直し方:text == 'True' のように、文字を比較して真偽値を得る。0、0.0、''(空文字)、None(と、空のリストのような中身が空のもの)が False として扱われ、それ以外の値は True になる、という決まりを覚えておきます。
失敗3:小数を `==` で比べて、一致しない
誤り:金額を小数で計算して == で検算する。
total = 0.1 * 3
print(total)
print(total == 0.3)
print(abs(total - 0.3) < 1e-9)
total_yen = 10 * 3 # 円を整数で持つ(0.1円 = 10銭 = 10 など単位を変える)
print(total_yen == 30)
出力は 0.30000000000000004、False、True、True です。0.1 * 3 は 0.3 とほぼ等しいですが、完全には一致しません。
直し方:(1) 小数どうしは、abs(a - b) < 許容誤差 で比べる。(2) 金額は、最小単位の整数(円)で持つ。小数が必要な場面(税率 0.1 など)では、最後に丸め方(切り捨て・切り上げ・四捨五入)を決めて整数に直す(演算子と型変換)。
失敗4:「0」と「値がない(None)」を同じに扱う
誤り:未入力の売上を None のまま足し、または 0 に置き換えて平均を出す。
sales = [100, 0, None] # 0 は「売上0円」、None は「未入力」
code = 'print(100 + None)\n'
try:
exec(compile(code, 'sample.py', 'exec'), {})
except Exception as e:
print(type(e).__name__, ':', e)
# None を 0 に置き換えた平均と、None を除いた平均
print((100 + 0 + 0) / 3)
print((100 + 0) / 2)
最初の出力は TypeError : unsupported operand type(s) for +: 'int' and 'NoneType' です。次の2つの平均は 33.333333333333336 と 50.0 で、同じデータなのに 未入力を0とみなすか、除外するかで平均が大きく変わります。
直し方:0(売上がない)と None(わからない)を別の値として扱い、どちらにするかを集計の仕様として決めて書く。分母にどれを含めるのかを、レポートに明記します。
まとめ
- 基本の型は int(整数)・float(小数)・str(文字列)・bool(真偽値)。値がないことは None で表す。
'1000'と1000は別の値。'120' * 3のように、エラーなしで意味の違う結果が出る型の取り違えに注意する。- 比較(
==、>=など)の結果は bool。空でない文字列はbool()で常に True になる。 - 小数は誤差を含む。
==ではなく許容誤差で比べ、金額は円の整数で持つ。 - 0(値がゼロ)と None(値がない)は別物で、集計の分母に含めるかは仕様として決める。
用語
- 型(type)
値の種類。できる操作を決める。int、float、str、bool などがある。
- 浮動小数点数(floating-point number)
小数を2進法で近似して持つ数(float)。0.1 + 0.2 のように、わずかな誤差が生じる。
- 文字列(string)
引用符で囲んだ文字の並び。連結や長さの計算はできるが、数としての計算はできない。
- 真偽値(boolean)
True か False のどちらかを取る値。比較の結果として得られる。
- None(None)
値がないことを表す特別な値。0や空文字とは別物。
よくある質問
`int` と `float` は、どう使い分けますか?
個数、円の金額、IDのように「数えられるもの」は int、割合や測定値のように「連続的な量」は float が向いています。ただし float は誤差があるため、金額を小数で持つのは避け、最小単位の整数で持つのが基本です。
`'1000'` と `1000` を見分けるにはどうしますか?
type(x) で型を確認するか、print(repr(x)) で引用符付きの表示を見ます。引用符が付けば文字列です。データ分析では、CSVの列が文字列で読み込まれていないか、読み込み直後に確認する習慣が役立ちます。
郵便番号や電話番号は、数ではなく文字列で持つのはなぜですか?
先頭の0に意味があり(03-1234-5678)、足し算や平均を取らないからです。数として持つと 03 が 3 になり、桁が欠けます。「計算するか」で型を決める、と考えると迷いません。
`True` と `False` を、なぜ数のように計算できるのですか?
bool が int の仲間として作られていて、True は 1、False は 0 として扱われるからです。条件に合う件数を sum で数える場面で便利ですが、意図せず True + 1 が通ることもあるので、型を意識して使います。
金額の計算で、小数の誤差を避けるにはどうしますか?
円を整数で持ち、割合を掛けた後に丸め方(切り捨て・切り上げ・四捨五入)を決めて整数へ直します。さらに厳密さが必要な会計システムでは decimal.Decimal が使われます。どの丸め方にするかは、会社や取引の規則に従う必要があります。
`None` と `NaN` は同じですか?
別物です。None は「値がない」ことを表す特別な値、NaN は数としての計算結果が定まらない小数です。pandas では、欠損が NaN で表されることが多く、判定には isna などの専用の関数を使います。同じ「欠損」でも表し方は道具により違うので、確認が必要です。
確認問題
問1 type('1000') が表す型はどれか。
- ① int(整数)
- ② float(小数)
- ③ bool(真偽値)
- ④ str(文字列)
解答と解説
正解:④
引用符で囲まれた値は、中身が数字だけでも文字列です。数としての計算はできません。
問2 '120' * 3 を実行すると何が起きるか。
- ① '360' になる
- ② エラーにならず、文字列 '120120120' になる
- ③ 360 になる
- ④ TypeError になる
解答と解説
正解:②
文字列に整数を掛けると、文字列を繰り返す計算になります。エラーが出ないため、数の計算をしたつもりで気づけないことが危険です。
問3 0.1 + 0.2 == 0.3 を実行した結果はどれか。
- ① False(小数の誤差のため)
- ② True
- ③ TypeError
- ④ 0.3
解答と解説
正解:①
0.1 と 0.2 は2進法で正確には表せず、足し算の結果は 0.30000000000000004 になります。小数の一致は abs(差) < 許容誤差 で判定します。
問4 bool('False') の結果はどれか。
- ① 文字列 'False'
- ② エラー
- ③ True
- ④ False
解答と解説
正解:③
空でない文字列は、中身にかかわらず True になります。文字列 'True' / 'False' を真偽値に直すには、text == 'True' で比べます。
問5 売上データで、0 と None の違いとして適切な説明はどれか。
- ① 0 は売上が0円という値、None は売上の値がない(未入力など)という意味で、別物として扱う
- ② どちらも売上なしを表すので、同じ扱いでよい
- ③ None は 0 の別の書き方である
- ④ None を足し算に使うと自動的に 0 として扱われる
解答と解説
正解:①
0は観測された値、None は値がないことを表します。平均の分母に含めるか除くかで結果が変わるため、集計の仕様として決める必要があります。
問6 type(3 == 3.0).__name__ の結果と、3 == 3.0 の値の組はどれか。
- ① float と 3.0
- ② str と '3'
- ③ bool と True
- ④ int と 1
解答と解説
正解:③
比較演算の結果は bool です。3 と 3.0 は数として等しいので True になります。
次に学ぶこと
次は 演算子と型変換 で、int('1000') のような型変換と、// % ** などの演算子、丸め方を学びます。この授業で見た「文字と数の取り違え」を、変換で直す方法です。
この授業の確認問題だけでモジュールの習得とはしません。PY01 の総合テストと自力課題で判定します。pandas の列の型と欠損は 「型と欠損」(有料版) で扱います。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い