一.运算符
1.算术运算符
运算符 | 描述 | 实例(设变量a=10,b=20) |
+ | 加 , 两个对象相加 | a + b 输出结果 30 |
- | 减 , 得到负数或是一个数减去另一个数 | a - b 输出结果 -10 |
* | 乘 , 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 200 |
/ | 除 , x除以y | b / a 输出结果 2 |
% | 取模 , 返回除法的余数 | b % a 输出结果 0 |
** | 幂 , 返回x的y次幂 | a**b 为10的20次方, 输出结果 100000000000000000000 |
// | 取整除 , 返回商的整数部分(向下取整) | 9 // 2 输出结果 4 -9 // 2 输出结果 -5 |
算术运算符的运算顺序: 先算乘方,然后是乘除,最后算加减. 如果运算过程中想修改默认的运算顺序,就需要加上 ( ) .
在Python中,0/0.0都不能作为除数.(会出现抛出异常,程序被终止).
除法的截断: 如果是整数/整数,除不尽,得到的就是小数,不会出现截断的情况.
**进行的乘方运算,既支持整数次方,也支持小数次方.(即开方运算)
// 表示地板除法(取整除法) ,其实就相当于C语言里的除法.但要注意负数运算是向下取整!
Python中,字符串之间可以相加, 整数和浮点数可以相加, 整数和布尔值可以相加 (True为1,False为0)但是没有意义.
Python中只有字符串类型,没有字符类型!
2.关系运算符
像< <= > >= == !=这一系列的运算符称为关系运算符,它们是在比较操作数之间的关系.
其中:
- <=是 小于等于
- >=是 大于等于
- ==是 等于
- !=是 不等于
如果关系符合,则表达式返回True.如果关系不符合,则表达式返回False.如:
a=10
b=20
print(a<b)
print(a>b)
print(a<=b)
print(a>=b)
print(a==b)
print(a!=b)
运行结果:
关系运算符比较字符串
关系运算符不仅能比较数字,还能比较字符串,如:
a="hello"
b="world"
print(a<b)
print(a>b)
print(a<=b)
print(a>=b)
print(a==b)
print(a!=b)
运行结果:
字符串的比较逻辑是字典序. 先看首字母在字母表上的顺序,谁小,谁就排在前面. 如果首字母相同,依次比较第二个字母,第三个字母...... 如果直到最后一个字母都相同,则两字符串相等. 字符串在字典上越靠前,就越小,越靠后,就越大.
注意:中文字符串在Python中可以比较大小,但比较的结果没有任何意义.
因为在计算机里,表示中文,是用多个字节构成的一个比较大的数字来进行比较的.
在某些场景中需要对中文进行排序时,需要借助第三方库来实现.
关于字符串能否使用==/!=来比较:
Python中支持连续大于或连续等于(链式赋值)的写法,这一点在C语言中是不支持的,如:
a=10
print(0<a<20) #判定a是否大于0且小于20
运行结果:
关系运算符比较浮点数
针对浮点数来说,使用==比较相等,会存在一定的风险!!!
因为浮点数在内存中的存储和表示,是可能存在误差的!!!
(有关浮点数在内存中的存储还不清楚的朋友可以移步我的这篇博客【C数据结构】整形和浮点型在内存中的存储,里面对整数和浮点数在内存中的存储方式做了较为生动的图解)
这样的误差在进行算术运算的时候就可能被放大,从而导致==的判定出现误判.
如:
我们逐步拆解一下这个表达式的问题:
print(0.1+0.2==0.3)
print(0.1)
print(0.2)
print(0.1+0.2)
print(0.3)
输出结果:
可以看到,虽然0.3和0.3000000000000004已经非常接近了.
但是如果直接使用==进行比较,仍然会出现False的情况.
正确的比较浮点数相等:作差,看差值是否小于预期的误差范围!
如:
a= 0.1 + 0.2
b= 0.3
#看a-b是否是一个非常小的数字,是否在误差范围之内
print(-0.000001<(a-b)<0.000001)
运行结果:
3.逻辑运算符
and
并且
两侧操作数均为True,表达式的值为True.否则为 False.(一假即假)
or
或者
两侧操作数均为False,表达式的值为False,否则为True(一真即真)
not
逻辑取反
只有一个操作数.操作数为True,则返回False,操作数为False,则返回True.
短路求值:
是逻辑运算符中的重要细节.
对于and操作来说,如果左侧表达式为False,那么整体的值一定是False,右侧的表达式不必求值. 对于or操作来说,如果左侧表达式为True,那么整体的值一定是true,右侧的表达式不必求值.
验证方法:
下面这个程序如果没有短路求值的话,那么接着运行,用0做除数会导致程序抛出异常
a=10
b=20
print(a>b and 10/0==1) #此处如果没有短路求值的话,那么接着运行用0做除数会导致程序抛出异常
运行结果:
可以看到,程序成功运行,并给出了表达式的判断结果.
如果将and左右的表达式交换位置:
a=10 b=20 print(10/0==1 and a>b)
运行结果就会抛出异常:
可见,由此可以验证短路求值是真实存在的.
4.赋值运算符
运算符 | 描述 | 实例 |
= | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
=表示赋值,将右侧的值填充到左侧的空间中.
因此=左侧必须是变量,不能是无法修改的常量或常量表达式.
使用复合赋值运算符时程序会先读取变量,然后计算,最后赋值,因此必须保证左侧的变量是已经被定义过的,否则程序就会因为第一步读取变量失败而报错.
Python中不支持++/--这样的自增操作!
链式赋值:
下面这种链式赋值的意思就是先把20赋值给b,再把b赋值给a.
a=b=20
该行代码相当于:
a=20
b=20
虽然链式赋值在语法上是允许的,但一般在编程中还是不建议使用,因为代码可读性会很低.
多元赋值:
下面这种多元赋值的意思是,把10赋值给a,把20赋值给b.
a,b=10,20
多元赋值也不推荐使用,但可以使用多元赋值帮助我们解决一些特殊的问题:
如,当我们需要交换两个变量的值时
传统方法是再创建一个临时变量来完成两个变量的互换,如:
a=10
b=20
tmp=a
a=b
b=tmp
但使用多元赋值时,我们可以直接一步就完成交换,如:
a=10 b=20 a,b=b,a
今日感悟:超额付出,而不是等额付出,期待超额回报.