typeで型を調べる

このレッスンで作るもの — 値の種類を調べる type を覚え、渡された値の型名を返す関数を作ります。

type で型を調べる

第 1 章で "120"120 は見た目が同じでも別物だという話をしました。この「値の種類」のことを と呼びます。型が違うと、できることも変わります。

Python には値の型を教えてくれる type という命令があります。中身が何なのか分からなくなったときの確認手段です。

型の取り違えは、初心者がいちばん長くはまるバグです。分からなくなったら推測せず type で聞く、という習慣が遠回りに見えて最短です。

4 つの基本の型

このコースで当面使う型は下記の 4 つです。

  • int — 整数。1200-50
  • float — 小数。1.50.25
  • str — 文字列。"りんご""120"
  • bool — 真偽値。TrueFalse

120int"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__)

こちらは intstr とだけ表示されます。今回の課題で使うのはこの形です。

__name__ のようにアンダースコア 2 本で挟まれた名前は、Python があらかじめ用意している特別な属性です。今は「型の名前を取り出す呪文」として覚えておけば構いません。

動きを追ってみる

type_name(120) を呼んだときの流れを追ってみます。

  1. 引数 value120 が入る
  2. type(value)int という型そのものを返す
  3. .__name__ がそこから名前の文字列 "int" を取り出す
  4. その "int" が戻り値になる

戻ってくるのは型そのものではなく、"int" という 文字列 である点が大事です。だから他の文字列と連結できます。

diagram (will load when visible)

型が違うと何が起きるか

型の違いが実際にどう効くのかを見ておきます。

print(120 + 80) print("120" + "80")

上は 200 で、下は 12080 です。同じ + でも、int どうしなら足し算、str どうしなら連結になります。記号は同じでも、型によって意味が変わります。

print(120 + "80")

これは TypeError になります。intstr は種類が違うので、足すことも連結することもできません。前回作った label_with_vars で金額を文字列のまま扱っていたのは、この TypeError を避けるためでした。次のレッスンからは、型をそろえる方法を覚えていきます。

TypeError が出たら、まず両側の型を type で確かめます。想像していた型と違っていることがほとんどです。

よくある間違い

  1. __name__ のアンダースコアの数を間違える — 前後とも 2 本ずつで合計 4 本です。1 本だと AttributeError になります。
  2. type の結果をそのまま比べようとするtype(120)"int" という文字列ではありません。文字列がほしいときは必ず .__name__ を付けます。
  3. 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" を渡すと、見た目が近いのに違う答えが返ってきます。その違いが次のレッスンの出発点になります。

要件

  1. 関数名は type_name で、引数は value の1つ
  2. type(value) の型名を文字列で return する
  3. 戻り値は "int" や "str" のような型名だけの文字列にする
  4. print ではなく return で返す

入出力例

type_name(120)"int" type_name("120")"str" type_name(1.5)"float" type_name("")"str" type_name(0)"int"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
main.py
学習モード

メモ

typeで型を調べる

⌘S で保存