Python基本語法之運算符功能與用法詳解
本文實例講述了Python基本語法之運算符功能與用法。分享給大家供大家參考,具體如下:
前言
在前面的博文介紹了Python的數(shù)據(jù)結(jié)構(gòu)之后,接下來結(jié)合Python操作符來對Python程序中的數(shù)據(jù)進行處理。操作符/運算符的使用,可簡潔地表示內(nèi)建類型的對象處理。主要是對程序中的數(shù)據(jù)進行邏輯操作、算術(shù)操作、比較操作等動作行為,本質(zhì)是將在程序中會非常常用的程序操作封裝成成類或函數(shù)后,再以字符的形式調(diào)用,使執(zhí)行程序語言更加簡潔和符合國際化。
軟件環(huán)境
- 操作系統(tǒng)
- UbuntuKylin 14.04
- 軟件
- Python 2.7.6
- IPython 4.0.0
身份運算符
身份運算符用來判斷兩個變量的引用對象是否指向同一個內(nèi)存對象,即id(varibale1) ?= id(variable2)。
is:判斷兩個標(biāo)識符是不是引用自一個對象
is not:判斷兩個標(biāo)識符是不是引用自不同對象
需要注意的是: is 和 == 的意義并不相同。
In [11]: [] == [] Out[11]: True In [12]: [] is [] Out[12]: False
概括性而言,is 是判斷兩個變量是否引用同一個對象,而 == 則是判斷兩個變量引用的對象的值是否一致。要很好的理解兩者間的區(qū)別需要從Python對象的三要素說起。
Python對象的三要素:id、type、value
- id:是對象的唯一標(biāo)識,是對象在內(nèi)存中的存儲地址。
- type:是對象的數(shù)據(jù)類型
- value:是對象的值,是對象在內(nèi)存中存放的數(shù)據(jù)。
其中is的判斷依據(jù)是對象的id,== 的判斷依據(jù)是對象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調(diào)用copy( )函數(shù)后返回的一個新的對象,所以兩者的id( )不相等,而兩個變量在內(nèi)存和中的vale卻是相等的。
算術(shù)運算符
Operator | Description |
---|---|
+\- | 加\減,其中'+'可以重載為連接符,連接兩個字符或字符串 |
*\** | 乘\求平,其中*可以重載為重復(fù) |
/\%\// | 除\求余\取整除,其中%可以重載為格式化,取整除返回商的整數(shù)部分 |
**注:**Python除法需要注意的方面(Python 2.x版本,3.x版本不存在此問題)
1.Python中int型的數(shù)值相除,只能得到int型不會返回小數(shù)。若返回值需要精確到小數(shù)時,有兩種方法。
方法一:除數(shù)或被除數(shù)需要有一者為float型數(shù)值。
In [75]: float(1)/2 Out[75]: 0.5
方法二:import未來支持的語言特征division(精確除法)
Python的'/'除法默認使用截斷除(Truncating Division),導(dǎo)入division模塊后,Python才會默認使用精確除法。當(dāng)導(dǎo)入了精確除后,若想再使用截斷除,可以使用取整除'//',同時也被成為地板除。
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
隨便介紹兩個內(nèi)建函數(shù)round(number[, ndigits])、divmod(x, y)
round(x[,n]):給定一個浮點數(shù)x,并按照指定精度返回一個浮點數(shù)對象,官方文檔如下:
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
除了使用這種方法獲取指定精度的浮點數(shù)外,還可以使用%格式化來輸出指定精度的浮雕數(shù)。
In [125]: a = 1.1111111111 In [126]: print '%.5f' %a 1.11111
%格式化可以非常靈活的得到滿足需求的輸出數(shù)據(jù)的格式,以后我們會繼續(xù)了解。
divmod(x, y):計算x,y的取整除和余數(shù),并以元組類型返回。官方文檔:
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 |
<> | 不等于,同!= 運算符 |
位移運算符
位移運算符是非常有效率的計算方法之一,在對數(shù)學(xué)運算和對程序執(zhí)行效率要求高的程序中推薦使用。除了位移運算符之外,Python的按位運算符也是非常有效率的一種數(shù)據(jù)處理方法,之后會詳細的介紹。
Operator | Description |
---|---|
<< | a << n ⇒ a*(2**n) |
>> | a >> n ⇒ a/(2**n) |
自變運算符
自變運算符可以減少一定的代碼量,更重要的是,使用自變運算符可以加快Python程序在內(nèi)存中的執(zhí)行效率。
值得注意的是:Python出于避免語法歧義的初衷,在Python語法中并沒有自增 i++ 或者 ++i的語法, ++i 只作用于數(shù)學(xué)運算操作符,如:
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++ 三者間執(zhí)行效率的高低(對一般編程語言而言)。
最低 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的時候可以會莫名其妙的出現(xiàn)語法錯誤,這種時候可以考慮是否為數(shù)據(jù)類型的類型隱式轉(zhuǎn)換錯誤。
以上的比較只是針對一般的編程語言而言,在Python中因為存在可變對象和非可變對象,而且不存在i++自增語言。但是使用自變運算符,的確可以有效的減少代碼量和使程序更加簡潔。
位運算符
Operator | Description |
---|---|
x | y | 按位或(有1則1) |
x & y | 按位與(有0 則0) |
x ^ y | 位異或(不同為1,相同為0) |
~x | 取反 |
在Python中 | 、& 等運算符的意義不在于處理邏輯關(guān)系,而是二進制數(shù)據(jù)的位運算,數(shù)字以二進制形式的補碼存儲和計算,以原碼結(jié)果來顯示。若數(shù)字為正值,他的補碼就是原碼本身。若數(shù)字為負值,則他的補碼為源碼減一再按位取反。兩個數(shù)字的計算本質(zhì)是兩個二進制補碼的計算。
數(shù)字計算的實現(xiàn)原理:
1的原碼:0000 0001 , 補碼: 0000 0001 (二進制的首個數(shù)字代表符號,不可以改變)
-1的原碼:1000 0001 , 補碼:1111 1111
In [67]: -1 & 1 Out[67]: 1
即:
1111 1111
0000 0001
—————
0000 0001
其結(jié)果原碼為 0000 0001(正數(shù)的補碼就是原碼本身)
In [68]: -1 | 1 Out[68]: -1
即:
1111 1111
0000 0001
—————
1111 1111
其結(jié)果原碼為1000 0001(負數(shù)的原碼為補碼減一再按位取反,首個數(shù)字代表符號不可以改變)
所以,從數(shù)字計算的底層實現(xiàn)可以看出。位移運算符是計算效率非常高的一種計算方法,尤其可以避免類似執(zhí)行乘法時,所帶來的非常繁復(fù)的操作和實現(xiàn)過程。
邏輯運算符
Operator | Description |
---|---|
and | 邏輯與 |
or | 邏輯或 |
not | 邏輯非 |
在Python只能夠?qū)nd、or、not三種運算符用作于邏輯運算,而不像C、Java等編程語言中可以使用&、|、!,更加不能使用簡單邏輯于&&、簡單邏輯或||等邏輯運算符。由此可見,Python始終堅持著“只用一種最好的方法,來解決一個問題”的設(shè)計理念。
成員關(guān)系運算符
成員運算符能夠判斷一個指定對象是否是作為一個容器中的元素,由此來判斷兩個對象間的關(guān)系。
容器:包含了其他對象的引用的數(shù)據(jù)類型。
Operator | Description |
---|---|
in | 當(dāng)一個對象存在一個容器中時為Ture |
not in | 當(dāng)一個對象不在一個容器中時為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 |
最后
運算符在程序中一直都充當(dāng)著非常重要的角色,可能是編程的過程中并不會完全用的上,但是建立一個由自己編寫起來的運算符文檔,在往后的程序編寫中會變得非常的方便。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
Python實現(xiàn)打印九九乘法表的不同方法總結(jié)
這篇文章主要為大家介紹了Python實現(xiàn)打印九九乘法表的幾種不同方法,文中的示例代碼講解詳細,簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11解決Pycharm調(diào)用Turtle時 窗口一閃而過的問題
今天小編就為大家分享一篇解決Pycharm調(diào)用Turtle時 窗口一閃而過的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02使用Python將Mysql的查詢數(shù)據(jù)導(dǎo)出到文件的方法
今天小編就為大家分享一篇關(guān)于使用Python將Mysql的查詢數(shù)據(jù)導(dǎo)出到文件的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02