Python语言程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 运算符

相比其他编程语言,Python中的运算符更为丰富,准功能更为强大。Python中的运算符可分为算术运算符、比较运算符、赋值运算符、逻辑运算符等。本节将对这些运算符的使用进行讲解。

2.3.1 算术运算符

Python中的算术运算符包括+、-、*、/、//、%和**,这些运算符都是双目运算符,每个运算符可以与两个操作数组成一个表达式。以操作数a=1、b=2为例,Python中各个算术运算符的功能与示例如表2-4所示。

表2-4 算术运算符的功能与示例

在Python中,可对整数执行加(+)减(-)乘(*)除(/)运算。

在终端上,Python直接返回运算结果。Python使用两个乘号表示乘方运算:

Python还支持运算次序,因此你可在同一个表达式中使用多种运算。还可以使用括号来修改运算次序,让Python按所指定的次序执行运算,如下所示:

在这些示例中,空格不影响Python计算表达式的方式,它们的存在旨在让你阅读代码时,能迅速确定先执行哪些运算。

注意

不同版本的Python执行“1/2”算术表达式的结果略有不同,Python 2.5之前的版本执行结果可能等于0。

与C、Java语言不同,Python不支持自增运算符和自减运算符。例如,i++、i--是错误的语句,但是类似i+=1的语句是允许的。

Python中的算术运算符支持对相同或不同类型的数字进行混合运算。例如:

无论参加运算的操作数是什么类型,解释器都能给出运算后的正确结果,这是因为Python在对不同类型的对象进行运算时,会强制将对象的类型进行临时类型转换。这些转换遵循如下规律:

(1)布尔类型在进行算术运算时,被视为数值0或1。

(2)在整型与浮点型运算时,将整型转化为浮点型。

(3)在其他类型与复数运算时,将其他类型转换为复数类型。

简单来说,混合运算中类型相对简单的操作数会被转换为与复杂操作数相同的类型。

2.3.2 比较运算符

Python中的比较运算符有:==、!=、>、<、>=、<=,也称为关系运算符,比较运算符同样是双目运算符,它与两个操作数构成一个表达式。比较运算符的操作数可以是表达式或对象,以操作数a=3、b=5为例,其功能与示例分别如表2-5所示。

表2-5 比较运算符的功能与示例

续表

比较运算符只对操作数进行比较,不会对操作数自身造成影响,即经过比较运算符运算后的操作数不会被修改。比较运算符与操作数构成的表达式的结果只能是True或False,这种表达式通常用于布尔测试。

使用关系运算符,比较两个数的大小,如下所示:

运行代码,控制台输出结果如下:

比较字符串是否相等,如下所示:

在有大小写的情况下,进行编码比较处理,p的编码要大于P的编码,示例运行结果如下:

【示例6】 判断年龄范围

运行代码,控制台输出结果如下:

2.3.3 赋值运算符

赋值运算符的功能是:将一个表达式或对象赋予一个左值,其中左值必须是一个可修改的值,不能为一个常量。“=”是基本的赋值运算符,还可与算术运算符组合成复合赋值运算符。Python中的复合赋值运算符有+=、-=、*=、/=、//=.%=、**=,它们的功能相似,例如,“a+=b”等价于“a=a+b”,“a-=b”等价于“a=a-b”,等等。赋值运算符也是双目运算符,以a=3,b=5为例,Python中各个赋值运算符的功能与示例如表2-6所示。

表2-6 赋值运算符的功能与示例

续表

经以上操作后,左值a发生了改变,但右值b并没有被修改。以“+=”为例,代码如下:

需要说明的是,与C语言不同,在Python中进行赋值运算时,即便两侧操作数的类型不同也不会报错,且左值可正确地获取右操作数的值(不会发生截断等现象),这与Python中变量定义与赋值的方式有关。

2.3.4 逻辑运算符

