python學習筆記之運算符

  • 目錄
  • 前言
  • 軟件環境
  • 身份運算符
  • 算術運算符
  • 比較運算符
  • 位移運算符
  • 自變運算符
  • 位運算符
  • 邏輯運算符
  • 成員關係運算符
  • Python真值表
  • 最後

前言

在前面的博文介紹了Python數據結構以後,接下來結合python操做符來對Python程序中的數據進行處理。操做符/運算符的使用,可簡潔地表示內建類型的對象處理。主要是對程序中的數據進行邏輯操做、算術操做、比較操做等動做行爲,本質是將在程序中會很是經常使用的程序操做封裝成成類或函數後,再以字符的形式調用,使執行程序語言更加簡潔和符合國際化。css

軟件環境

  • 操做系統
    • UbuntuKylin 14.04
  • 軟件
    • Python 2.7.6
    • IPython 4.0.0

身份運算符

身份運算符用來判斷兩個變量的引用對象是否指向同一個內存對象,即id(varibale1) ?= id(variable2)。
is:判斷兩個標識符是否是引用自一個對象
is not:判斷兩個標識符是否是引用自不一樣對象
須要注意的是: is 和 == 的意義並不相同。java

In [11]: [] == [] Out[11]: True In [12]: [] is [] Out[12]: False

歸納性而言,is 是判斷兩個變量是否引用同一個對象,而 == 則是判斷兩個變量引用的對象的值是否一致。要很好的理解二者間的區別須要從Python對象的三要素提及。
Python對象的三要素:id、type、value
id:是對象的惟一標識,是對象在內存中的存儲地址。
type:是對象的數據類型
value:是對象的值,是對象在內存中存放的數據。
其中is的判斷依據是對象的id,== 的判斷依據是對象value,例如:python

 1 In [25]: name1 = {'fan':'jmilk'}
 2 
 3 In [26]: name2 = name1.copy()
 4 
 5 In [27]: name1 == name2
 6 Out[27]: True
 7 
 8 In [28]: name1 is name2
 9 Out[28]: False
10 
11 In [29]: id(name1),id(name2)
12 Out[29]: (140197805793640, 140197805796720)

上述例子,name2是name1調用copy( )函數後返回的一個新的對象,因此二者的id( )不相等,而兩個變量在內存和中的vale倒是相等的。git

算術運算符

Operator Description
+\- 加\減,其中’+’能夠重載爲鏈接符,鏈接兩個字符或字符串
*\** 乘\求平,其中*能夠重載爲重複
/\%\// 除\求餘\取整除,其中%能夠重載爲格式化,取整除返回商的整數部分

**注:**Python除法須要注意的方面(Python 2.x版本,3.x版本不存在此問題)
1.Python中int型的數值相除,只能獲得int型不會返回小數。若返回值須要精確到小數時,有兩種方法。
方法一:除數或被除數須要有一者爲float型數值。算法

In [75]: float(1)/2 Out[75]: 0.5

方法二:import將來支持的語言特徵division(精確除法)
Python的’/’除法默認使用截斷除(Truncating Division),導入division模塊後,Python纔會默認使用精確除法。當導入了精確除後,若想再使用截斷除,可使用取整除’//’,同時也被成爲地板除。編程

 1 In [92]: %%file testFloat.py
 2 from __future__ import division
 3 a = 1
 4 b = 2
 5 print a/b
 6    ....: print a//b
 7    ....: 
 8 Overwriting testFloat.py
 9 
10 In [93]: run testFloat.py
11 0.5
12 0

隨便介紹兩個內建函數round(number[, ndigits])、divmod(x, y)
round(x[,n]):給定一個浮點數x,並按照指定精度返回一個浮點數對象,官方文檔以下:數據結構

In [109]: round.__doc__ Out[109]: 'round(number[, ndigits]) -> floating point number\n\nRound a number to a given precision in decimal digits (default 0 digits).\nThis always returns a floating point number. Precision may be negative.'

例子:編程語言

In [124]: round(1.11111111111,5) Out[124]: 1.11111

除了使用這種方法獲取指定精度的浮點數外,還可使用%格式化來輸出指定精度的浮雕數。函數

In [125]: a = 1.1111111111 In [126]: print '%.5f' %a 1.11111

%格式化能夠很是靈活的獲得知足需求的輸出數據的格式,之後咱們會繼續瞭解。
divmod(x, y):計算x,y的取整除和餘數,並以元組類型返回。官方文檔:spa

In [131]: divmod.__doc__ Out[131]: 'divmod(x, y) -> (quotient, remainder)\n\nReturn the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.'

例子:

In [133]: divmod(7,5) Out[133]: (1, 2)

比較運算符

Operator Description
> 大於
< 小於
>= 大於等於
<= 小於等於
== 等於,比較兩個對象的value是否相等,相等爲True
!= 不等於,比較兩個對象的value是否不相等,不相等爲True
<> 不等於,同!= 運算符

