Python 语言支持很多种运算符,下面的表格按照运算符的优先级从高到低,对 Python 中的运算符进行了罗列。有了变量和运算符,我们就可以构造各种各样的表达式来解决实际问题。在计算机科学中,* *表达式是计算机程序中的句法实体,它由一个或多个常量、变量、函数和运算符组合而成,编程语言可以对其进行解释和计算以得到另一个值 **。不管使用什么样的编程语言,构造表达式都是非常重要的。
| 运算符 | 描述 |
|---|---|
[]、[:] |
索引、切片 |
** |
幂 |
~、+、- |
按位取反、正号、负号 |
*、/、%、// |
乘、除、模、整除 |
+、- |
加、减 |
>>、<< |
右移、左移 |
& |
按位与 |
^、` |
` |
<=、<、>、>= |
小于等于、小于、大于、大于等于 |
==、!= |
等于、不等于 |
is、is not |
身份运算符 |
in、not in |
成员运算符 |
not、or、and |
逻辑运算符 |
=、+=、-=、*=、/=、%=、//=、**=、&=、` |
=、^=、>>=、<<=` |
说明: 所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行什么再执行什么的顺序。编写代码的时候,如果搞不清楚一个表达式中运算符的优先级,可以使用圆括号来确保运算的执行顺序。
Python 中的算术运算符非常丰富,除了大家最为熟悉的加、减、乘、除之外,还有整除运算符、求模(求余数)运算符和求幂运算符。下面的例子为大家展示了算术运算符的使用。
算术运算需要先乘除后加减,这一点跟数学课本中讲的知识没有区别,也就是说乘除法的运算优先级是高于加减法的。如果还有求幂运算,求幂运算的优先级是高于乘除法的。如果想改变算术运算的执行顺序,可以使用英文输入法状态下的圆括号(小括号),写在圆括号中的表达式会被优先执行,如下面的例子所示。
赋值运算符应该是最为常见的运算符,它的作用是将右边的值赋给左边的变量。赋值运算符还可以跟上面的算术运算符放在一起,组合成复合赋值运算符,例如:a += b
相当于a = a + b,a *= a + 2相当于a = a * (a + 2)。下面的例子演示了赋值运算符和复合赋值运算符的使用。
注意:赋值运算构成的表达式本身不产生任何值,为了解决这个问题,Python 3.8中引入了一个新的赋值运算符
:=,我们通常称之为海象运算符,大家可以猜一猜它为什么叫这个名字,我们在后面用到的时候再为大家讲解这个运算符。
比较运算符也称为关系运算符,包括==、!=、<、>、<=、>=,我相信大家一看就能懂。需要提醒的是比较相等用的是==
,请注意这里是两个等号,因为=是赋值运算符,我们在上面刚刚讲到过。比较不相等用的是!=,跟数学课本中使用的$\small{\neq}$并不相同,Python
2中曾经使用过<>来表示不等于,在 Python 3中使用<>会引发SyntaxError(语法错误)。比较运算符会产生布尔值,要么是True
,要么是False。
逻辑运算符有三个,分别是and、or和not。and字面意思是“而且”,所以and
运算符会连接两个布尔值或者产生布尔值的表达式,如果两边的布尔值都是True,那么运算的结果就是True
;左右两边的布尔值有一个是False,最终的运算结果就是False。当然,如果and运算符左边的布尔值是False
,不管右边的布尔值是什么,最终的结果都是False,这时运算符右边的布尔值会被跳过(专业的说法叫短路处理,如果and
右边是一个表达式,那么这个表达式不会执行)。or字面意思是“或者”,所以or
运算符也会连接两个布尔值或产生布尔值的表达式,如果两边的布尔值有任意一个是True,那么最终的结果就是True。当然,or
运算符也是有短路功能的,当它左边的布尔值为True的情况下,右边的布尔值会被短路(如果or
右边是一个表达式,那么这个表达式不会执行)。not运算符的后面可以跟一个布尔值,如果not后面的布尔值或表达式是True
,那么运算的结果就是False;如果not后面的布尔值或表达式是False,那么运算的结果就是True。
说明:比较运算符的优先级高于赋值运算符,所以上面的
flag0 = 1 == 1先做1 == 1产生布尔值True,再将这个值赋值给变量flag0。,进行分隔,输出的内容默认以空格分开。
要求:输入华氏温度将其转换为摄氏温度,华氏温度到摄氏温度的转换公式为:$\small{C = (F - 32) / 1.8}$。
说明:上面代码中的
input函数用于从键盘接收用户输入,由于输入的都是字符串,如果想处理成浮点小数来做后续的运算,可以用我们上一课讲解的类型转换的方法,用float函数将str类型处理成float类型。
上面的代码中,我们对print函数输出的内容进行了格式化处理,print输出的字符串中有两个%.1f占位符,这两个占位符会被%
之后的(f, c)中的两个float类型的变量值给替换掉,浮点数小数点后保留1位有效数字。如果字符串中有%d
占位符,那么我们会用int类型的值替换掉它,如果字符串中有%s占位符,那么它会被str类型的值替换掉。
除了上面格式化输出的方式外,Python 中还可以用下面的办法来格式化输出,我们给出一个带占位符的字符串,字符串前面的f
表示这个字符串是需要格式化处理的,其中的{f:.1f}和{c:.1f}可以先看成是{f}和{c},表示输出时会用变量f和变量c
的值替换掉这两个占位符,后面的:.1f表示这是一个浮点数,小数点后保留1位有效数字。
要求:输入一个圆的半径,计算出它的周长($\small{2 \pi r}$)和面积($\small{\pi r^{2}}$)。
Python 中有一个名为math 的内置模块,该模块中定义了名为pi的变量,它的值就是圆周率。如果要使用 Python 内置的这个pi
,我们可以对上面的代码稍作修改。
说明:上面代码中的
import math表示导入math模块,导入该模块以后,才能用math.pi得到圆周率的值。
这里其实还有一种格式化输出的方式,是 Python 3.8 中增加的新特性,大家直接看下面的代码就明白了。
说明:假如变量
a的值是9.87,那么字符串f'{a = }'的值是a = 9.87;而字符串f'{a = :.1f}'的值是a = 9.9。这种格式化输出的方式会同时输出变量名和变量值。
要求:输入一个1582年以后的年份,判断该年份是不是闰年。
说明:对于格里历(Gregorian calendar),即今天我们使用的公历,判断闰年的规则是:1. 公元年份非4的倍数是平年;2. 公元年份为4的倍数但非100的倍数是闰年;3. 公元年份为400的倍数是闰年。格里历是由教皇格里高利十三世在1582年10月引入的,作为对儒略历(Julian calendar)的修改和替代,我们在输入年份时要注意这一点。上面的代码通过
%来判断year是不是4的倍数、100的倍数、400的倍数,然后用and和or运算符将三个条件组装在一起,前两个条件要同时满足,第三个条件跟前两个条件的组合只需满足其中之一。
通过上面的讲解和例子,相信大家已经感受到了运算符和表达式的力量。实际编程中的很多问题,都需通过构造表达式来解决,所以变量、运算符、表达式对于任何一门编程语言都是极为重要的基础。如果本节课的内容有什么不理解的地方,一定不要着急进入下一课,先在评论区留言讨论,我会及时解答大家的问题。