什么是操作符
操作符又叫运算符,举个简单的例子 4 +5, 例子中,4 和 5 被称为操作数,"+" 称为运算符。
在这里,+号的处理不会对4、5产生任何影响,如果我们把运算的结果保存下来,会得到一个结果9。
但是,在Python中,并不是所有的运算符都不会对操作数产生影响,Python中常见的运算符包括:算术运算符
比较(关系)运算符
赋值运算符
逻辑运算符
位运算符
成员运算符
身份运算符
运算符优先级
我们分别简单讨论一下。
算术运算符
算术运算符和我们小学时候学习的算术运算类似,如下面的图所示。图的右侧是我们假设a=10,b=20后,a、b进行算术运算的结果。
大家需要注意的是“//"这个运算符,取整除又叫地板除,即是我们除的结果是舍弃了小数点的。需要注意的是:负数地板除的结果也是向下取整的,比如:
>>> 3//2
1
>>> -3//2
-2
还有需要注意的是,不同类型的变量进行算术运算的之后结果的类型。
>>> x=3
>>> y=3/1.5
>>> type(x)
>>> type(y)
另外,有些算术运算不单是对数值型的标量可以运算,也可以对序列型的变量类型进行运算,比如用8乘以一个元组(1,),就会得到一个把旧元组中的内容复制了8份的新元组。例:
>>> 8*(1,)
(1, 1, 1, 1, 1, 1, 1, 1)
比较(关系)运算符
比较运算符的结果是bool型的变量。如下图:
我们学习比较运算符时需要注意,运算符两边的操作数不一定都是数值型的。比如:
>>> 3>'a'
False
>>> 3
True
>>> 'abc'
True
上例中,我们在比较运算符两边分别用了整型、str型、元组,得到的结果依然是bool型的。这个时候我们需要知道比较运算对这些不同类型的操作数运算的结果,当然实际编程的时候,我们尽量不要使用这些程序员不容易明确其运算结果的比较运算。
赋值运算符
赋值运算符的核心是一个”=“,在此基础上和前面的算术运算符相组合,形成一个复合赋值运算符,如下图所示。
需要注意的是,我们在进行复合赋值运算的时候,一定要注意运算符两边的数值类型,如果右边的数值类型不能进行相对复合赋值运算中的算术运算的时候,就会报错。例:
>>> x //= 'a'
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for //=: 'int' and 'str'
上面的’a‘是个str型,不能进行地板除运算,所以报错。
位运算符
因为计算机最终处理的是二进制数,所以总是免不了进行位运算。常见的位运算符包括按位与&、按位或|等,如下图:
学习位运算符时需要注意,我们进行位运算时运算符两边的操作数是被当成二进制数来看待的,还有就是一些移位操作需要补位的。例:
>>> 3<<2
12
十进制3转成二进制后是“11”,11右移2位后右边空出的两位补0变成“1100”,“1100”转回十进制后即是12。
逻辑运算符
逻辑运算符,包括与and、或or、非not。如下图:
在其它语言中(如C)经常用&&来表示逻辑运算,用&表示位运算,所以初学者经常把按位逻辑运算与逻辑运算搞混,但是Python使用and、or、not表示逻辑运算后,会使这种出错概率降低。
需要注意的是:逻辑运算符的操作数是被当成bool型变量来看的,不管这个操作数是不是bool型。例:
>>> not 'a'
False
>>> not (1,)
False
>>> not (0,)
False
>>> not 0
True
上面的例子中,str、tuple、int都被进行了逻辑运算的操作,得到了True或False的结果,可以看出除了int型的0被当成了False看待,其它都是被当成True来看待的。
成员运算符
除了以上的一些运算符之外,Python还支持成员运算符in和not in。成员运算符经常和Python中的序列型变量出现(如list、tuple、str)等。如下图:
Python的成员运算符非常好用,经常被用来作为循环的控制条件。如:
>>> x=[1,2,3,4,1,2,1]
>>> while 1 in x:
... x.remove(1)
...
>>> x
[2, 3, 4, 2]
上面例子中,我们使用成员运算符和remove函数删除了list x中所有值为1的元素。
身份运算符
身份运算符用于比较两个对象的存储单元,它的运算条件比较苛刻,具体如下图:
身份运算要比等于、不等于的比较运算更严格,如果变量a和变量b进行身份运算,类似于id(a)和id(b)的比较运算。例:
>>> a=[1,2,3]
>>> c=[1,2,3]
>>> b=a
>>> a is c
False
>>> a is b
True
>>> a==c
True
上例中,a、c两个list的内容相等,所以对它们进行==比较运算的时候返回结果为True,但是它们并不是同一块地址存放的数据,所以进行身份is运算的时候返回了False,而被用a赋值的b和a进行身份运算的时候,返回的才是True。
但是,如果我们给b重新赋值后,再和a进行身份运算就会返回False了,例:
>>> a=[1,2,3]
>>> b=a
>>> b=[3,4,5]
>>> a is b
False
运算符优先级
前面有这么多的运算符,那如果有一个复杂的运算表达式包含多个运算符的时候我们该按照怎样的先后顺序进行算术运算呢?
这就不得不为它们定义优先级,即复杂运算表达式中运算符的先后运算顺序。
运算符的优先级如下图:
需要注意的是,我们可以使用小括号改变优先级。而且,我们实际编程时经常使用小括号来提高复杂运算表达式的运算符优先级的可读性。