typeで型を調べる
このレッスンで作るもの — 値の種類を調べる
typeを覚え、渡された値の型名を返す関数を作ります。
type で型を調べる
第 1 章で "120" と 120 は見た目が同じでも別物だという話をしました。この「値の種類」のことを 型 と呼びます。型が違うと、できることも変わります。
Python には値の型を教えてくれる type という命令があります。中身が何なのか分からなくなったときの確認手段です。
型の取り違えは、初心者がいちばん長くはまるバグです。分からなくなったら推測せず
typeで聞く、という習慣が遠回りに見えて最短です。
4 つの基本の型
このコースで当面使う型は下記の 4 つです。
int— 整数。120や0や-50float— 小数。1.5や0.25str— 文字列。"りんご"や"120"bool— 真偽値。TrueとFalse
120 は int、"120" は str です。クオートで囲むかどうかだけの違いに見えますが、中身はまったく別の型です。int は計算に使え、str は連結に使えます。
bool は次のレッスンで詳しく扱います。ここでは「そういう型がある」と知っておけば十分です。
type の書き方
type に値を渡すと、その型そのものが返ります。
print(type(120))
print(type("120"))表示は <class 'int'> と <class 'str'> になります。かっこや class という余分な飾りが付いていて、そのままでは扱いにくい形です。
型の名前だけがほしいときは __name__ を付けます。アンダースコアは前後に 2 本ずつです。
print(type(120).__name__)
print(type("120").__name__)こちらは int と str とだけ表示されます。今回の課題で使うのはこの形です。
__name__のようにアンダースコア 2 本で挟まれた名前は、Pythonがあらかじめ用意している特別な属性です。今は「型の名前を取り出す呪文」として覚えておけば構いません。
動きを追ってみる
type_name(120) を呼んだときの流れを追ってみます。
- 引数
valueに120が入る type(value)がintという型そのものを返す.__name__がそこから名前の文字列"int"を取り出す- その
"int"が戻り値になる
戻ってくるのは型そのものではなく、"int" という 文字列 である点が大事です。だから他の文字列と連結できます。
型が違うと何が起きるか
型の違いが実際にどう効くのかを見ておきます。
print(120 + 80)
print("120" + "80")上は 200 で、下は 12080 です。同じ + でも、int どうしなら足し算、str どうしなら連結になります。記号は同じでも、型によって意味が変わります。
print(120 + "80")これは TypeError になります。int と str は種類が違うので、足すことも連結することもできません。前回作った label_with_vars で金額を文字列のまま扱っていたのは、この TypeError を避けるためでした。次のレッスンからは、型をそろえる方法を覚えていきます。
TypeErrorが出たら、まず両側の型をtypeで確かめます。想像していた型と違っていることがほとんどです。
よくある間違い
__name__のアンダースコアの数を間違える — 前後とも 2 本ずつで合計 4 本です。1 本だとAttributeErrorになります。typeの結果をそのまま比べようとする —type(120)は"int"という文字列ではありません。文字列がほしいときは必ず.__name__を付けます。typeを変数名に使ってしまう —type = "食費"と書くと、以降typeが命令として使えなくなります。組み込みの名前は変数名に使いません。
手元で動かしてみる
kakeibo.py に下記を書いて実行すると、型の違いが一覧で見られます。
def type_name(value):
return type(value).__name__
print(type_name(120))
print(type_name("120"))
print(type_name(1.5))
print(type_name(""))int str float str と表示されます。空の文字列 "" にもちゃんと str という型があることが分かります。中身が空でも、型は消えません。
やってみよう
関数 type_name を実装してください。引数 value を 1 つ受け取り、その値の型名を文字列で返します。
type_name(120) は "int"、type_name("120") は "str"、type_name(1.5) は "float" を返します。type(value).__name__ をそのまま return するだけで完成します。
書けたら、自分でいろいろな値を渡して確かめてみてください。0 と "0" を渡すと、見た目が近いのに違う答えが返ってきます。その違いが次のレッスンの出発点になります。
要件
- 関数名は type_name で、引数は value の1つ
- type(value) の型名を文字列で return する
- 戻り値は "int" や "str" のような型名だけの文字列にする
- print ではなく return で返す
入出力例
type_name(120) → "int"
type_name("120") → "str"
type_name(1.5) → "float"
type_name("") → "str"
type_name(0) → "int"