操作符可分為「運算符」(operators)和「分隔符」(delimiters)。
運算符有:
+,-,*,**,/,//,%,詳細用法見 數字運算。
<<,>>,&,|,^,~,詳細用法見 整數及其位運算。
<,>,<=,>=,==,!=,in,not in,is,is not,詳細用法見 比較運算符。
and,or,not,詳細用法見 布爾值及布爾運算。
Python 3.8 新增,將右邊的表達式賦值給左邊的變量, 同時返回表達式的值。
(a := 1+1)2運算符還分為一元運算符和二元運算符,一元運算符運算一個對象(操作數),二元運算符運算兩個。一元運算符有 +(正數),-(負數),~(整數按位取反)和 not(布爾運算 非)。if ... else ... 有時稱作三元運算符。
-1, +2, ~3, not 4(-1, 2, -4, False)1 + 2 - 3 * 4 # 二元運算符加、減和乘-9True if 2 > 3 else FalseFalse分隔符有:
(,),[,],{,},,,:,.,;,=,+=,-=,*=,/=,//=,%=,&=,|=,^=,>>=,<<=,**=
部分分隔符用法舉例:
圓括號綁定表達式,或元組顯示,方括號用來對序列進行索引、切片取值或列表顯示,花括號字典顯示或集合顯示
3 * (1 + 2) * (1,)(1, 1, 1, 1, 1, 1, 1, 1, 1)[1,2,3,4][1:3][2, 3]{'列表':[], '集合':{1,2,3}}{'列表': [], '集合': {1, 2, 3}}上述分隔符 = 為賦值操作符,之後的操作符為增強賦值操作符,將名稱綁定(或重新綁定)到特定值,以及修改屬性或可變對象的成員項。詳見 賦值語句。
假設將值 value1 綁定到名稱 name,name = value1,則 name += value2 的結果相當於 name = name + value2,其他操作符類似。
舉例如下:
a = 1
a += 1
a2b = 17
b |= 5
b21除了運算符和分隔符,還有 ',",\,# 字符,作為其他字符的組成部分時具有特殊含義,或是對詞法分析器有重要意義。
',",\,詳見 字符串概述 和 轉義字符。
# 通常用來注釋代碼,但不能包含在字符串中,注釋在語法分析中會被忽略:
# 這是注釋
'''
# hello world
# hello python
''''\n# hello world\n# hello python\n'操作符除了常規的用法,操作不同的數據類型,相應的數據類型可能定義了特定的操作規則;在特定的應用場景,也有著特殊的用法。詳見 操作符特殊用法
比較運算符比較運算符有 <,>,<=,>=,==,!=,in,not in,is,is not。
運算符 <,>,>=,<=,== 和 != 比較兩個對象的值,<,>,>= 和 <= 稱為次序比較;== 和 != 稱為一致性比較。
由於所有類型都是 object 的(直接或間接)子類型,它們都從 object 繼承了默認的比較行為,一致性比較是默認的比較行為,因此可在任何對象之間進行。
False == 0 != 'a' != int != {}True對象的值在 Python 中是一個相當抽象的概念:
對象的值並不要求具有特定的構建方式,例如由其全部數據屬性組成等;比較運算符實現了一個特定的對象的值概念,可以認為正是通過實現對象比較,間接地定義了對象的值。主要內置類型的比較行為:
1,數字類型內部可跨類型比較,按數學(算法)規則正確進行比較且不會有精度損失。但複數不支持次序比較。
True == 1 == 1.0True3.14 < 3False0 >= 0j
TypeError Traceback (most recent call last)
<ipython-input-6-df80cad0b1a4> in <module>
----> 1 0 >= 0j
TypeError: '>=' not supported between instances of 'int' and 'complex'2,字符串使用其字符的 Unicode 碼位數字值依次進行比較,某個字符比較出大小即停止。如果一個字符串包含另一個,較短的排前面。
ord('a'), ord('b'), ord('c')(97, 98, 99)'a' == 'a', 'a' == 'c'(True, False)'ab' < 'ac'True'abc' > 'ab'True3,序列(列表,元組,range 實例)只能進行類型內部比較。跨類型一致性比較結果將是不相等,跨類型次序比較將引發 TypeError。range 不支持次序比較。
比較時按順序對相應元素進行逐個比較,某個元素比較出大小即停止。如果一個序列元素包含另一個,較短的排前面。
(1,2) == [1,2]False[1,2] == [1,2]True[1,4] > [1,3,7]True[1,4] < [1,4,7]True(1,2) >= [1,2]
TypeError Traceback (most recent call last)
<ipython-input-22-cb12354bca8e> in <module>
----> 1 (1,2) >= [1,2]
TypeError: '>=' not supported between instances of 'tuple' and 'list'4, 兩個字典若要相等,必須若且唯若它們具有相同的 鍵值對。次序比較將引發 TypeError。
{1:1} == {True:1.0}True{1:1} <= {True:1.0}
TypeError Traceback (most recent call last)
<ipython-input-24-a13e7674e543> in <module>
----> 1 {1:1} <= {True:1.0}
TypeError: '<=' not supported between instances of 'dict' and 'dict'5,集合 (set 或 frozenset 的實例) 可進行類型內部和跨類型的比較。
它們將比較運算符定義為子集和超集檢測,具體詳見集合知識點。這類關係沒有定義完全排序。相應地,集合不適宜作為依賴於完全排序的函數的參數。
{1,2} == frozenset([1,2,1])True{3,1} > {1,2}Falsesorted([{3},{1},{2}])[{3}, {1}, {2}]運算符 in 和 not in 用於成員檢測。如果 x 是 s 的成員則 x in s 求值為 True,否則為 False。x not in s 返回 x in s 取反後的值。
所有內置序列和集合類型以及字典都支持此運算,對於字典來說 in 檢測其是否有給定的鍵。
'a' in 'abc'True'abc' in 'abbc'False1 in [1,2]True[1] in [1,2]False'a' in {'a':1}True運算符 is 和 is not 用於檢測對象的標識號:若且唯若 x 和 y 是同一對象時 x is y 為真。一個對象的標識號可使用 id() 函數來確定。x is not y 會產生相反的邏輯值。
默認的一致性比較是基於對象的標識號。x is y 就意味著 x == y。
a = 1
b = 1
a is b, a == b(True, True)a = (1,3)
b = (1,3)
a is b, a == b(False, True)
操作符優先級Python 表達式語句中操作符的優先順序從最低優先級(最後綁定)到最高優先級(最先綁定)如下:
in, not in, is, is not, <, <=, >, >=, !=, == 比較運算*, /, //, % 乘,矩陣乘,除,整除,取餘x[index], x[index:index], x(arguments...), x.attribute 抽取,切片,調用,屬性引用(expressions...), [expressions...], {key: value...}, {expressions...} 綁定或加圓括號的表達式,列表顯示,字典顯示,集合顯示一個表達式語句中可以有多個上述操作符,最終返回一個值(包括返回值為 None 的函數調用)。
而賦值語句中的賦值操作符 =,+=,-=,*=,/=,//=,%=,&=,|=,^=,>>=,<<=,**=,在操作符中優先級最低,它右邊表達式的值計算完之後,才最後綁定到左邊的名稱。
舉例如下:
value = int('2')**(-1) == 2/(3+1)
valueTrueint('2')**(-1) == 2/(3+1)True[].append(1) is None and not 1 - 1Truevalue = 1 if 'a' in 'a b c'.split()[1:3] else 2
value2value **= 3 + 2 * 1
value32操作符 = 可以用來連續賦值:
a = b = c = 1
a,b,c(1, 1, 1)
操作符特殊用法容器類的內置類型,通常對操作符定義了自己特有的的操作行為。
* 操作符,除了數字運算的 乘,還可以用來將可迭代對象拆包。拆包之後置於元組,列表,集合中,或作為參數傳遞給函數:{*{'a':1, 'b':2}}{'a', 'b'}print(*'abc', sep='-')a-b-c
+,+=,*,*= 可用來對序列類型進行拼接,重複拼接或拼接並賦值(range 類型除外)。由於列表是可變對象,+= 和 *= 在操作列表時,是用來更新列表。具體詳見 列表操作符。'd-' + 'abc'*2'd-abcabc'a = [1]*2
a += [2]
a[1, 1, 2]操作符 **,| 和 |= 可以用來操作字典。具體詳見 字典操作符。
操作符 >,<,>=,<= 可對集合進行子集或超集比較;|,&,-,^ 可求集合的併集,交集,差集,對稱差集;|=,&=,-=,^= 可用來更新集合。具體詳見集合知識點。
操作符 % 可以用來格式化字符串,而在「格式化迷你語言」中,定義了非常多的有特殊意義操作符。具體詳見 str.format 格式化 和 字符串操作符。