| 算術(shù)運算符是處理四則運算的符號,在數(shù)字的處理中應(yīng)用得最多。Python 支持所有的基本算術(shù)運算符,如表 1 所示。 
 
 
表 1 Python常用算術(shù)運算符
| 運算符 | 說明 | 實例 | 結(jié)果 |  
| + | 加 | 12.45 + 15 | 27.45 |  
| - | 減 | 4.56 - 0.26 | 4.3 |  
| * | 乘 | 5 * 3.6 | 18.0 |  
| / | 除 | 7 / 2 | 3.5 |  
| % | 取余,即返回除法的余數(shù) | 7 % 2 | 1 |  
| // | 整除,返回商的整數(shù)部分 | 7 // 2 | 3 |  
| ** | 冪,即返回 x 的 y 次方 | 2 ** 4 | 16,即 24 |  
  
接下來將對表 1 中各個算術(shù)運算符的用法,一一做詳細講解。 
+ 加法運算符例如如下代碼:除此之外,“+”還可以作為字符串(包括后續(xù)要介紹的序列)的連接運算符。例如如下代碼:a = 5.2b = 3.1the_sum = a + b# sum的值為8.3print("the_sum的值為:", the_sum)
 s1 = 'Hello, 's2 = 'Charlie'# 使用+連接兩個字符串print(s1 + s2)
- 減法運算符例如如下代碼:此外,“-”除了可以作為減法運算符之外,還可以作為求負的運算符。請看如下代碼:c = 5.2d = 3.1sub = c - d# sub的值為2.1print("sub的值為:", sub)
但單目運算符“+”則不對操作數(shù)做任何改變,例如如下代碼:# 定義變量x,其值為-5.0x = -5.0# 將x求負,其值變成5.0x = -xprint(x)
# 定義變量y,其值為-5.0y = -5.0# y值依然是-5.0y = +yprint(y)
*乘法運算符例如如下代碼:此外,“*”還可以作為字符串(包括后續(xù)要介紹的序列)的連接運算符,表示將 N 個字符串連接起來。例如如下代碼:e = 5.2f = 3.1multiply = e * f# multiply的值為16.12print("multiply的值為:", multiply)
上面代碼將會輸出:s3 = 'crazyit '# 使用*將5個字符串連接起來print(s3 * 5)
crazyit crazyit crazyit crazyit crazyit 
/ 和 // 除法運算符Python 的除法運算符有兩個:“/”表示普通除法,使用它除出來的結(jié)果與平常數(shù)學(xué)計算的結(jié)果是相同的(即除不盡時,會產(chǎn)生小數(shù)部分);而“//”表示整除,使用它除出來的結(jié)果只有整數(shù)部分,小數(shù)部分將會被舍棄。例如如下代碼:此外,Python 不允許使用 0 作為除數(shù),否則將會引發(fā) ZeroDivisionError 錯誤。print("19/4的結(jié)果是:", 19/4)print("19//4的結(jié)果是:", 19//4)aa = 5.2bb = 3.1# aa / bb的值將是1.67741935483871print("aa/bb的值是:", aa / bb)# aa // bb值將是1.0print("aa//bb的值是:", aa // bb)
 
在有些編程語言中,0 作為除數(shù)會得到無窮大,包括正無窮大或負無窮大。對于 Python 2.x 而言,它只提供了一個“/”運算符,該運算符是 Python 3.x 中“/”和“//”的綜合版。對于 Python 2.x 中的“/”而言,它既是整除運算符,也是非整除運算符。規(guī)則如下: 
當(dāng)兩個操作數(shù)都是整數(shù)時,Python 2.x 中的“/”就是整除運算符。
當(dāng)兩個操作數(shù)有一個是浮點數(shù)(或兩個都是浮點數(shù))時,Python 2.x 中的“/”就是非整除運算符。
 例如,在 Python 2.x 的交互式解釋執(zhí)行器中執(zhí)行如下代碼:
 
>>>print(5/2)2
 >>>print(5.0/2)
 2.5
 >>>print(5/2.0)
 2.5
 >>>print(5.0/2.0)
 2.5
 
% 求余運算符Python 不要求求余運算符的兩個操作數(shù)都是整數(shù),Python 的求余運算符完全支持對浮點數(shù)求余。求余運算的結(jié)果不一定總是整數(shù),它是使用第一個操作數(shù)來除以第二個操作數(shù),得到一個整除的結(jié)果后剩下的值就是余數(shù)。
 由于求余運算也需要進行除法運算,因此求余運算的第二個操作數(shù)不能是 0,否則程序會報出 ZeroDivisionError 錯誤。
 
 例如如下程序:
 這里需要注意的一點是,使用 % 求余,如果除數(shù)(第二個操作數(shù))是負數(shù),那么取得的結(jié)果也一定是負數(shù)。因此,運行上面程序,可以看到如下輸出結(jié)果:print("5%3的值為:", 5 % 3) # 輸出2print("5.2%3.1的值為:",5.2 % 3.1) # 輸出2.1print("-5.2%-3.1的值為:", -5.2 % -3.1) # 輸出-2.1print("5.2%-2.9的值為:", 5.2 % -2.9) # 輸出-0.6print("5.2%-1.5的值為:", 5.2 % -1.5) # 輸出-0.8print("-5.2%1.5的值為:", -5.2 % 1.5) # 輸出0.8#print("5對0.0求余的結(jié)果是:", 5 % 0.0) # 導(dǎo)致錯誤
5%3的值為: 2前三個算式的運行結(jié)果比較簡單,它們進行的都是很簡單的求余計算。但 5.2 % -2.9 的結(jié)果有點奇怪,我們預(yù)計它為 -0.6,但實際輸出的是 -0.5999999999999996。這里有兩個問題:5.2%3.1的值為: 2.1
 -5.2%-3.1的值為: -2.1
 5.2%-2.9的值為: -0.5999999999999996
 5.2%-1.5的值為: -0.7999999999999998
 -5.2%1.5的值為: 0.7999999999999998
 
第一個問題,為什么預(yù)計 5.2 % 2.9 的結(jié)果是 -0.6 呢?因為 Python 求余運算的邏輯是用被除數(shù)減去除數(shù)的 N 倍,此處的 N 是 -2,因此得到結(jié)果是 0.6。
第二個問題,為什么實際輸出的是 -0.5999999999999996 呢?這是由浮點數(shù)的存儲機制導(dǎo)致的。計算機底層的浮點數(shù)的存儲機制并不是精確保存每一個浮點數(shù)的值,讀者暫時不需要花太多的時間去理解浮點數(shù)的存儲機制,只要知道浮點數(shù)在 Python 中可能產(chǎn)生精度丟失的問題就行。比如此處正常計算的結(jié)果應(yīng)該是 -0.6,但實際計算出來的結(jié)果是一個非常接近 -0.6 的值。
 
** 乘方運算符Python 支持使用“**”作為乘方運算符,這是一個使用非常方便的運算符。由于開方其實是乘方的逆運算,因此實際上使用“**”也可進行開方運算。例如如下代碼:
 print('5 的 2 次方:', 5 ** 2) # 25print('4 的 3 次方:', 4 ** 3) # 64print('4 的開平方:', 4 ** 0.5) # 2.0print('27 的開 3 次方:',27 **(1 / 3 )) # 3.0
 |