运算符和表达式

运算符是用来组成表达式的重要元素,会对表达式的结果产生影响。

表达式可以直接用来执行,并通过运算会得到一个结果,但是这个结果马上就会补缓存释放且不再存在,所以在编程过程中,表达式要配合变量来使用。

运算符 Operators

我们这里提到的运算符不仅仅是在数学中学到的加、减、乘、除, Python提供了大量的强大的运算符来帮助我们进行运算,这里我们先介绍下面三种类型的运算符(按优先级排列):

算术运算符 Arithmetic Operator

运算符说明
**幂运算(指数运算)
+  -正负号(正号可省略)
*  /  %  //乘、除、模(取余)、整除
+  -加、减

位运算符 Bit Operator

运算符说明
~按位取反
>>   <<右移  左移
&按位与
^  |按位异或、按位或

关系运算符(比较运算符)Relational Operator

运算符说明
<=  <  >=  >小于等于、小于、大于等于、大于
==  !=等于、不等于

逻辑运行符 Logic Operator

运算符说明
not逻辑非
and逻辑与
or逻辑或

需要说明的是,上述前三种运算符的优先级为: 算术运算符>位运算符>比较运算符>逻辑运行符,而的位运行符中的按位取反~的优先级和正负号一样,低于幂运算**,高于其它算术运算符。

完整的运算符列表以及优先级可查看附录-完整运算符

表达式 Expression

表达式是由字面量的值、变量等等与运算符组成的运算式,每一个表达式最终都会等到一个确切的字面量的值。

有关字面量的解释,可以查看附录-字面量

在Python中,常用的表达式有算术表达式关系表达式(或者叫比较表达式)和逻辑表达式

算术表达式 Arithmetic Expression

Python中的算术表达式和数学中算式很像,只是我们不需要在后面再写个等号并给出结果。

>>>  1 + 1
2
>>>  1 - 1
0
>>>  1 * 2
2

Python中的除法运算/得到的结果一定是一个浮点型的数值:

>>>  10 / 5
2.0

Python中的整除和取余分别用来得到数学中除法运算的余数,比如:

\[10 \div 3 = 3 \ldots 1\]

取余运算%和整除运算//不仅仅适用于整型数值,也适用于浮点型数值,只要在参与运算的数值里,有一个浮点型,那么结果一点是一个浮点型数值。

>>> 10 // 3 
3
>>> 10 % 3
1
>>> 10.0 // 3
3.0
>>> 10.0 % 3
1.0
>>> 18.32 // 2.51
7.0
>>> 18.32 % 2.51
0.7500000000000018

注: 至于上面的余数为什么出现了0.7500000000000018,我们后面会讲到。

在使用算术表达式的时候,一这要注意运算符的优先级关系,如果搞不清楚优先级,可以使用圆括号来确保运算的执行顺序。

比如在数学中的:

\[\lbrace[(3 + 4) \times 5-6]+7 \rbrace \times 8\]

应该写成:

>>> (((3 + 4) * 5 - 6 ) + 7) * 8
288

这一点同样适用于关系表达式和逻辑表达式。

在Python中,字符串也能进行加法+和乘法*运算,加法运算只能发生在两个字符串之间,运算结果为两个字符串连接在一起之后的新字符串;而乘法运算是只能由字符串和整型参与,比如"abc" * 2,结果为'abcabc'

>>> "abc" + "def"
'abcdef'
>>> "def" + "abc"
'defabc'
>>> "a" * 10
'aaaaaaaaaa'

关系表达式 Ralational Expression

关系表达式,也可以被叫做比较表达式,通过关系运算符将两个值连接到一起得到的一种表达式,用来运算这一关系是否成立,一个关系表达式的结果只有两个值TrueFalse

在使用关系表达式的时候,要注意数据的类型,一般情况下,整型和浮点型之间的比较没有限制,也可以和布尔型进行比较(基本不会用到),但是它们都不能与字符串进行比较:

