掌握了变量的定义与使用方法,以及不同的数据类型,我们就可以进行数据的运算了。在Scratch中,你会看到一系列的运算指令:
Python中当然比Scratch中支持的运算要丰富和强大得多。这一节我们就学习如何通过运算符进行数据运算。
一、Python中的运算符
Python数据之间的运算是通过不同的运算符实现的,包括算术运算符、赋值运算符、关系运算符、逻辑运算符。
算术运算符
算术运算符是指对数值进行加减乘除等算术运算的符号。 常用的运算符包括(假设a=3,b=2)
运算符 | 描述 | 举例 | 运算结果 |
---|---|---|---|
+ | 两个数相加 | a+b | 5 |
– | 在一个数前表示负数或表示两数相减 | a-b | 1 |
* | 两个数相乘 | a * b | 6 |
/ | 表示一个数除以另一个数 | a / b | 1.5 |
% | 取模,即两个数相除的余数 | a % b | 1 |
** | 幂运算,返回一个数的多少次方 | a ** b | 9 |
// | 整除,返回商的整数部分,即商向下取整 | a // b | 1 |
相对来说,算术运算符还是比较简单的,和Scratch中类似。但是要注意:
- / 和 // 的区别。/ 会得到正常的商,// 会对商向下取整。什么是向下取整呢?就是取比实际的商小的最接近的整数。如果是正数,比如3 // 2会得到1,但如果是负数,就不一样了,-3 // 2 得 -2,因为-2才是比-1.5小一点的整数。
- 3 ** 2是幂运算,如果你还没学过乘方,那就简单的认为 “**”运算符后面的数字代表有几个 “**” 前面的数字相乘。3 ** 2就是3 * 3,而3 ** 3就是3 * 3 * 3, 3 4就是3 * 3 * 3 * 3,依此类推。幂运算也可以用Python的内置函数 pow 代替,比如 pow(3,2)就是3 ** 2 的意思。
赋值运算符
简单的赋值运算符我们已经用过了,它用于完成“赋值运算”,即把“=”右侧的数值或计算结果赋值给左边的变量。 常用的赋值运算符包括(假设a=3, b=2):
运算符 | 描述 | 举例 | 运算结果 |
---|---|---|---|
= | 简单赋值运算 | c = a + b | c==5 |
+= | 加法赋值运算 | a += b | 等价于 a = a + b,结果 a == 5 |
-= | 减法赋值运算 | a -= b | 等价于 a = a – b,结果 a == 1 |
*= | 乘法赋值运算 | a *= b | 等价于 a = a * b,结果 a == 6 |
/= | 除法赋值运算 | a /= b | 等价于 a = a / b,结果 a == 1.5 |
%= | 取模赋值运算 | a %= b | 等价于 a = a % b,结果 a == 1 |
//= | 除法取整赋值运算 | a //= b | 等价于 a = a // b,结果 a == 1 |
**= | 幂赋值运算 | a **= b | 等价于 a = a ** b,结果 a == 9 |
看了上面的例子,不难理解,除了简单赋值,我们其实就是把算术运算的结果再赋值给变量。那么有一个问题:a =3+2这样的表达式代表什么呢?由于赋值运算符右边可以视为一个整体,a =3+2就等价于a=a * (3+2),即a = a * 5,我们需要先把赋值运算符右侧的表达式算出来,再去和 a 进行运算,把结果再赋值给a, 所以a最终等于15。
关系运算符
关系运算符也称为比较运算符,用于对变量或表达式进行比较,如果比较结果为真,则返回True,如果为假则返回False。关系运算符通常用于条件语句作为判断条件。在Scratch中我们已经学过 =、>、<。Python中的关系运算符包括(假设a=3, b=2):
运算符 | 描述 | 举例 | 运算结果 |
---|---|---|---|
== | 比较两个变量是否相等 | a == b | False |
!= | 比较两个变量是否不相等 | a != b | True |
> | 左边的数是否大于右边 | a > b | True |
< | 左边的数是否小于右边 | a < b | False |
<= | 左边的数是否小于或等于右边 | a <= b | False |
这里要强调的是,一定要注意Python中 “=” 号用来赋值,不用用来比较,这和Scratch是不一样的!要比较是否相待,记住用两个等号“==”!
逻辑运算符
逻辑运算符用于对真和假两种布尔值进行运算,结果仍为布尔值。我们在Scratch中学过了“与”、“或”、“不成立”,它对应着Python中三个逻辑运算符 and 、or 、not。
运算符 | 描述 | 举例 | 运算结果 |
---|---|---|---|
and | “与”运算 | x and y | x、y必须都为True,结果才为True,否则为False |
or | “或”运算 | x or y | x、y必须都为False,结果才为False,否则只要有一个为True,结果就是True |
not | “非”运算 | not x | 对x取反,如果x为True,结果为False;如果x为False,则结果为True |
二、运算优先级
我们学习四则运算的时候,老师告诉我们要“先乘除、后加减”,这就是乘除运算的优先级要高于加减。在编程中也存在这个问题,不同的运算符放在一起,必须按照如下规则运算:
- 优先级高的先执行,优先级低的后执行;
- 同样优先级的运算符,先左后右;
- 如果有括号,先对括号里面的内容进行运算。
Python中不同运算符的优先级从高到低顺序如下(同一行中运算符的优先级相同):
运算符 | 描述 |
---|---|
** | 算术运算符——幂运算 |
* 、/ 、% 、// | 算术运算符——乘、除、取模、取整除 |
+ 、- | 算术运算符——加、减 |
<、<= 、> 、>= 、== 、!= | 关系运算符 |
not | 逻辑运算符:非运算 |
and | 逻辑运算符:与运算 |
or | 逻辑运算符:或运算 |
三、数据类型转换
不同类型的数据是不能进行直接运算的,那如果我在终端中输入一个数字,input函数返回的是用字符串表示的数字,比如“12”,它并不能直接进行算术运算,怎么才能转换为整数呢?这就用到数据的类型转换。
实际上,在有些情况下,Python已经悄悄地为我们进行了类型转换,比如:
print(12 + 3.5) # 返回15.5
我们看到了,12和3.5分别属于整数和浮点数,为什么程序没有出错呢?因为Python认为,整数也可以用浮点数来表示,所以自动帮我们进行了转换。整数和浮点数运算的时候,会自动转换为浮点数,运算结果也是浮点数。那为什么不把浮点数转换为整数再运算呢?那是因为浮点数转换为整数就可能损失精度,你把3.5无论转换为4还是3,与原来的数字都不是相待的,这就会产生或大或小的精度损失,所以还是转换为浮点数保险一些。
对于其它的场景,Python并不知道我们编程者的意图,所以不会帮我们转换。比如我们前面说的用input函数返回值是字符串,如果要把它转换为数字,就要用“显式的”类型转换。这种转换一般由相应的Python函数完成,我们这里先列出常用的四种,其它类型的转换你会在开发过程中逐步遇到:
- int(x):把括号里面的内容转换成整数;
- float(x):把括号里面的内容转换成浮点数;
- str(x):把括号里面的内容转换成字符串;
- list(x):把括号里面的内容转换成列表。
上面这几个函数要求x必须是能够转换的,比如,你不能把“哈利波特”转换成数字。
我们来举两个实际的例子:
计算正方形的周长和面积:
# 数据类型示例:计算正方形的周长和面积
a = input('请输入正方形的边长:')
a = float(a) # 这里转换为浮点数float,也可以根据需要转换为整数,使用int()
print('正方形的周长是', a * 4 )
print('正方形的面积是', a ** 2 )
如果你把第二行代码 a = float(a)去掉,会发现程序在执行最后一行的时候出错了,提示 str(就是字符串) 不能进行 ** 运算。
你可能奇怪为什么输出周长的时候没出错呢?原来,字符串是支持 * (乘法)运算的,接下来的课程我们会讲到,字符串 * 一个数字,会把这个数字重复相应的次数。如果你在终端输入的边长时 5,正常情况下周长是20,如果你不转换数据类型,会发现周长会输出为 5555(把“5”这个字符串重复了4遍)。
当然,强制类型转换不见得一定成功。比如你输入的边长是 abcd,你觉得能强制转换成数字吗?显然不能,所以Python也会给你相应的提示:
如果你要把input的返回值转换为整数,那可以写成 a = int(a)就可以了。 简单的方法也可以把第一行和第二行写在一起:a = int(input(‘请输入正方形的边长:’))
计算圆的周长和面积
# 数据类型示例:计算圆的周长和面积
PI = 3.1415926
r = input('请输入圆的半径:')
r = float(r)
print('圆的周长是', round(PI * r * 2,2 )) # 使用round函数四舍五入,保留两位小数
print('圆的面积是', round(PI * r ** 2,2)) # 使用round函数四舍五入,保留两位小数
这个例子和计算正方形周长面积是相似的,不过我们不想让结果太长,所以使用了python内置的round函数,它和Scratch中的四舍五入一样,可以把结果保留到小数点后指定的位数。比如round(3.1415,2),结果就是3.14,如果写round(3.1415,3),就要返回3.142了。这个函数在处理浮点数时还是很有用的,请大家牢记。
四、课后作业
编写一个计算个人成绩总分和平均分的程序。在终端分别输入姓名、语文成绩、数学成绩、英语成绩,程序计算出三门成绩的总分和平均分,总分和平均分都保留两位小数,在终端中按下面的格式输出: