3.10 常用操作符
视频讲解
3.10.1 算术操作符
Python的算术操作符大多数和大家知道的数学运算符一样:
+ - * / % ** //
前面四个就不用介绍了,加、减、乘、除,大家都懂。不过下面要介绍的小技巧倒不是所有人都知道的。
例如,当想对一个变量本身进行算术运算的时候,是不是会觉得写a = a + 1或b =b-3这类操作符特别麻烦?没错,在Python中可以做一些简化:
>>> a = b = c = d = 10 >>> a += 1 >>> b -= 3 >>> c *= 10 >>> d /= 8 >>> print(a, b, c, d) 11 7 100 1.25
如果使用过Python 2.x版本的读者可能会发现,Python 3的除法变得有些不同了。很多编程语言中,整数除法一般都是采用floor的方式,有些书籍将其直接翻译为地板除法。地板除法的概念是:计算结果取比商小的最大整型值(也就是舍弃小数,取整的意思)。
但是在这里我们发现,即使是进行整数间的除法,结果却是返回一个浮点型的精确数值,也就是Python采用真正的除法代替了地板除法。
那有些朋友不乐意了:“萝卜、青菜各有所爱,我就喜欢原来的除法,整数除以整数就应该得到一个整数!”,于是Python的团队也为此想好了办法,就是大家看到的双斜杠,它执行的就是地板除法的操作:
>>> 3 // 2 1 >>> 3.0 // 2 1.0
注意:
使用地板除法,无论是整型还是浮点型,都将舍弃小数部分。
关于Python 3在除法运算上的改革,支持和反对的几乎各占一半。有些人支持这种做法,因为Python的除法运算从一开始的设计就是失误的,他们想要真正的除法;但有些人又不想因此修改自己的海量代码……无论怎样,这已经是板上钉钉的事情了。Python团队秉承着执着、追求完美的信念不断打造和改进Python,就这件事情本身我们就应该为其点赞。
百分号(%)表示求余数的意思:
>>> 5 % 2 1 >>> 4 % 2 0 >>> 520 % 14 2
3.10.2 优先级问题
当一个表达式存在多个运算符的时候,就可能会发生以下对话。
加法运算符说:“我先到的,我先计算!”
乘法运算符说:“哥我运算一次够你翻几个圈了,哥先来!”
减法运算符说:“你糊涂了,我现在被当成负号使用,没有我,你们再努力,结果也是得到相反的数!”
除法运算符这时候默默地说:“抢吧抢吧,我除以零,大家同归于尽!”
为了防止以上矛盾的出现,我们规定了运算符的优先级,当多个运算符同时出现在一个表达式的时候,严格按照优先级规定的级别来进行运算。
先乘、除,后加、减,如有括号先运行括号里边的。没错,从小学我们就学到了运算符优先级的精髓,在编程中也是这么继承下来的。
举个例子:
-3 * 2 + 5 / -2 - 4
相当于:
(-3) * 2 + 5 / (-2) - 4
其实多做练习自然就记住了,不用刻意去背。当然,在适当的地方加上括号强调一下优先级,小甲鱼觉得会是更好的方案。
Python还有一个特殊的乘法,就是双星号(**),也称为幂运算操作符。例如3**2,双星号左侧的3称为底数,右侧的2称为指数,把这样的算式称为3的2次幂。
在使用Python进行幂运算的时候,需要注意的一点是优先级问题。举个例子:
>>> -5 ** 2 -25 >>> 5 ** -2 0.04
从上面的结果可以看出:幂运算操作符比其左侧的一元操作符优先级高,比其右侧的一元操作符优先级低。
3.10.3 比较操作符
比较运算符包括:
< <= > >= == !=
比较操作符根据表达式的值的真假返回布尔类型值:
>>> 3 < 4 True >>> 1 + 1 >= 2 True >>> 'a' > 'b' False >>> 5 / 2 <= 3 True >>> 5 > 3 < 4 True
3.10.4 逻辑操作符
逻辑操作符包括:
and or not
and操作符之前已经学习过,在实例中也多次使用。当只有and操作符左边的操作数为True,且右边的操作符同时为True的时候,结果才为True:
>>> 3 > 4 and 4 < 5 False >>> 3 < 4 and 4 < 5 True
or操作符与and操作符不同,or操作符只需要左边或者右边任意一边为真,结果都为真;只有当两边同时为假,结果才为假:
>>> 3 > 4 or 4 < 5 True >>> 3 > 4 or 4 > 5 False
not操作符是一个一元操作符,它的作用是得到一个和操作数相反的布尔类型的值:
>>> not True False >>> not 0 True >>> not 4 False
另外,可能还会看到下面这样的表达式:
5 > 3 < 4
这在其他编程语言中可能是不合法的,但在Python中是行得通的,它事实上被解释为:
5 > 3 and 3 < 4
将目前接触过的所有操作符优先级合并在一起,如图3-1所示。
图3-1 Python操作符优先级
请思考:(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)的结果应该是多少?为什么呢?