Python3 | 练气期,操作运算符,优先级顺序!

2024-07-29 09:58:37 浏览数 (2)

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]

0x00 前言简述

描述:上篇介绍了Python3编程基础数据类型,本篇将介绍Python3编程中的有那些运算符以及操作运算符优先级顺序,这也是在Python3编程中非常重要的一个部分,下来就跟随作者快速过一遍,加深一点印象吧!

温馨提示:作者学习Python3编程实践主要在 Ubuntu 24.04 TLS Python 3.12 Jupyter Notebook 环境中运行,若要配置为作者的学习环境,可参考《#AIGC学习之路》专栏中的流程。

温馨提示:若各位看友在其他平台看到此篇文章,一定要关注公众号【全栈工程师修炼指南】进行持续学习!我们一同学习,一起进步,关注后回复【加群】哟!

什么是运算符?

简单的说,在编程语言中运算符,就是将定义变量进行加减乘除(运算)、移除运算、比较运算、逻辑运算等等; 例如,4 5 = 9,其中15 被称为操作数, 称为运算符。

有哪些运算符?

描述: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 逻辑运算符优先级顺序为 NOTANDOR
  • Python3 中的 and 逻辑运算符左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个值,而 or 逻辑运算符则是返回第一个为真的值,其中数字 0 是假字符 "" 是假其他都是真;。
代码语言:javascript复制
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

0 人点赞