>>> 3 > 2
True
>>> 4 < 2
False
>>> 5.3 > 3
True
>>> True > False
True
>>> False > -1
True

字符串之间则是按照字节逐个去比较的,比如下面三个字符串'16''161''8',先比较第一个字符,分别为'1''1''8',其中'8'比其它两个都大,所以'8'是三个中最大的字符串;在其余两个字符串中,前面两个字节均为'1''6',所以还要继续比较下一个字节的大小,但是第一个字符串只有两个字节,而第二个字符串还有第三个字节,所以第二个字符串比第一个字符串要大。根据以上分析,下面三个字符串的大小顺序为'8'>'161'>'16'

Layer 1 1 6 1 6 1 8
>>> '16' < '161'
True
>>> '161' > '8'
False

两个字符串的大小是根据它们在字符集中的位置判断的,暂时我们只需要下表即可。

字符位置
'0'~'9'48~57
'A'~'Z'65~90
'a'~'z'97~122

从上表可以看出,即使字母a是小写的,但是它并不“小”,在字符串中,它要大于大写字母A。当我们不确定某个字符在字符集中的位置的时候,可以调用函数ord()来查看,有关这一内建函数,我们会在后面章节详细学习:

>>> ord('A')
65

逻辑表达式 Logic Expression

当我们用两个关系表达式和逻辑运算符组成一个逻辑表达式时,它的结果也是只有两个TrueFalse:

>>> 5 > 3 and 4 < 6
True
>>> 5 > 6 or 6 < 7
True
>>> 7 > 4 and 3 < 1
False
>>> not (5 > 6)
True

对于关系表达式,也可以多个值一起比较,但不建议用,在这里还是建义大家用逻辑表达式来代替:

>>> 5 < 6 > 2
True
>>> 5 < 6 and 6 > 2 #与上式等价
True

假如,假和爸爸去看电影,检票员说:”你们两个必须都有票才能进“,那么这里用的就是and,如果检票员说:”你们两个只要有一发张票就可以进入“,那么这里用的就是or

我们可以用下表来熟悉两个关系表达式的结果在逻辑表达式中的运算情况

表达式a表达式band运算or运算not a运算
TrueTrueTrueTrueFalse
TrueFalseFalseTrueFalse
FalseTrueFalseTrueTrue
FalseFalseFalseFalseTrue

在Python中,还有一种特别有意思的概念,也是我们接下来要讲的:短路逻辑,它的意思可以理解成在逻辑表达式中,运算符右边部分的运算被短路了:

a and b表达式中,如果a的值为True,那么结果为b的值,否则结果直接为a的值

>>> 5 and 6
6
>>> 5 < 4 and 6 > 1 #这里关系表达式“6 > 1”被短路了,并没有进行运算
False
>>> False and 6 #这里6被短路了,并没有被运算
False

a or b表达式中,如果a的值为True,那么结果为a的值,否则结果直接为b的值

>>> 5 or 6  #这里6被短路了,并没有被运算
5
>>> 5 > 4 or 6 < 1 #这里关系表达式“6 > 1”被短路了,并没有进行运算
True
>>> False or 6
6

在上一章节,我们提到过,任何非0数值均可被认为是真逻辑值,这一说法可以扩展到其它基本类型:

类型假逻辑值真逻辑值
int0非0整数
float0.00.00等等非0.0浮点数
str''非空字符串
NoneTypeNone
>>> '' and True
''
>>> None and False
>>> 

表达式与变量

在本章节开篇时,我们提到,表达式的结果被输出之后就会被缓存释放了,所以为了后面继续使用表达式运算出来的结果,需要配合变量来使用。

>>> a = 5 + 7
>>> print(a)
12
>>> b = 4 > 3 and 5 < 1
>>> print(b)
False
>>> c = a and b
>>> print(c)
False

有关变量的详细内容,如果还有不清楚的地方,可以回到上一章节中复习:变量