型シリーズの1つめ。int型について取り扱います。
ここではint型と表現していますが、実際にそんな「型」があるのかと言われると多分ありません。Pythonはいろいろと厳格にしようとしていると思えます。フシがあります。ですが、公式ドキュメントでは型となんぞや?とか関数って何?みたいな話になると真正面から答えてくれず、ときおり何の断りもなく曖昧さを持ったまま用語を用いているように思えてなりません。それは単に私の勉強不足なのかも知れませんが、私が理解したこと以上のことを説明するのは無理な話なので、そういう部分については通じればOKというスタンスでご容赦ください。
ちなみに整数型という表現をとるとint以外にboolも整数型です。
ここで学習すること
サンプルコード
sample01.py
#!/usr/bin/env python3.8 num = 1 print(num) num = 0o777 # 8進数 print(num) num = 0xffff # 16進数 print(num) num = 0b11111111 # 2進数 print(num)
sample02.py
#!/usr/bin/env python3.8 import sys import linecache def exception_info(): exc_type, exc_obj, tb = sys.exc_info() f = tb.tb_frame lineno = tb.tb_lineno filename = f.f_code.co_filename linecache.checkcache(filename) line = linecache.getline(filename, lineno, f.f_globals) return 'EXCEPTION IN ({}, LINE {} "{}"): {}'.format(filename, lineno, line.strip(), exc_obj) try: a = 1 x = int(a) print(x) print("result: " + str(x)) print("result: " + x) except Exception as ex: print(exception_info()) try: a = 2.1 x = int(a) print(x) print("result: " + str(x)) print("result: " + x) except Exception as ex: print(exception_info()) try: a = "3" x = int(a) print(x) print("result: " + str(x)) print("result: " + x) except Exception as ex: print(exception_info()) try: a = "4.1" x = int(a) print(x) print("result: " + str(x)) print("result: " + x) except Exception as ex: print(exception_info()) try: a = "a" x = int(a) print(x) print("result: " + str(x)) print("result: " + x) except Exception as ex: print(exception_info())
説明
型としてのint
intとはinteger(整数)を表す型です。Pythonはなかなか型にうるさい言語で、そのくらい黙ってやってくれないの?って感じることは多々ありますが…そのあたりは次のintへの変換に譲ります。
num = 1 # 10進数
これはごくごく単純なint型です。整数の1を代入しています。
このほか、以下のように10進数以外の値もサポートしています。
num = 0o777 # 8進数 num = 0xffff # 16進数 num = 0b11111111 # 2進数
0oで始まる数値は 8進数とみなされ、0xで始まる数値は16進数とみなされ、0bで始まる数値は 2進数とみなされます。
実行
sample01.pyを実行してみます。
$ python sample01.py 1 511 65535 255 $
10進数以外でもprint()で表示することは可能ですが、全てが10進数で表示されます。進数を意識して表示したいときは書式指定文字列の文法を参照の上、出力に一手間加える必要があります。このトピックについてはまた機会を改めて。
intへの変換
続いてintへの変換です。
ごちゃごちゃ言わずに、sample02.pyを実行してみます。
実行
$ python sample02.py 1 result: 1 EXCEPTION IN (sample02.py, LINE 21 "print("result: " + x)"): can only concatenate str (not "int") to str 2 result: 2 EXCEPTION IN (sample02.py, LINE 30 "print("result: " + x)"): can only concatenate str (not "int") to str 3 result: 3 EXCEPTION IN (sample02.py, LINE 39 "print("result: " + x)"): can only concatenate str (not "int") to str EXCEPTION IN (sample02.py, LINE 45 "x = int(a)"): invalid literal for int() with base 10: '4.1' EXCEPTION IN (sample02.py, LINE 54 "x = int(a)"): invalid literal for int() with base 10: 'a' $
まずintへの変換ですが、1と2.1と”3″はそれぞれ1,2,3と変換されますが、”a”は当然ですが”4.1″は変換されずエラーとなります。
print()での出力は、単体で引数として引き渡されると問題無く表示してくれますが、”result: “を前に加えよう思ったときにはエラーとなります。文字列と整数の+演算をしてからのprint()です。あくまで文字列と文字列の+演算でなければ成立しないので、str()を使ってまず文字列に変換しなければなりません。
当たり前でしょ?そう、当たり前です。もう一つ当たり前のこととして、Pythonはスクリプト言語なので、事前にチェックはしてくれません。何万行とと書いたプログラムのうち、1カ所だけ実行する時に文字列+文字列ではないと指摘されエラーとなります。
ご丁寧なことに「intではなくstrじゃないと+演算できないのよ」と全てお見通し状態でエラーにしてくれてます。分かってんだったらやってよってなもんですね。
きちんとテストしていないと、exceptでエラー処理中に再びエラーのようなお間抜けな事態になりかねません。