众所周知,在Python中运算符是非常重要的一部分,没有它们我们就不能写出栩栩如生的程序,那么它们具体有哪些类别呢?分别又有什么作用呢?优先级的情况优势怎样的呢?今天博主就带你走近Python运算符!
Python里的运算符主要有算术运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、成员运算符、身份运算符这七类。下面就让我来为大家细细地讲解吧!
目录
一、算术运算符
算术运算符就是我们平常所说的加减乘除,但是Python里的算术运算符不仅仅只有这四个,还有取余运算、整除运算、乘方(幂)运算。
| 名称 | 符号 | 描述 | 简单示例 | 备注 |
| 加法运算 | + | 求两个数的和或者用于连接字符串、列表等 |
|
|
| 减法运算 | – | 求两个数的差或者两个集合的差集等 |
|
|
| 乘法运算 | * | 求两个数的积或者用于创建重复字符串、列表等 |
|
|
| 除法运算 | / | 求两个数的商 |
|
【1】除不尽时默认保留16位小数,无论是否除尽,结果为浮点数 |
| 乘方运算 | 求一个数的某次方 |
|
【2】20.5代表sqrt(2) | |
| 整除运算 | // | 整除,舍去余数 |
|
【3】向下取整(不是向零) |
| 取余运算 | % | 求两个数相除后的余数 |
|
【4】向下取余,结果取绝对值 |
【1】print(1/3)的输出结果为0.33333,print(2/1)的输出结果为2.0
【2】20.5的意思是2的0.5次方,就是二次根号下2,math模块里面表示为sqrt(2)
【3】print(-3//2)的输出结果为-2(向下取整),而不是-1(向零取整)
【4】print(-2.5%2)的输出结果为1.5,其计算过程为向下取余得到-1.5,取绝对值得到1.5
二、比较运算符
比较运算符,顾名思义,就是用来比较两个对象的,一般用在循环语句中的循环终止判断条件或者在if-elif-else语句中,返回值是一个【1】布尔值。
| 符号 | 描述 | 简单示例 | 备注 |
| >或>= | 判断一个对象是否大于(等于)另一个对象 |
|
|
| <或<= | 判断一个对象是否小于(等于)另一个对象 |
|
|
| == | 判断两个对象是否相同 |
|
【2】判断两个对象的值在一定范围内是否相同 |
| != | 判断两个对象是否不同 |
|
【1】有些时候返回值True和False会被视为1和0,如print([1,2][1>2])的输出结果为1
【2】在一定范围内,整型与浮点型值相同用==去比较会输出True,但当值比较大的时候会输出False,这是由浮点数不准确导致的,print(1e+23 == 0000000000000)输出的结果为False(顺便一提,科学计数法表示的是浮点数),print(1==1.0)输出True
三、赋值运算符
赋值运算符是给一个变量进行赋值时使用的,【1】赋值的方式有很多种,而且在Python3.8版本中还新增加了一种运算符——海象运算符。为什么叫它海象运算符呢?因为它横起来看就像一只海象的眼睛和长长的牙齿。
| 名称 | 符号 | 描述 | 备注 |
| 简单赋值运算符 | = | 简单地定义一个变量并赋值 | |
| 加法赋值运算符 | += | a += b 等价于 a = a + b | 这七个赋值运算符与其等价式子相比,它们属于原地运算,它们的运算都是在自己原本的数值上进行计算和修改的,不会消耗额外的内存。而其等价式的实质是(以加法赋值运算符为例)先计算a+b并给其分配一个存储空间,然后再赋值给a,这样做会消耗额外且不必要的存储空间和运算时间。所以更加推荐使用赋值运算符! |
| 减法赋值运算符 | -= | a -= b 等价于 a = a - b | |
| 乘法赋值运算符 | *= | a *= b 等价于 a = a * b | |
| 除法赋值运算符 | /= | a /= b 等价于 a = a / b | |
| 乘方赋值运算符 | = | a = b 等价于 a = a b | |
| 整除赋值运算符 | //= | a //= b 等价于 a = a // b | |
| 取余赋值运算符 | %= | a %= b 等价于 a = a % b | |
| 海象运算符 | := |
a := 1 等价于声明定义a并赋值 |
【2】可以简化代码,提高效率 |
【1】赋值运算符还可以与位运算结合,即&=、|=、^=、~=、>>=、<<=
【2】下面的两段代码等价,但是上面的代码效率更高,代码量也更少!
if a:=1 : print('Yes')#'Yes'
a = 1 if a : print('Yes')#'Yes'
四、位运算符
位运算符或许听起来很神秘,看起来或许很难理解,其实吧,只要静下心来细细研读,还是可以弄明白的。位运算也没什么特定,就两点,一是比较难懂,二是运算速度快!为什么位运算符的名字这么奇怪嘞?‘位’是个什么意思呢?位运算是对数字的一种的运算,其本质是将十进制数字转化为二进制数字进行操作,这里涉及计算机的原理了,所以位运算非常快。所谓的‘位’就是二进制01数字串中0和1的位置的变化,具体看下表。
| 名称 | 符号 | 描述 | 简单示例 | 备注 |
| 按位与运算符 | & | 二进制数字相应位置都为1则为1,否则为0 |
|
对两个数字进行操作 |
| 按位或运算符 | | | 二进制数字相应位置都为0则为0,否则为1 |
|
|
| 按位异或运算符 | ^ | 二进制数字相应位置不同则为1,否则为0 |
|
|
| 按位取反运算符 | ~ |
【1】二进制数字相应位置0变1,1变0,即~n=-n-1 (相反数减一) |
|
对单个数字进行操作 |
| 左移运算符 | << |
二进制数字各位置左移,即n< (乘以2的m次方) |
|
|
| 右移运算符 | >> |
二进制数字各位置右移,即n>>m=n//(2m) (除以2的n次方后向下取整) |
|
【1】具体解释请参考这篇博客:Python学习中的“按位取反”笔记总结 - 逝水经年 - 博客园
【这里添加一些详细示例,供大家理解】
a = 25 #二进制为 0001 1001 b = 36 #二进制为 0010 0100 print(a&b) #0 #按位与运算 ==> 0000 0000 (0的二进制) print(a|b) #61 #按位或运算 ==> 0011 1101 (61的二进制) print(a^b) #61 #按位异或运算 ==> 0011 1101 (61的二进制) print(a<<2) #100 #左移运算 ==> 0110 0100 (100的二进制) print(a>>2) #6 #右移运算 ==> 0000 0110 (6的二进制) print(~a) #-26 #按位取反运算 ==> 1 0001 1010 (-26的二进制) print(~-a) #24 #按位取反运算 ==> 0 0001 1000 ( 24的二进制) #注:最左边单独的一位数字是符号位,1为负,0为正
五、逻辑运算符
逻辑运算符与我们在数学里面学的‘且’‘或’‘非’十分类似,【1】返回值一般为布尔值。
| 名称 | 符号 | 描述 | 备注 |
| 布尔与 | and | 同时为True则返回True,否则返回False | 对两个对象进行操作 |
| 布尔或 | or | 同时为False则返回False,否则返回True | |
| 布尔非 | not | 若为True则返回False,若为False则返回True | 【2】对单个对象(或者一个整体)进行操作 |
【1】当操作对象是具体的数字的时候返回值是具体的数,and若第一个数判断为False则返回第一个数,否则为第二个数(无论第二个数的True与False),or若第一个数判断为True则返回第一个数,否则为第二个数(无论第二个数的True与False)如print(1 and 0)输出结果为0
【2】print(not(1 and 0))的输出结果为True,(1 and 0)是用括号括起来了,算是一个整体
六、成员运算符
所谓成员运算符,就是判断一个元素是否在一个【1】序列中。
| 符号 | 描述 | 简单示例 | 备注 |
| in | 如果该元素在序列中就返回True,否则返回False |
|
|
| not in | 如果该元素在序列中就返回False,否则返回True |
|
in 在 not 的后面 |
【1】这个序列可以是字符串、列表、元组、字典、集合、数组等(对于字典是判断是否存在键)
七、身份运算符
身份运算符用于【1】比较两个对象的存储单元(是否引用自同一个对象),而不是简单地比较两个对象的类型或值!
| 符号 | 描述 | 简单示例 | 备注 |
| is | 判断两个对象的标识符是否引用自一个对象,若是就返回True,否则为False,a is b 等价于 id(a) == id(b) |
|
|
| is not | 判断两个对象的标识符是否引用自一个对象,若是就返回False,否则为True,a is not b 等价于 id(a) != id(b) |
|
is 在 not 的前面 |
【1】print([] is [])输出False,因为创建两个列表,它们的存储单元是不一样的,但是对于元组,如果元组中包含的元素一样,它与列表不同,它将输出True,但是会有一个SyntaxWarning
八、运算符优先级
不同的运算符有不同的优先级,这就好比我们在数学中学到的,乘方运算的优先级大于乘除法,乘除法的优先级大于加减法,有括号的先算括号里的,这三点在Python的运算符优先级规则里也是相同的,但在这之外,Python运算符优先级规则里还有一些规则,毕竟Python的运算符的数量还不少,不过还是建议在优先级不清晰的时候打上括号,便于阅读和理解。
| 运算符类型 | 类型内优先级 |
| 算术运算符 | 乘方 > 取余、整除、乘法、除法 > 加法、减法 |
| 比较运算符 | 各运算符优先级相同 |
| 赋值运算符 | 各运算符优先级相同 |
| 位运算符 | 按位取反 > 左移、右移、按位与、按位或、按位异或 |
| 逻辑运算符 | 布尔非 > 布尔与 > 布尔或 |
| 成员运算符 | 各运算符优先级相同 |
| 身份运算符 | 各运算符优先级相同 |
|
总运算符优先级 (从高到低) |
乘方>按位取反>取余、整除、乘法、除法>加法、减法>左移、右移、按位与、按位或、按位异或>比较运算符>赋值运算符>身份运算符>成员运算符>布尔非>布尔与>布尔或 |
九、特别注意
这里会指出一些需要我们特别注意的地方。
| 序号 | 描述 | 涉及运算符 |
| 1 | 整除运算符(//)是向下取整,而取整函数(int)是向零取整 | 整除运算符 |
| 2 | 对于正数的取余与数学上的取余没有区别,但是对于负数,Python里取余后要取绝对值 | 取余运算符 |
| 3 | 布尔非运算符的输出结果永远是True或者False,不像布尔与运算符和布尔或运算符 | 布尔非 |
| 4 | 字典与列表类似,创建时会新开辟一个内存空间 | 身份运算符 |
| 5 | 对于字典,成员运算符只会对字典的键进行判断 | 成员运算符 |
| 6 | 减法运算不能计算列表之差,但可以计算集合之差,因为集合里面没有重复元素 | 减法运算 |
【兄弟们啊!原创不易啊!原创不易啊!各位点个赞,收个藏,分个享再走呗!】
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227867.html原文链接:https://javaforall.net