位移運算符

位移運算符是很是有效率的計算方法之一,在對數學運算和對程序執行效率要求高的程序中推薦使用。除了位移運算符以外,Python的按位運算符也是很是有效率的一種數據處理方法,以後會詳細的介紹。

Operator Description
<< a << n ⇒ a*(2**n)
>> a >> n ⇒ a/(2**n)

自變運算符

自變運算符能夠減小必定的代碼量,更重要的是,使用自變運算符能夠加快Python程序在內存中的執行效率。
值得注意的是:Python出於避免語法歧義的初衷,在Python語法中並無自增 i++ 或者 ++i的語法, ++i 只做用於數學運算操做符,如:

 1 In [18]: i = 1
 2 
 3 In [19]: ++i
 4 Out[19]: 1
 5 
 6 In [20]: +-i
 7 Out[20]: -1
 8 
 9 In [21]: --i
10 Out[21]: 1

 

Operator Description
+= a+=b ⇒ a=a+b
-= a-=b ⇒ a=a-b
*= a*=b ⇒ a=a*b
/= a/=b ⇒ a=a/b
%= a%=b ⇒ a=a%b
**= a**=b ⇒ a=a**b
//= a//=b ⇒ a=a//b

順便來比較一下 i = i+1 、i += 1 、i++ 三者間執行效率的高低(對通常編程語言而言)。
最低 i = i + 1
(1). 讀取右i的地址
(2). i+1
(3). 讀取左i的地址
(4). 將右i+1傳遞給左i,編譯器認爲左右兩個i是不一致的。
其次 i += 1
(1). 讀取左i的地址
(2). i+1
(3). 將i+1傳遞給i自身,編譯器會認爲只有同一個i
最高 i++
(1). 讀取i的地址
(2). 自增1
注意:在考慮到提高程序運行效率的同時,也要注意在使用i += 1的時候能夠會莫名其妙的出現語法錯誤,這種時候能夠考慮是否爲數據類型的類型隱式轉換錯誤。
以上的比較只是針對通常的編程語言而言,在Python中由於存在可變對象和非可變對象,並且不存在i++自增語言。可是使用自變運算符,的確能夠有效的減小代碼量和使程序更加簡潔。

位運算符

Operator Description
x | y 按位或(有1則1)
x & y 按位與(有0 則0)
x ^ y 位異或(不一樣爲1,相同爲0)
~x 取反

在Python中 | 、& 等運算符的意義不在於處理邏輯關係,而是二進制數據的位運算,數字以二進制形式的補碼存儲和計算,以原碼結果來顯示。若數字爲正值,他的補碼就是原碼自己。若數字爲負值,則他的補碼爲源碼減一再按位取反。兩個數字的計算本質是兩個二進制補碼的計算。
數字計算的實現原理
1的原碼:0000 0001 , 補碼: 0000 0001 (二進制的首個數字表明符號,不能夠改變)
-1的原碼:1000 0001 , 補碼:1111 1111

In [67]: -1 & 1
Out[67]: 1

即:
1111 1111
0000 0001
—————
0000 0001
其結果原碼爲 0000 0001(正數的補碼就是原碼自己)

In [68]: -1 | 1
Out[68]: -1

即:
1111 1111
0000 0001
—————
1111 1111
其結果原碼爲1000 0001(負數的原碼爲補碼減一再按位取反,首個數字表明符號不能夠改變)
因此,從數字計算的底層實現能夠看出。位移運算符是計算效率很是高的一種計算方法,尤爲能夠避免相似執行乘法時,所帶來的很是繁複的操做和實現過程。

邏輯運算符

Operator Description
and 邏輯與
or 邏輯或
not 邏輯非

在Python只可以將and、or、not三種運算符用做於邏輯運算,而不像C、Java等編程語言中可使用&、|、!,更加不能使用簡單邏輯於&&、簡單邏輯或||等邏輯運算符。因而可知,Python始終堅持着「只用一種最好的方法,來解決一個問題」的設計理念

成員關係運算符

成員運算符可以判斷一個指定對象是不是做爲一個容器中的元素,由此來判斷兩個對象間的關係。
容器:包含了其餘對象的引用的數據類型。

 

Operator Description
in 當一個對象存在一個容器中時爲Ture
not in 當一個對象不在一個容器中時爲True
In [72]: 1 in list
Out[72]: True

In [73]: 4 in list
Out[73]: False

In [74]: 4 not in list
Out[74]: True

In [75]: 1 not in list
Out[75]: False

Python真值表

Object Constant Value
「」 False
「Str」 True
0 False
1 True
()空元組 False
[]空列表 False
{}空字典 False
None False

最後

運算符在程序中一直都充當着很是重要的角色,多是編程的過程當中並不會徹底用的上,可是創建一個由本身編寫起來的運算符文檔,在日後的程序編寫中會變得很是的方便。

相關文章
相關標籤/搜索