1.4 Python基础-运算符&表达式的运算

目录

  • 一、运算符优先级
  • 二、一元运算(+, -, ~)
  • 三、二元算数运算(**, *, /, %, //, @, +, -)
  • 四、二元位运算(<<, >>, &, ^, |)
  • 五、比较运算(==, !=, <>, <=, <, >, >=, in, not in, is, is not)
    • 5.1 链式比较
  • 六、逻辑运算(not, and, or)
  • 七、三元运算(if else)
  • 八、lambda表达式(lambda)
  • 九、赋值运算(=, :=)
    • 9.1 增强赋值语句(不是运算符)

一、运算符优先级

以下表格“从最高到最低”的列出了常用运算符的优先级:

优先级 运算符 描述
1 () 小括号
2 ** 幂运算(指数)
3 + , - , ~ 正,负,按位取反
4 * , / , % , // , @ 乘法,除法,取模(余数),取整除(商数),矩阵乘
5 + , - 加法,减法
6 <<, >> 左移(SHL),右移(SHR)
7 & 按位与(AND)
8 ^ 按位异或(XOR)
9 | 按位或(OR)
10 == , != , <> , <= , >= , < , > , in , not in , is , is not 比较运算符(包含成员检测运算和标识号比较运算)
11 not 逻辑非(NOT)
12 and 逻辑与(AND)
13 or 逻辑或(OR)
14 if else 条件表达式(三目运算,三元运算符)
15 lambda lambda表达式
16 = , := 直接赋值,海象运算符1

有关更多的运算符优先级说明,请参阅 Python-文档>语言参考>表达式>运算符优先级 。

二、一元运算(+, -, ~)

一元运算符 说明
+
-
~ 按位取反

一元运算符中 +- 为一元算数运算符,~ 为一元位运算符(只能作用于整数)。
实例

num = -8  # 二进制为 1111 1000
a = +num  # 取正后二进制仍然为 1111 1000
b = -num  # 取负后二进制为 0000 1000(包括符号位在内按位取反,再加1)
c = ~num  # 按位取反后二进制为 1000 0111(包括符号位在内按位取反)
print("a =", a)
print("b =", b)
print("c =", c)

输出:

a = -8
b = 8
c = 7

三、二元算数运算(**, *, /, %, //, @, +, -)

二元算数运算符 说明
** 幂运算(指数运算)
* 乘法
/ 除法
% 取模(余数)
// 取整除(商数)
@ 矩阵乘法
+ 加法
- 减法

如果幂运算符一元运算符的左侧(如:2 ** - 1),那么幂运算符的优先级较一元运算符更高些;但如果在右侧(如:- 4 ** 1),那么幂运算符的优先级较低一些。

运算符 * (乘) 两侧参数可以分为两种:

  • 可以全部为数字,这时计算结果为两个数字相乘的乘积(类型为两个数字中数据宽度较大的类型);
  • 两侧参数也可以是,一个参数为整数N,另一个参数为序列类型L1,这时的计算结果为 序列L1重复N次 后生成一个新的序列L2。

运算符 @ (at) 是用于矩阵乘法的,但Python内置类型中,并没有满足参数要求的类型可以实现此运算符的运算操作。可以使用外置模块中的类型实现矩阵乘法运算,比如:numpy.array()

实例

# 幂运算符在负号的左侧,所以幂运算符优先程度较高,如同 2 ** (-1)
print(2 ** - 1)
# 幂运算符在负号的右侧,所以幂运算符优先程度较低,如同 -(4 ** 2)
print(- 4 ** 2)
print("5 * 2 =", (5 * 2))  # 乘法运算1
print("123" * 2)  # 乘法运算2
print("5 / 2 =", (5 / 2))  # 除法运算
print("5 %% 2 =", (5 % 2))  # 求模运算
print("5 // 2 =", (5 // 2))  # 求整除法运算
print("5 + 2 =", (5 + 2))  # 加法运算
print("5 - 2 =", (5 - 2))  # 减法运算

输出:

0.5
-16
5 * 2 = 10
123123
5 / 2 = 2.5
5 % 2 = 1
5 // 2 = 2
5 + 2 = 7
5 - 2 = 3

四、二元位运算(<<, >>, &, ^, |)

二元位运算符 说明
<< 位左移
>> 位右移
& 按位与(AND)
^ 按位异或(XOR)
| 按位或(OR)

<<>>可以统称为移位运算。移位运算两侧的参数只能为整数,例:x << n 表示将整数x左移n个二进制位,本质是x * (2 ** n)x >> n 表示将x右移n个二进制位,本质是 x // (2 ** n)

&^| 三个运算符两侧参数也只能是整数,分别表示对各自两侧的参数进行按位与运算、按位异或运算、按位或运算。

实例

num = 20    # 十进制 20转换成二进制后为 0001 0100
num2 = -13  # 十进制-13转换成二进制后为 1111 0011
print("num =", num)
print("num << 2 =", (num << 2))  # num左移两位后得80,即 0101 0000
print("num << 2 =", (num >> 2))  # num右移两位后得5,即 0000 0101
print("num & num2 =", (num & num2))  # num 和 num2 每个二进制位互相做与运算后得16,即 0001 0000
print("num ^ num2 =", (num ^ num2))  # num 和 num2 每个二进制位互相做异或运算后得-25,即 1110 0111
print("num | num2 =", (num | num2))  # num 和 num2 每个二进制位互相做或运算后得-9,即 1111 0111

输出:

num = 20
num << 2 = 80
num << 2 = 5
num & num2 = 16
num ^ num2 = -25
num | num2 = -9

注意:在计算机中负数都是以补码的形式存储的,所以要用负数的二进制补码参与各种运算。

五、比较运算(==, !=, <>, <=, <, >, >=, in, not in, is, is not)

比较运算符 说明
== 等于
!= 不等于
<> 不等于(类似于"!=")
<= 小于等于
>= 大于等于
< 小于
> 大于
in 成员包含于,成员检测运算
not in 成员不包含于,成员检测运算
is 对象一致,标识号比较运算
is not 对象不一致,标识号比较运算

Python中的有 值比较成员检测标识号比较 三种比较运算,比较运算的结果是布尔值: TrueFalse

  • 值比较运算 包括 ==, !=, <=, >=, <, > 六个运算符。比较的是两个对象的值,且两个对象可以为不相同的类型。注意链式比较的情况(有关链式比较请参阅本文章的 5.1 链式比较)。

  • 成员检测运算 包括 in, not in 两个运算符。 如果有 成员x 和 序列(或集合,或字典)s ,那么当 x 包含于 s 中时 x in sTrue ,否则为 False ;当 x 不包含于 s 中时x not in sTrue ,否则为False 。 所有内置序列和集合类型以及字典都支持此成员检测运算。

  • 标识号比较运算 包括 is, is not 两个运算符。如果有x 和 y 均表示对象,当且仅当 x 和 y 是同一对象时 x is yTrue,否则为 False ;当 x 和 y 不是同一对象时 x is not yTrue , 否则为 False 。对象的标识号可使用 id() 函数来确定。

实例

print("10 == 10 的结果为:", (10 == 10))
print("10 == 5 的结果为:", (10 == 5))
print("10 != 5 的结果为:", (10 != 5))
print("10 > 5 的结果为:", (10 > 5))
print("\"abc\" == \"abc\" 的结果为:", ("abc" == "abc"))
print("\"abb\" == \"abc\" 的结果为:", ("abb" == "abc"))
print("\"abb\" != \"abc\" 的结果为:", ("abb" != "abc"))
print("\"abb\" < \"abc\" 的结果为:", ("abb" < "abc"))  # 字符串的值比较将从左到右依次比较单一字符的ASCII码
print("""'字' in "字符串" 的结果为""", ('字' in "字符串"))
print("""'的' not in "字符串" 的结果为""", ('的' not in "字符串"))
print('''"字符串" is "字符串" 的结果为''', ("字符串" is "字符串"))
print('''"字符串2" is not "字符串" 的结果为''', ("字符串2" is not "字符串"))

输出:

10 == 10 的结果为:True
10 == 5 的结果为:False
10 != 5 的结果为:True
10 > 5 的结果为:True
“abc” == “abc” 的结果为:True
“abb” == “abc” 的结果为:False
“abb” != “abc” 的结果为:True
“abb” < “abc” 的结果为:True
‘字’ in “字符串” 的结果为 True
‘的’ not in “字符串” 的结果为 True
“字符串” is “字符串” 的结果为 True
“字符串2” is not “字符串” 的结果为 True

有关 值比较运算、成员检测运算 、标识号比较运算 的更多说明,请参阅 Python-文档>语言参考>表达式>比较运算 。

5.1 链式比较

比较运算可以任意的串连为链式比较运算,例如 x <= y < z 等价于 x <= y and y < z ,也就是说 x <= y and y < z 也等价与 x <= y < z

Python推荐使用 链式比较x <= y < z)替换传统的 比较运算+逻辑与运算x <= y and y < z)。

实例

print(True == 1)
print(0 == 0 == 1)  # 见下方【注1】

输出:

True
Flase

【注1】:如果不考虑链式比较,很容易认为表达式 0 == 0 == 1 应该从左到右依次运算,即 (0 == 0) == 1 ,这样的话 0 == 0True ,接下来 True == 1True ,很容易误以为最终结果为 True 。实际上 0 == 0 == 1 等价于 0 == 0 and 0 == 1 ,所及应该是 True and False ,最终结果为 False

六、逻辑运算(not, and, or)

即布尔运算。

逻辑运算符 说明
not 逻辑非(NOT)
and 逻辑与(AND)
or 逻辑或(OR)

进行逻辑运算时,除了下列的值会被认为是假值之外,剩下的其他所有的值都会被认为是真值,会被解析为假值的值如下所示:

  • False
  • None
  • 所有类型的数字零
  • *空容器(包括字符串、元组、列表、集合、字典与冻结集合)。

运算符 not 的运算结果是一个新创建的布尔值,所以结果只有 TrueFalse 两种。not 的参数如果被认为真值 True 时运算结果为 False ;参数被认为 False 时运算结果为 True (取相反的布尔值)。

运算符and 的运算结果不一定是 TrueFalse,而是具体运算后求得的值。有表达式:x and y ,会首先对 x 求值,如果 x 被认为是假值则直接返回该值,否则对 y 求值并返回其结果值

运算符 or 的运算结果不一定是 TrueFalse,而是具体运算后求得的值。有表达式:x or y ,会首先对 x 求值,如果 x 被认为是真值则直接返回该值;否则对 y 求值并返回其结果值

实例

print("(not True) 结果为:", (not True))
print("(not True) 结果为:", (not False), end="\n\n")  # end=这个参数表示print打印内容时以什么字符结尾

print("(2 - 1 and 2 > 1) 结果为:", (2-1 and 2 > 1))
print("(2 - 1 and 2 + 1) 结果为:", (2 - 1 and 2 + 1))
print("(2 - 2 and 2 + 2) 结果为:", (2 - 2 and 2 + 2), end="\n\n")

print("(2 - 1 or 2 > 1) 结果为:", (2 - 1 or 2 > 1))
print("(2 ? 1 or 2 - 1) 结果为:", (2 > 1 or 2 > 1))
print("(2 - 1 and 2 + 1) 结果为:", (2 - 1 and 2 + 1))
print("(2 - 2 and 2 + 2) 结果为:", (2 - 2 and 2 + 2), end="\n\n")

# 下面这段代码有非常好的应用场景,可以用在值的判断上
str1 = "123"
print(str1 is "123" and True)
str1 = "1234"
print(str1 is "123" and True)
str1 = ""
print(str1 or "str1是空字符串!")
str1 = "新的字符串"
print(str1 or "str1是空字符串!")

输出:

(not True) 结果为:False
(not True) 结果为:True
<换行>
(2 - 1 and 2 > 1) 结果为:True
(2 - 1 and 2 + 1) 结果为:3
(2 - 2 and 2 + 2) 结果为:0
<换行>
(2 - 1 or 2 > 1) 结果为:1
(2 ? 1 or 2 - 1) 结果为:True
(2 - 1 and 2 + 1) 结果为:3
(2 - 2 and 2 + 2) 结果为:0
<换行>
True
False
str1是空字符串!
新的字符串

七、三元运算(if else)

三元运算符 说明
if else 条件表达式(三目运算)

条件表达式运算语法:x if C else y 运算时首先会对条件C求值,如果结果被认为真值,那么直接对x求值并返回这个值,否则直接对x求值并返回这个值。

三目运算中的条件C除了下列的值会被认为是假值之外,剩下的其他所有的值都会被认为是真值,会被解析为假值的值如下所示:

  • False
  • None
  • 所有类型的数字零
  • *空容器(包括字符串、元组、列表、集合、字典与冻结集合)。

实例

print("左" if 2+2 else "右")
print("左" if 2-2 else "右")
print("左" if "条件" else "右")
print("左" if "" else "右")

输出:




八、lambda表达式(lambda)

九、赋值运算(=, :=)

赋值运算符 说明
= 直接赋值
:= 海象运算符1

9.1 增强赋值语句(不是运算符)

增强赋值语句不是运算符,但有些文章将其当作运算符,特在此说明。
在 Python 中还会看到例如+=-=的语句,在 Python 官方文档中这些被称为 增强赋值语句,不属于赋值运算。
增强赋值语句就是在单个语句中,将二元运算和赋值运算合为一体(二元运算包含二元算数运算、二元位运算)。其实就是将二元运算和赋值运算简写。
增强复制语句有如下:

增强赋值语句 说明 举例
二元算数运算
+= 加法 增强赋值语句 i += 2 等价于 i = i + 2
-= 减法 增强赋值语句 i -= 2 等价于 i = i - 2
*= 乘法 增强赋值语句 i *= 2 等价于 i = i * 2
/= 除法 增强赋值语句 i /= 2 等价于 i = i / 2
%= 取模 增强赋值语句 i %= 2 等价于 i = i % 2
//= 取整数 增强赋值语句 i //= 2 等价于 i = i // 2
**= 幂运算 增强赋值语句 i **= 2 等价于 i = i ** 2
@= 矩阵乘法增强赋值语句 i @= 2 等价于 i = i @ 2
二元位运算
<<= 位左移 增强赋值语句 i <<= 2 等价于 i = i << 2
>>= 位右移 增强赋值语句 i >>= 2 等价于 i = i >> 2
&= 按位与 增强赋值语句 i &= 2 等价于 i = i & 2
^= 按位异或 增强赋值语句 i ^= 2 等价于 i = i ^ 2
|= 按位或 增强赋值语句 i |= 2 等价于 i = i | 2

有关 增强赋值语句 的更多说明,请参阅 Python-文档>语言参考>简单语句>增强赋值语句 。


参考资料(如有侵权,请联系作者删除内容):

  • Python 3.8.0 官方文档-表达式

  1. 具体说明请参考:Python 3.8-新的特性-赋值表达式。 ↩︎ ↩︎

你可能感兴趣的:(Python)