Python支持逻辑运算,但Python逻辑运算符的功能与其他语言有所不同。Python中分别使用and、or、not这三个关键字作为逻辑运算“与”“或”“非”的运算符,其中or与and为双目运算符,not为单目运算符。表2-7列出了Python中的逻辑运算符和表达式。

表2-7 Python中的逻辑运算符和表达式

逻辑运算符的操作数可以为表达式或对象,下面对它们的功能分别进行介绍。

1.and

当使用运算符and连接两个操作数时,若左操作数的布尔值为False,则返回左操作数或其计算结果(若为表达式),否则返回右操作数的执行结果。例如:

运行代码,控制台输出结果如下:

2.or

当使用运算符or连接两个操作数时,左操作数的布尔值为True,则返回左操作数,否则返回右操作数或其计算结果(若为表达式)。例如:

运行代码,控制台输出结果如下:

3.not

当使用运算符not时,若操作数的布尔值为False,则返回True,否则返回False。例如:

运行代码,控制台输出结果如下:

4.逻辑运算符的优先级

逻辑非的优先级大于逻辑与和逻辑或的优先级,而逻辑与和逻辑或的优先级相等。逻辑运算符的优先级低于关系运算符,必须先计算关系运算符,然后再计算逻辑运算符。

【示例7】 逻辑表达式的优先级别

运行代码,控制台输出结果如下:

2.3.5 位运算符

程序中的所有数据在计算机内存中都以二进制形式存储,位运算即以二进制位为单位进行的运算。Python的位运算主要包括按位左移、按位右移、按位与、按位或、按位异或、按位取反这6种。位运算符的使用说明如表2-8所示。

表2-8 位运算符的使用说明

下面以num_one=10和num_two=11为例,分别使用表2-8中的运算符演示位运算操作。例如:

2.3.6 运算符优先级

想一想下面的表达式会产生什么结果?

如果你先进行加法运算2+3=5,然后计算5*4,最终得到20。但如果你先进行乘法运算,3*4=12,接着2+12,结果等于14。与其他编程语言一样,在Python里,乘法的优先级要高于加法,因此第二种运算结果是正确的:

Python支持使用多个不同的运算符连接简单表达式,实现相对复杂的功能。为了避免含有多个运算符的表达式出现歧义,Python运算符在同一个表达式中具有不同的优先级。算术运算符的优先级大于关系运算符的优先级,关系运算符的优先级大于逻辑运算符的优先级。如果表达式中包含多种类型的运算符,Python会根据运算符的优先级从高到低进行计算。表2-9从最低的优先级到最高的优先级依次列出了Python所有的运算符。Python会首先计算表2-9中较下面的运算符,然后再计算表上面的运算符。

表2-9 运算符优先级

但在实际编程中我们几乎从来没有查看过它,因为我们总可以使用括号来保证运算顺序与我们期望的一致:

这样书写的代码也可让阅读者无须猜测代码的意图,免去了检查优先级表的麻烦。

默认情况下,运算符的优先级决定了复杂表达式中的哪个单一表达式先执行,但用户可使用圆括号“()”来改变表达式的执行顺序。通常圆括号中的表达式先执行,例如,对于表达式“3+4*5”,若想让加法先执行,可写为“(3+4)*5”。此外,若有多层圆括号,则最内层圆括号中的表达式先执行。

运算符一般按照自左向右的顺序结合,例如,在表达式“3+5-4”中,运算符+、-的优先级相同,解释器会先执行“3+5”,再将3+5的执行结果8与操作数4一起执行“8-4”,即执行顺序等同于“(3+5)-4”;但赋值运算符的结合性为自右向左,如表达式“a=b=c”,Python解释器会先将c的值赋给b,再将b的值赋给a,即执行顺序等同于“a=(b=c)”。

2.3.7 技能训练

上机练习7数字8

需求说明

编写4个表达式,它们分别使用加法、减法、乘法和除法运算,但结果都是数字8。为使用print语句来显示结果,务必将这些表达式用括号括起来,也就是说,你应该编写4行类似于下面的代码:

