今天來了解一下 Python 整數的小知識和運算。
整數也是一種物件,屬於 int 型別。一個整數佔多少記憶體?
import sys
print('size of 0:', sys.getsizeof(0))
print('size of 1:', sys.getsizeof(1))
size of 0: 24
size of 1: 28
觀察上述程式碼,可以發現整數 0 物件基本就要佔據 24 bytes,可說是一個整數物件的最低「成本」。
整數 1 呢?佔據 28 bytes,比整數 0 多了四個 byte。
整數越大,所佔記憶體也越大。
print('size of 2**32:', sys.getsizeof(2**32))
size of 2**32: 32
整數的加、減、乘運算都還是整數:
print(type(1+2))
print(type(1-2))
print(type(1*2))
<class 'int'>
<class 'int'>
<class 'int'>
除法比較特別,會變成浮點數(float):
print(type(2/1))
<class 'float'>
我們常用到一種運算:捨去浮點數的小數點取整數。
a // b
或
import math
math.floor(a / b)
這在正數運算時沒問題:
from math import floor
print(floor(2.5))
2
但小心!遇到負數可能跟你想的不同:
print(floor(-2.5))
-3
不是 -2 是 -3,這是怎麼回事?
要方便理解這個現象,我們可以這樣記:以下的恆等式永遠成立
A = floor(A / B) * B + A % B
我們分別用正數和負數來驗證這個恆等式:
7 == floor(7 / 3) * 3 + (7) % 3
True
-7 == floor(-7 / 3) * 3 + (-7) % 3
True
可發現上述負數運算時,floor(-7/3) 值是 -3, (-7) % 3 值是 2!
-7 = -2 * 3 + 2
其實英文的 floor 是「地板」的意思,代表取小於或等於該數字的整數。
檢查看看是不是取「地板」:
print(floor(2.5))
print(floor(-2.5))
2
-3
明天我們就來用今天學到的恆等式,自己來發明一個N進位計算機!很酷的,明天見~
參考:Python 3: Deep Dive (Part 1 - Functional)