1. 程式人生 > 程式設計 >Python基本語法之運算子功能與用法詳解

Python基本語法之運算子功能與用法詳解

本文例項講述了Python基本語法之運算子功能與用法。分享給大家供大家參考,具體如下:

前言

在前面的博文介紹了Python的資料結構之後,接下來結合Python操作符來對Python程式中的資料進行處理。操作符/運算子的使用,可簡潔地表示內建型別的物件處理。主要是對程式中的資料進行邏輯操作、算術操作、比較操作等動作行為,本質是將在程式中會非常常用的程式操作封裝成成類或函式後,再以字元的形式呼叫,使執行程式語言更加簡潔和符合國際化。

軟體環境

  • 作業系統
    • UbuntuKylin 14.04
  • 軟體
    • Python 2.7.6
    • IPython 4.0.0

身份運算子

身份運算子用來判斷兩個變數的引用物件是否指向同一個記憶體物件,即id(varibale1) ?= id(variable2)。
is:判斷兩個識別符號是不是引用自一個物件
is not:判斷兩個識別符號是不是引用自不同物件
需要注意的是: is 和 == 的意義並不相同。

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

概括性而言,is 是判斷兩個變數是否引用同一個物件,而 == 則是判斷兩個變數引用的物件的值是否一致。要很好的理解兩者間的區別需要從Python物件的三要素說起。

Python物件的三要素:id、type、value

  • id:是物件的唯一標識,是物件在記憶體中的儲存地址。
  • type:是物件的資料型別
  • value:是物件的值,是物件在記憶體中存放的資料。

其中is的判斷依據是物件的id,== 的判斷依據是物件value,例如:

In [25]: name1 = {'fan':'jmilk'}
In [26]: name2 = name1.copy()
In [27]: name1 == name2
Out[27]: True
In [28]: name1 is name2
Out[28]: False
In [29]: id(name1),id(name2)
Out[29]: (140197805793640,140197805796720)

上述例子,name2是name1呼叫copy( )函式後返回的一個新的物件,所以兩者的id( )不相等,而兩個變數在記憶體和中的vale卻是相等的。

算術運算子

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才會預設使用精確除法。當匯入了精確除後,若想再使用截斷除,可以使用取整除'//',同時也被成為地板除。

In [92]: %%file testFloat.py
from __future__ import division
a = 1
b = 2
print a/b
  ....: print a//b
  ....:
Overwriting testFloat.py
In [93]: run testFloat.py
0.5
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的取整除和餘數,並以元組型別返回。官方文件:

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 只作用於數學運算操作符,如:

In [18]: i = 1
In [19]: ++i
Out[19]: 1
In [20]: +-i
Out[20]: -1
In [21]: --i
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

最後

運算子在程式中一直都充當著非常重要的角色,可能是程式設計的過程中並不會完全用的上,但是建立一個由自己編寫起來的運算子文件,在往後的程式編寫中會變得非常的方便。

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python數學運算技巧總結》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。