输出应为4行,其中每行都只包含数字8。

上机练习8摄氏温度将其转为华氏温度

需求说明

华氏温标:是德国人华伦海特(Fahrenheit)于1714年创立的温标。它以水银做测温物质,定冰的熔点为32华氏度,沸点为212华氏度,中间分为180华氏度。

摄氏温标:1740年瑞典人摄尔修斯(Celsius)提出在标准大气压下,把冰水混合物的温度定为0摄氏度,水的沸点规定为100摄氏度。根据水这两个固定温度点来对温度进行分度。两点间做100等分,每段间隔称为1摄氏度,记作1℃。

华氏温标与摄氏温标是两大国际主流的计量温度的标准,这两个不同的温度计量标准也是可以进行转换的,分别如下:

➢ 摄氏温度转华氏温度:“华氏度数=32+摄氏度数×1.8”。

➢ 华氏温度转摄氏温度:“摄氏度数=(华氏度数-32)÷1.8”。

编写程序,根据用户输入的摄氏温度数将其转换为华氏温度数。

本章总结

本章主要介绍了Python中的数据类型(包括数字类型、字符串类型)、数据类型转换、运算符等知识。通过本章的学习,希望读者能掌握Python中的基本数据类型的常见操作,多加思考并动手练习,为后续的学习打下扎实的基础。

本章作业

一、填空题

1.Python的数字类型包含整型、________、________、________。

2.布尔类型是一种特殊的________。

3.Python中的复数是由________和________组成的。

4.Python表达式1/2的值为________,1//3+1//3+1//3的值为________,5%3的值为________。

5.已知s1='red hat',print(s1.upper())的结果是________,s1.swapcase()的结果是________,s1.title()的结果是________,s1.replace('hat','cat')的结果是________。

二、判断题

1.Python中的整型可以使用二进制、八进制、十进制、十六进制表示。( )

2.浮点型不可与复数类型数据进行计算。( )

3.使用切片操作字符串其起始位置只能从1开始。( )

4.在Python中可以使用“<>”表示不等于。( )

三、选择题

1.已知a=3,b=5,下列计算结果错误的是( )。

A.a+=b的值为8

B.a<<b的值为96

C.a and b的值为5

D.a//b的值为0.6

2.以下关于Python语句的叙述中,正确的是( )。

A.同一层次的Python语句必须对齐

B.Python语句可以从一行的任意一列开始

C.在执行Python语句时,可发现注释中的拼写错误

D.Python程序的每行只能写一条语句

3.访问字符串中的部分字符的操作称为( )。

A.切片

B.合并

C.索引

D.赋值

4.关于Python中的复数,下列说法错误的是( )。

A.表示复数的语法形式是a+bj

B.实部和虚部都必须是浮点数

C.虚部必须加后缀j,且必须是小写

D.函数abs()可以求复数的模

5.关于Python字符串类型的说法中,下列描述错误的是( )。

A.字符串用来表示文本的数据类型

B.Python中可以使用单引号、双引号、三引号定义字符串

C.Python中单引号与双引号不可一起使用

D.使用三引号定义的字符串可以包含换行符

四、编程题

1.使用数值类型声明多个变量,并使用不同方式为不同的数值类型的变量赋值。熟悉每种数据类型的赋值规则和表示方式。

2.使用数学运算符、逻辑运算符编写40个表达式,先自行计算各表达式的值,然后通过程序输出这些表达式的值并进行对比,看看能否做到一切尽在掌握中。

3.从标准输入读取两个整数并打印两行,其中第1行输出两个整数的整除结果;第2行输出两个整数的带小数的除法结果。不需要执行任何四舍五入或格式化操作。

4.从标准输入读取两个整数并打印三行,其中第1行包含两个数的和;第3行包含两个数的差(第1个数减第2个数);第3行包含两个数的乘积结果。

5.请将字符串“python”逆序输出。