きれいに書く

INPUT · スライド

値の種類を書き添える

01 / 07

何を渡せばいいのか分からない

第3章で関数を覚えたとき、引数につけられるのは名前だけだった。def tashizan(a, b): という1行を見ても、a に何を渡せばいいのかは中を読むまで分からないね。

実際この関数は、数でも文字でも受け取ってしまう。書いた人が「数のつもり」でいても、そのつもりはどこにも書かれていないんだ。

def tashizan(a, b):    return a + bprint(tashizan(2, 3))print(tashizan("あ", "い"))

実行結果

5
あい

02 / 07

引数と返値に種類を書く

引数の名前のうしろに : 種類、) のうしろに -> 種類 と書く。これが型ヒント(かたヒント)だよ。

  • a: int … a には整数が来る
  • -> int … この関数は整数を返す

矢印は - と > を並べたもの。=> ではないので気をつけてね。

def tashizan(a: int, b: int) -> int:    return a + bprint(tashizan(2, 3))

実行結果

5

03 / 07

ふつうの変数にも書ける

関数だけの話ではない。変数にも、名前のうしろに : 種類 を置いてから = で値を入れられるよ。

よく使う種類の名前は、まずこの4つを覚えれば足りる。

  • int … 整数
  • float … 小数
  • str … 文字列
  • bool … True か False
namae: str = "ゆい"toshi: int = 15kaiin: bool = Trueprint(f"{namae} {toshi} {kaiin}")

実行結果

ゆい 15 True

04 / 07

入れ物は中身まで書く

リストや辞書は、中に何が入っているかまで書けるよ。カギカッコの中に中身の種類を並べるんだ。

  • list[int] … 整数のリスト
  • dict[str, int] … キーが文字列で、値が整数の辞書

ただの list より、ぐっと多くを伝えられるね。「点数のリスト」なのか「名前のリスト」なのかが、中を読まなくても分かる。

tens: list[int] = [90, 60, 75]tensuus: dict[str, int] = {"ゆい": 90, "はると": 60}print(len(tens))print(tensuus["ゆい"])

実行結果

3
90

05 / 07

無いかもしれない値

「見つかれば点数、見つからなければ None」のように、2種類のどちらかになることがあるね。そんなときは |(たてぼう)でつなぐ。

int | None は「整数か、さもなくば None」という意味。第1章でやった「値が無い」を、種類の側からも言えるようになったんだ。

def sagasu(namae: str) -> int | None:    tensuus = {"ゆい": 90, "はると": 60}    if namae in tensuus:        return tensuus[namae]    return Noneprint(sagasu("ゆい"))print(sagasu("みなと"))

実行結果

90
None

06 / 07

実行時にはチェックされない

ここがいちばん大事なところ。Python は型ヒントを実行時に見ていない。

a: int と書いた引数に文字列を渡しても、エラーにはならず、そのまま動いてしまうよ。型ヒントは書き添えたメモであって、見張り番ではないんだ。

def tashizan(a: int, b: int) -> int:    return a + bprint(tashizan("あ", "い"))

実行結果

あい

07 / 07

それでも書く理由

動きが1つも変わらないのに、なぜ書くのか。理由は2つだよ。

  • 読む人に意図が伝わる。def tashizan(a: int, b: int) -> int: の1行で、説明を読まなくても使いかたが分かる
  • エディタが間違いを教えてくれる。書いてあれば、数の引数に文字列を渡したところに線が引かれる

前のグループの docstring と同じで、動きのためではなく読む人のために書くもの。次のレッスンでは、この型ヒントが書く量まで減らしてくれる場面を見るよ。