一.算术运算符
经过九年义务教育的你我,算术运算符对于我们其实并不陌生,算术运算符包括 + - * / % // 乘方开方 ( )。
1.运算次序
进行算术运算我们首先要明白算术运算的次序问题。最先进行运算的,是括号内的内容,其次是乘方和开方运算,再进行乘除运算,最后进行加减运算。
2.+ - *
这三个运算并没有什么需要特别注意的问题,所以我们放在一块来介绍,同时说明带括号的顺序问题。
a = 1 + 2 * 3
print(a)
b = (1 + 2) * 3
print(b)
这里我们可以看到,带括号和不带括号的运算顺序是不一样的。
3. /
除法运算大家也并不陌生,但是在计算机运算中,仍然有几个需要注意的问题。
(1)除法运算的除数不能是 0 。
print(1 / 0)
这种运行时出现的错误,也叫做“抛出异常”。如果程序运行过程中抛出异常,程序就直接终止了,异常后面的代码也就不会执行了。
需要注意的是,对于 python 而言,除以 0 和 0.0 的结果是一样的,但是有些编程语除以浮点数0.0会得到无穷大。
(2)整数除不尽
整数 / 整数,如果除不尽,得到的就是小数,不会出现截断,舍弃小数部分的情况。
4. %
取余属于小学二年级的知识,那时的我们还不知道小数是怎么一回事,就有了取余的概念,比如说,7 / 3,除不尽,剩余 1。
print(7 % 3)
5.乘方开方
前面我们已经简单介绍过了乘方运算。乘方运算的符号是 ** ,两个 ** 是平方,三个 *** 就是三次方了,以此类推。
print(4 ** 2)
print(4 ** 0.5)
乘方后面跟的是整数,开放开的就是小数了。
6. //
// 叫做地板除法(取整除法) ,会针对出发的结果“向下取整”。
print(7 // 2)
print(-7 // 2)
7 / 2 的结果是 3.5 ,-7 / 2 的结果是 -3.5 ,向下取整,就是往小了取,得到结果 3,-4。
二.关系运算符
关系运算符就是比较两个操作数“大小”,“相等”关系的运算符。关系运算符包括,<(小于),>(大于),<=(小于等于),>=(大于等于),==(是否相等),!=(不相等)。
1.关系运算符的值为布尔类型。
a = 10
b = 20
print(a < b)
print(a > b)
print(a <= b)
print(a >= b)
print(a == b)
print(a != b)
2.关系运算符不仅能比较数字还能比较字符串
听起来是比较神奇的,比较字符串的根据是“字典序”,也就是字母表的排序,比如 abondon,这就是一个比较小的字符串,首字母拍的越靠后,字符串也就越大,如果首字母相同,那就比较第二个字母。
a = 'hello'
b = 'world'
print(a < b)
print(a > b)
print(a <= b)
print(a >= b)
print(a == b)
print(a != b)
还有一个注意的点,中文字符串进行这样的比较是没有意义的,同时,python中的字符串可以使用 == , != ,来比较字符串内容是否相同。
3.使用 == 比较 float 类型具有风险
浮点数在内存中的存储和表示,是可能存在误差的,这样的误差在进行算术运算的时候就可能被放大,从而导致 == 的判定出现误差!
print(0.1)
print(0.2)
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
我们可以看到,0.1 + 0.2 的结果已经十分接近 0.3了,但是仍然不相等,所以这并不是判定两个浮点数是否相等的正确做法。那么正确做法是什么呢?
a = 0.1 + 0.2
b = 0.3
print(- 0.00001 < (a - b) < 0.00001)
这个代码是通过观察 a - b 的值是不是一个非常小的值,是否在误差范围之内。这是一种连续比较,python 中支持这种连续比较,但是C和java并不支持。
三.逻辑运算符
逻辑运算符包括三个 and ,or,not。
1. and
and 表示并且,就是既要也要,连吃带拿的意思,就像你交往了女朋友,面见家长的时候,女方对你有要求,要求你要有车并且有房。对于 and 而言,两侧的运算式必须都得是 True 表达式的值才能是 True。(have car and have house)此时,女方对你满意,也就是表达式为 True,否则就是False(一假即假)。
2.or
or 表示或者,表示或者...或者...的意思,还是引用 and 中的例子,女方的要求降低了,要求你要么有车要么有房,有一个就行了。所以对于 or 而言,两侧都运算式只要有一个是 True 就足够整个表达式为 True ,为(一真即真)。
3.not
not 表示逻辑取反,也就是原来一个为 True 的表达式前面加一个 not ,那么这个表达式的真值就变成了 False。
a = 10
b = 20
c = 30
print(a < b and b < c)
print(a < b and b > c)
print(a > b or b < c)
print(a < b or b > c)
print(a > b or b > c)
print(not a < b)
print(not a > b)
4.逻辑运算符的表达式中的重要细节:短路求值。
对于 and 这个操作而言,一假即假,如果左侧的表达式为 False ,那么整体表达式就为 False ,那就没有必要求右侧表达式的真值了。
对于 or 这个操作而言,一真即真,如果左侧的表达式为 True ,那么整体表达式就为 True ,那就没有必要求右侧表达式的真值了。
a = 10
b = 20
c = 30
print(a > b and 10 / 0 == 1)
and右侧的显然是一个会抛出异常的表达式,但是程序并没有报错,显然右边的代码并没有被执行。
四.赋值运算符
= 表示赋值,意思就是把等号右侧的值填充到左侧的空间之中。
== 表示相等。
1.链式赋值
形如 a = b = 20 这样的赋值,称为链式赋值,开辟a, b 两个空间,将 20 填入两个空间。但是一般不推荐这样的赋值。
2.多元赋值
形如 a, b = 10, 20 这样的赋值,称为多元赋值,开辟a, b两个空间,分别将 10,20 填入两个空间,同样不是很推荐这样的赋值,但是多元赋值能够很好地处理变量交换值的问题。
# 链式赋值
a = b = 20
# 多元赋值
c, d = 10, 20
#多元赋值帮助解决变量交换问题,比如:交换c,d的值
#一般方法:引入临时变量
tmp = c
c = d
d = tmp
print(c,d)
#使用多元赋值
c, d = d, c
print(c,d)
3.复合赋值
+= ,-= ,*= ,/= ,%= ,**= ,//= ,形如此类的赋值运算符称之为复合赋值运算符。 通过一段代码,我们来理解它的含义。
a = 0
a += 1 # 等价于 a = a + 1
print(a)
a += 1,等价于 a = a + 1。对于其他复合赋值运算符,表达的含义也是类似的。
五.其他运算符
除此之外,还有一些其他运算符,如 位运算符 ,成员运算符,身份运算符等。