Pythonには「変数の型」はあるのですか?
あります。
色々なプログラミング言語を扱っていると、変数の型を宣言する必要がある言語、ない言語があることに気が付きます。
CやJavaといったコンパイラ言語の多くは変数の型を宣言する必要があります。
BashやPythonといったインタプリタ言語の多くは変数の型を宣言する必要がありません。
コンパイラ言語は、コンパイルすることでソースコードをCPUネイティブなバイナリに変換する際に、変数の型をチェックします。
インタプリタ言語は、1行ずつ読み取り実行しながら、変数の型を調べます。
重要なのは、プログラマにとって、「この変数はint
だよね」とか、「定数だから代入はできないんだよね」と、理解していることです。
Pythonの場合は、関数の閉じタグやif
や for
の閉じタグさえも省略してきたわけで、それによる可読性は上がったでしょ?だから、プログラマがわかっていることは改めて記述する必要はないよね。
という、事になっています。
ただ、わかっていることとはいえ、忘れてしまうことも多いので、プログラマにとって、「ルールで制限をもたせることはバグを少なくできる一つの方法だ」と考える人が多いのも事実です。
プログラマは、コードを書いているうちに、どういったデータを扱っているのかを見失いがちです。
同じような関数を2つ書いてみたり、同一のデータを持つ変数をむやみに量産してしまうのもそういった「制限」に甘えてしまうことが原因なのです。
そもそもPythonにはどんな方があるのか
たくさんありますが、以下の型が一般的です。
組み込み型 | 説明 |
---|---|
str | 文字列 |
int | 整数 |
float | 浮動小数点数 |
bool | 真偽値 |
list | リスト(配列) |
tuple | タプル(配列) |
dict | 連想配列 |
set | 集合型 |
変数の型を宣言できるのか?
できます。
こういったことを「変数の型をアノテーション」する。と言います。
ash-3.2$ python
Python 3.9.1 (default, Jan 31 2021, 19:51:51)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a : int = 0
>>> print(a)
0
>>>
なんか逆のような気が・・・。
直感的にCやJavaと逆ではないでしょうか?
Cだと以下のとおりですから。
int a=0;
適用すべき場所は?
グローバル変数、ローカル変数で宣言するとき
関数の引数と戻り値
#!/usr/local/env python3
# グローバル変数として宣言するときに変数の型を指定
size:int=0
AGE:int=20
# 関数の引数を受け取るときに変数の型を指定
# 戻り値の型は 引数の後ろで指定する
def size_increment(size:int)->int:
global AGE
size+=1
print("AGE: " + str(AGE))
return size
print("size: " + str(size_increment(size)))
bash-3.2$ python test.py
AGE: 20
size: 1
bash-3.2$
まず簡単なのは、変数を宣言するときです。
# グローバル変数として宣言するときに変数の型を指定
size:int=0
AGE :int=20
関数に関して、引数は変数の宣言と形式と同じです。
# 関数の引数を受け取るときに変数の型を指定
def size_increment(size:int)->int:
関数の戻り値return
の型は ->int:
といった書き方となります。
def size_increment(size:int)->int:
ただ問題が
問題は、「型に合わないものは処理しない」わけではないのです。
ひょえー。
でもいいんです。
プログラマが自分で書いたソースをみて間違いに気がつくことも多いです。
ちょっとした気遣いがあとあと楽になることも多いです。
アノテーション、ばんばん書きましょう。