目錄 | 上一節 (1.2 第一個程式) | 下一節 (1.4 字串)
1.3 數字
本節討論數學計算。
數字型別
Python 有 4 種型別的數字:
- 布林型
- 整型
- 浮點型
- 複數(虛數)
布林型(bool)
布林型數字有兩個值:True
,False
。
a = True
b = False
在數值上,它們被計算成值為 1
,0
的數。
c = 4 + True # 5
d = False
if d == 0:
print('d is False')
但是,不要像上面這樣寫程式碼,這會很奇怪。
整型(int)
任意大小的有符號值,或者以任意數為基數的有符號值。
a = 37
b = -299392993727716627377128481812241231
c = 0x7fa8 # Hexadecimal
d = 0o253 # Octal
e = 0b10001111 # Binary
常用操作:
x + y Add
x - y Subtract
x * y Multiply
x / y Divide (produces a float)
x // y Floor Divide (produces an integer)
x % y Modulo (remainder)
x ** y Power
x << n Bit shift left
x >> n Bit shift right
x & y Bit-wise AND
x | y Bit-wise OR
x ^ y Bit-wise XOR
~x Bit-wise NOT
abs(x) Absolute value
浮點型(float)
使用十進位制或者指數表示法來指定浮點數的值:
a = 37.45
b = 4e5 # 4 x 10**5 or 400,000
c = -1.345e-10
使用浮點數表示 IEEE 754 標準的雙精度。這與 C 語言中的 double
型別相同。
17 digits of precision
Exponent from -308 to 308
請注意,當代表小數時,浮點數是不精確的。
>>> a = 2.1 + 4.2
>>> a == 6.3
False
>>> a
6.300000000000001
>>>
這不是 Python 的問題,而是 CPU 硬體上底層浮點硬體的問題。
常用操作:
x + y Add
x - y Subtract
x * y Multiply
x / y Divide
x // y Floor Divide
x % y Modulo
x ** y Power
abs(x) Absolute Value
除了按位運算子之外,浮點數的運算子與整數的運算子是一樣的。
其它數學函式可以在 math
中找到。
import math
a = math.sqrt(x)
b = math.sin(x)
c = math.cos(x)
d = math.tan(x)
e = math.log(x)
比較
下面的比較/關係運算子可以應用於數字:
x < y Less than
x <= y Less than or equal
x > y Greater than
x >= y Greater than or equal
x == y Equal to
x != y Not equal to
可以使用 and
, or
,not
組成更復雜的布林表示式。
這裡有一些例子:
if b >= a and b <= c:
print('b is between a and c')
if not (b < a or b > c):
print('b is still between a and c')
轉換數字
型別名可以被用來將其它資料轉換為數字。
a = int(x) # Convert x to integer
b = float(x) # Convert x to float
試試下面這些操作:
>>> a = 3.14159
>>> int(a)
3
>>> b = '3.14159' # It also works with strings containing numbers
>>> float(b)
3.14159
>>>
習題
提醒:這些習題假定你正在 practical-python/Work
目錄中操作,具體在 mortgage.py
檔案。
習題 1.7:戴夫的抵押貸款
戴夫決定從 Guido 的抵押貸款、股票投資和比特幣交易公司獲得 50 萬美元的 30 年期固定利率抵押貸款。利率是 5%,每月還款額是 2684.11 美元。
下面這個程式用於計算戴夫在抵押期內需要支付的總金額:
# mortgage.py
principal = 500000.0
rate = 0.05
payment = 2684.11
total_paid = 0.0
while principal > 0:
principal = principal * (1+rate/12) - payment
total_paid = total_paid + payment
print('Total paid', total_paid)
輸入該程式並執行,你應該會得到答案為 966,279.6
。
習題 1.8:額外付款
假設戴夫在抵押期的前 12 個月每月額外支付 1000 美元。
修改程式以包含這部分額外的付款,並且輸出已支付的總金額以及所需的月數。
當你執行這個新程式時,它應該報告 342 個月的總付款額是 929,965.62
。
習題 1.9:製作一個額外的付款計算器
修改程式,以便可以更一般的處理額外的付款資訊。做到這一點,以便使用者可以設定下面這些變數:
extra_payment_start_month = 61
extra_payment_end_month = 108
extra_payment = 1000
使程式檢視這些變數,並適當地計算總付款額 。如果戴夫從抵押期的第五年開始,每月額外支付 1000 每月並支付 4 年,那麼他將要支付多少?
習題 1.10:製作表格
修改程式,使其顯示迄今為止支付的月數,支付的總金額和剩餘的本金。輸出看起來應該像下面這樣:
1 2684.11 499399.22
2 5368.22 498795.94
3 8052.33 498190.15
4 10736.44 497581.83
5 13420.55 496970.98
...
308 874705.88 3478.83
309 877389.99 809.21
310 880074.1 -1871.53
Total paid 880074.1
Months 310
習題 1.11:獎金
使用該程式時,請修復程式以糾正發生在上個月的超額支付。
習題 1.12:一個謎
int()
函式和 float()
函式可以將其它型別的資料轉換為數字型別。示例:
>>> int("123")
123
>>> float("1.23")
1.23
>>>
考慮到這一點,你能否解釋下面這種行為?
>>> bool("False")
True
>>>