Python 內建三種不同型別的數字:整數(int)、浮點數(float)與複數(complex)。
分數(fractions.Fraction)與 Decimals(decimal.Decimal)也可以從標準函式庫匯入使用。
整數,包括十六進位(hex())、八進位(oct())與二進位(bin())數字,只要沒有小數位,同樣會被視為ints:
# Ints are whole numbers.
>>> 1234
1234
>>> type(1234)
<class 'int'>
>>> -12
-12
含有小數點的數字(不論是否帶有小數部分)會被視為floats:
>>> 3.45
3.45
>>> type(3.45)
<class 'float'>
Python 完整支援這些不同數字型別之間的算術運算,並且在使用二元算術運算子(+、-、*、/、//與%)時,會把較窄的數字轉換成較寬的對應型別。
加法和減法運算子的行為與一般數學相同。
如果其中一個或多個運算元是float,其餘的int也會一併轉換成float:
>>> 5 - 3
2
# The int is widened to a float here, and a float is returned.
>>> 3 + 4.0
7.0
與加法和減法一樣,乘法會把較窄的數字轉換成較寬的對應型別:
>>> 3 * 2
6
>>> 3 * 2.0
6.0
除法一律回傳float,即使結果是整數也一樣:
>>> 6/5
1.2
>>> 6/2
3.0
如果你需要int的結果,可以使用向下取整除法來截去結果的小數部分。
向下取整除法是使用//運算子來完成的:
>>> 6//5
1
>>> 6//2
3
取餘數運算子(%)會回傳兩個運算元相除後的餘數:
# The result of % is zero here, because dividing 8 by 2 leaves no remainder
>>> 8 % 2
0
# The result of % is 2 here, because 3 only goes into 5 once, with 2 leftover
>>> 5 % 3
2
換個角度來看 5 % 3:
>>> whole_part = int(5/3)
1
>>> decimal_part = 5/3 - whole_part
0.6666666666666667
>>> whole_remainder = decimal_part * 3
2.0
Python 有一個內建函式round(number, <decimal_places>),可以將浮點數四捨五入到指定的小數位數。
如果沒有指定小數位數,數字會四捨五入到最接近的整數,並回傳int:
>>> round(3.1415926535, 2)
3.14
>>> round(3.1415926535)
3
Python 允許你使用括號將運算式分組。 當你想覆寫預設的運算順序時,這就很有用。
>>> 2 + 3 * 4
14
>>> (2 + 3) * 4
20
Python 遵循 PEMDAS 規則來決定運算子的優先順序。
這表示()內的運算有最高的優先順序,其次是**,再來是*、/、//、%、+與-:
>>> 2 + 3 - 4 * 4
-11
>>> (2 + 3 - 4) * 4
4
# In the following example, the `**` operator has the highest priority, then `*`, then `+`
# Meaning we first do 4 ** 4, then 3 * 64, then 2 + 192
>>> 2 + 3 * 4 ** 4
770
Python 中的整數具有任意精度,其位數只受限於主機系統可用的記憶體。
浮點數通常是用 C 的double來實作(精確度為 15 位小數),但表示方式會因主機系統而異。
複數則有real和imaginary兩個部分,兩者都以浮點數表示。
如果想更深入了解各種程式語言中浮點數運算的問題與限制,可以看看 0.30000000000000004.com 以及 The Python Tutorial。
你任職的公司想減少碳足跡,因此希望你寫一支程式,用來計算他們電子設備的用電量和運轉成本。
你的雇主有一個程式,可以計算不同電子設備的運轉時間。目前時間是以小時為單位儲存。當你的雇主把時數加總時,發現時間長度不正確。他們希望你替時間資料再加上 3 小時。他們也想知道,在把資料換算成「完整」天數(一天是 24 小時)之後,會剩下多少「額外」時數。要換算的時間未必是完整的天數。
實作一個 get_extra_hours() 函式,接受一個代表時數的整數。這個函式應該做出適當的「額外時數」調整,然後 return 一個整數,代表必須從總時數中扣除多少小時,才能得到以「完整」天數表示的時間。
>>> get_extra_hours(25)
4
你的雇主想知道各個電子設備以 kW 計算的用電量。kW 代表千瓦(kilowatt),其中瓦特是功率的單位。單位名稱中的 kilo 是公制字首,意思是 1000。1 千瓦等於 1000 瓦特。
實作一個 get_kW_value() 函式,接受一個代表瓦特數的整數。這個函式應該把瓦特數換算成千瓦,然後 return 四捨五入到小數點後 1 位的結果。
>>> get_kW_value(1150)
1.2
為了計算電子設備的運轉成本,你的雇主需要知道以 kWh 表示的用電量。kWh 代表千瓦小時(kilowatt-hour),其中小時是時間單位。1 千瓦小時等於 1000 瓦特持續使用 1 小時。1 小時由 60 分鐘組成,1 分鐘由 60 秒組成。1 小時等於 3600 秒。要計算 kWh 值,你必須把瓦特換算成 kW,再將結果除以 3600 並向下取整。
實作一個 get_kWh_value() 函式,接受一個代表瓦特數的整數。這個函式應該 return 千瓦小時數,並以整數表示。
>>> get_kWh_value(5000000)
1
電子設備並非 100% 有效率。因此,你的雇主希望你計算電子設備的_效率_。要取得效率,你必須把功率因數(0 到 100 之間的浮點數)除以 100。
實作一個 get_efficiency() 函式,接受一個代表功率因數的浮點數。這個函式應該 return 計算出的效率,並以浮點數表示。
>>> get_efficiency(80)
0.8
你的雇主想知道電子設備的運轉成本。運轉成本等於使用的電力乘以每 kWh 的成本。使用的電力等於給定的功率除以計算出的效率。
實作一個 get_cost(<watts>,<power_factor>,<price>) 函式,接受一個代表瓦特數的整數、一個代表功率因數的浮點數,以及一個代表每 kWh 成本的浮點數。這個函式應該 return 電子設備的運轉成本,並以浮點數表示。
>>> get_cost(5000000, 80, 0.25)
0.3125