0x00 前言简述
描述:上篇介绍了Python3编程基础数据类型,本篇将介绍Python3编程中的有那些运算符以及操作运算符优先级顺序,这也是在Python3编程中非常重要的一个部分,下来就跟随作者快速过一遍,加深一点印象吧!
温馨提示:作者学习Python3编程实践主要在 Ubuntu 24.04 TLS
Python 3.12
Jupyter Notebook
环境中运行,若要配置为作者的学习环境,可参考《#AIGC学习之路》专栏中的流程。
温馨提示:若各位看友在其他平台看到此篇文章,一定要关注公众号【全栈工程师修炼指南】进行持续学习!我们一同学习,一起进步,关注后回复【加群】哟!
什么是运算符?
简单的说,在编程语言中运算符,就是将定义变量进行加减乘除(运算)、移除运算、比较运算、逻辑运算等等; 例如,
4 5 = 9
,其中1
和5
被称为操作数,称为运算符。
有哪些运算符?
描述:Python 语言支持以下常见类型的运算符:
- 算术运算符:
、-、*、/、%、//、**
- 比较(关系)运算符:
==、!=、>、<、>=、<=
- 赋值运算符:
=、 =、-=、*=、/=、%=、//=、**=、:= (海象运算符,Python3.8 版本新增运算符)
- 逻辑运算符:
and、or、not
- 位运算符:
&、|、^、~、<<、>>
- 成员运算符:
in、not in
- 身份运算符:
is、is not
运算符优先级? (重点部分)
描述:下表列出了从最高到最低优先级的所有运算符,相同单元格内的运算符具有相同优先级, 相同单元格内的运算符从左至右分组(除了幂运算是从右至左分组)。
注意:这里运算符均指二元运算,除非特别指出。
运算符 | 描述 |
---|---|
(expressions...),[expressions...], {key: value...}, {expressions...} | 圆括号的表达式 |
x[index], x[index:index], x(arguments...), x.attribute | 读取,切片,调用,属性引用 |
await x | await 表达式 |
** | 乘方(指数) |
x, -x, ~x | 正,负,按位非 NOT |
*, @, /, //, % | 乘,矩阵乘,除,整除,取余 |
, - | 加和减 |
<<, >> | 移位 |
& | 按位与 AND |
^ | 按位异或 XOR |
` | ` |
in,not in, is,is not, <, <=, >, >=, !=, == | 比较运算,包括成员和身份运算符 |
not x | 逻辑非 NOT |
and | 逻辑与 AND |
or | 逻辑或 OR |
if -- else | 条件表达式 |
lambda | lambda 表达式 |
:= | 赋值表达式,优先级最低. |
0x01 Python运算符
1.算术运算符
描述:基本每个编程语言都有算术运算符,很简单不在累述,以下假设变量 a=10,变量 b=21:
运算符 | 描述 | 实例 |
---|---|---|
| 加 - 两个对象相加 | a b 输出结果 31 |
- | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -11 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 210 |
/ | 除 - x 除以 y | b / a 输出结果 2.1 |
% | 取模 - 返回除法的余数 | b % a 输出结果 1 |
** | 幂 - 返回x的y次幂(x^y)(注: 除开(),通常其优先级最高) | a**b 为10的21次方 |
// | 取整除 - 往小的方向取整数 | 9//2 = 4 -9//2 = -5 |
1.2 比较运算符
以下假设变量 a 为 10,变量 b 为20:
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True。 |
> | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b) 返回 True。 |
>= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 True。 |
特别注意:
- Python3 已不支持
<>
运算符,请使用!=
代替,若要兼容 Python 2 中的<>
可导入如下模块from __future__ import barry_as_FLUFL
1.3 赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | 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 |
:= | 海象运算符,这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值. | Python3.8 版本新增运算符。 |
特别说明:
在 Python 3.8 及更高版本中,引入了一种l类似于Go语言的一种新的赋值语法,称为"海象运算符"(Walrus Operator),它使用 :=
符号。此运算符的主要目的是在表达式中同时进行赋值和返回赋值的值,这可以减少代码的重复,提高代码的可读性和简洁性。
例如,传统赋值与海象运算符的对比。
代码语言:javascript复制# 传统计算赋值写法
n = 10
if n > 5:
print(n)
# 使用海象运算符(将变量 n 赋值为 10,同时返回这个赋值结果,再判断赋值后的 n 是否大于 5)
if (n := 10) > 5:
print(n)
1.4 位运算符
在 Python 中按位运算符
是把数字看作二进制来进行计算的,假若变量 a 为 60,b 为 13二进制格式为a = 0011 1100
,b = 0000 1101
。
&
按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。例如,(a & b) 输出结果 12|
按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。例如,(a | b) 输出结果 61^
按位异或运算符:当两对应的二进位相异时,结果为1 。例如,(a ^ b) 输出结果 49
~
按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。(~x 类似于 -x-1 ,在一个有符号二进制数的补码形式)。例如,(~a ) 输出结果 -61
(补码:反码(原码取反
) 1)
<<
左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。例如,a << 2 输出结果 240>>
右移动运算符:把 " >> "左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 。例如,a >> 2 输出结果 15
1.5 逻辑运算符
Python语言支持逻辑运算符,其类似于C语言中短路求值运算符&&
,以下假设变量 a 为 10, b为 20:
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and(与) | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值。 | (a and b) 返回 20。 |
or(或) | x or y | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
not(非) | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
特别注意:
- Python3 逻辑运算符不支持
&&
、||
、!
等符号表示,注意不要和其他编程语言混淆了。 - Python3 逻辑运算符优先级顺序为
NOT
、AND
、OR
。 - Python3 中的 and 逻辑运算符左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个值,而 or 逻辑运算符则是返回第一个为真的值,其中
数字 0 是假
,字符 "" 是假
其他都是真;。
10 and 20 # 为 True 返回 20
10 or 20 # 为 True 返回 10
0 and 20 # 为 False 返回 0
"" or 20 # 为 False 返回 20
1.6 身份运算符
Python 中身份运算符用于比较两个对象的存储单元。
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
is not | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 **id(x) != id(y)**。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
温馨提示:Python 中 id() 函数用于获取对象内存地址。
特别注意:
- python3 中
is
与==
运算符是有区别的,前者判断两个变量是否是引用同一个内存地址,后者调用的是__eq__()
方法判断两个变量是否相等,所以a==b
等效于a.__eq__(b)
。
1.7 成员运算符
除了以上的一些运算符之外,Python 还支持成员运算符,用于判断变量x是否在字符串,列表或元组等对象中
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
0x02 运算符示例
Q: 3*1**3
表达式输出结果为?
答案:3 因为 ** 优先级高于 *。
Q: 9//2
表达式输出结果为?
答案: 4 因为 // 用于向下取接近除数的整数。
Q: 下述Python代码输出的值是?
代码语言:javascript复制x = True
y = False
z = False
if x or y and z:
print("yes")
else:
print("no")
答案:yes 因为 and 拥有更高优先级,会先行运算。
示例:Python 操作运算符综合案例
代码语言:javascript复制#!/usr/bin/python3
# coding=utf-8
# 功能:操作运算符综合案例
# 算术运算符
print("2 / 4 = ", 2 / 4) # 除法 , 得到浮点数
print("2 // 4 = ",2 // 4) # 取整除 , 往小的方向取整数
print("-9//2 = ",-9//2) # 取整除 , 往小的方向取整数
print("2 ** 4 = ",2 ** 4) # 乘方 , 返回x的y次幂,优先级高
print("5 % 4 = ",5 % 4) # 取余 ,
# 比较运算符
a = 1; b = 2
if ( a == b ):
print ("a 等于 b")
elif (a != b):
print ("a 不等于 b")
# 赋值运算符
c = 1 1
c = 1
print("c = 1 值为:",c)
c **= 3
print("c **= 3 值为:",c)
c //= 2
print("c //= 2 值为:",c)
# 海象赋值运算符,Python 3.8 新增
a=["1024.00", 1024]
if (n := len(a)) > 0:
print(f"List is too long ({n} elements, expected > 0)")
# 位运算
a = 1
b = 8
print("a&b = ", a&b) #与
print("a|b = ", a|b) #或
print("a^b = ", a^b) #亦或
print("~a = ", ~a) #取反
print("a<<2 = ", a<<2) #左移动
print("a>>1 = ", a>>1) #右移动
# 逻辑运算符
a = 1
b = 2
print((a and b)) # 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。
print((a or b)) # 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。
print(not(a or b)) # 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。
# 员运算符
a = 10
b = 10
print(id(a),id(b)) # 判断两个变量引用对象是否为同一个
list = [1, 2, 3, 4, 5 ]
if(a in list):
print("a 在list列表里面")
else:
print("a 不在list列表里面")
if(b not in list):
print("a 不在list列表里面")
else:
print("b 在list列表里面")
# 成员运算符
a = 20
b = 20
if ( a is b ):
print ("1 - a 和 b 有相同的标识")
else:
print ("1 - a 和 b 没有相同的标识")
#注: id() 函数用于获取对象内存地址
if ( id(a) == id(b) ):
print ("2 - a 和 b 有相同的标识")
else:
print ("2 - a 和 b 没有相同的标识")
# 验证算术运算符优先级
a,b,c,d,e = 20,10,15,5,0
e = (a b) * c / d #( 30 * 15 ) / 5
print ("(a b) * c / d 运算结果为:", e)
e = ((a b) * c) / d # (30 * 15 ) / 5
print ("((a b) * c) / d 运算结果为:", e)
e = (a b) * (c / d); # (30) * (15/5)
print ("(a b) * (c / d) 运算结果为:", e)
e = a b * c / d; # 20 (150/5)
print ("a (b * c) / d 运算结果为:", e)
执行结果:
代码语言:javascript复制2 / 4 = 0.5
2 // 4 = 0
-9//2 = -5
2 ** 4 = 16
5 % 4 = 1
a 不等于 b
c = 1 值为:3
c **= 3 值为:27
c //= 2 值为:13
List is too long (2 elements, expected > 0)
a&b = 0
a|b = 9
a^b = 9
~a = -2
a<<2 = 4
a>>1 = 0
2
1
False
9772104 9772104
a 不在list列表里面
a 不在list列表里面
1 - a 和 b 有相同的标识
2 - a 和 b 有相同的标识
(a b) * c / d 运算结果为:90.0
((a b) * c) / d 运算结果为:90.0
(a b) * (c / d) 运算结果为:90.0
a (b * c) / d 运算结果为:50.0
知识补充:
- 数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
- 在混合计算时,Python会把整型自动转换成为浮点数。
- is 与 == 区别,前者用于判断两个变量引用对象是否为同一个,后者用于判断引用变量的值是否相等。
- 逻辑运算符是
not、and 、or
优先级 - 幂指数
**
比左侧的优先级高, 比右侧的优先级低 - 使用
(x > y) - (x < y)
来判断x/y
是否相同,如果x < y
返回 -1, 如果x == y
返回 0, 如果x > y
返回 1