运算符
运算符是一种告诉解释器执行特定的数学或逻辑操作的符号, Python
中的运算符分为以下几类:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
杂项运算符
运算符两侧或运算符作用的数称为操作数。
算术运算符
算术运算符,即基本的四则运算加上取模、整除、乘方。
以下假设A = 24,B = 15
运算符 | 描述 | 效果 |
---|---|---|
+ | 把两个操作数相加 | A + B = 39 |
- | 第一个操作数减去第二个操作数 | A - B = 9 |
* | 把两个操作数相乘 | A * B = 360 |
/ | 第一个操作数除以第二个操作数 | A / B = 1.6(总是返回float类型) |
% | 第一个操作数整除第二个操作数的余数(取模) | A % B = 9 |
// | 整除运算符,第一个操作数整除第二个操作数 | A // B = 1 |
** | 乘方运算符 | A ** B等于 |
所有算术运算符的结果均为右值。
整除得到的不一定是
int
类型。结果的具体类型取决于两个操作数的类型中精度较高的类型。
关系运算符
关系运算符用于比较变量或表达式之间的关系
以下假设A = 24,B = 15
运算符 | 描述 | 效果 |
---|---|---|
== | 检查两个操作数的值是否相等,相等则为True | A == B为False |
!= | 检查两个操作数的值是否不相等,不相等则为True | A != B为True |
> | 检查左操作数的值是否大于右操作数的值,大于则为True | A > B 为True |
>= | 检查左操作数的值是否大于等于右操作数的值,大于等于则为True | A >= B 为True |
< | 检查左操作数的值是否小于右操作数的值,小于则为True | A < B 为False |
<= | 检查左操作数的值是否小于等于右操作数的值,小于等于则为True | A <= B 为False |
所有关系运算符的结果均为bool类型右值。
逻辑运算符
用于逻辑关系式。
以下假设A = True,B = False
运算符 | 描述 | 效果 |
---|---|---|
and | 逻辑与,如果两个操作数均为True,结果为True | A and B为False |
or | 逻辑或,如果两个操作数至少有一个为True,结果为True | A or B为True |
not | 逻辑非,结果为操作数的反转 操作数为True结果为False;操作数为False结果为True |
not A 为False,not B为True |
逻辑与和逻辑或均可连续使用:
<expr1> and <expr2> and <expr3> ...
、
<expr1> or <expr2> or <expr3> ...
运算短路
逻辑与和逻辑或均存在运算短路机制。当靠前的表达式的值已经足够确定整个逻辑表达式的值时,不会再执行后续表达式并之间给出结果。
所有逻辑运算符的结果均为bool类型右值。
位运算符
变量储存在内存中,基本单位是字节,一个字节又包含8个位。为运算符即是对位进行操作。
若两个操作数占用的字节数不同则会在占用字节较少的变量的高位补0,使两个数等长。
以下假设A = 57(二进制0b00111001),B=13(二进制0b00001101)
运算符 | 描述 | 效果 |
---|---|---|
& | 按位与,每一位分别取逻辑与 | A & B = 0b00001001 |
| | 按位或,每一位分别取逻辑或 | A | B = 0b00111101 |
^ | 按位异或,每一位分别取逻辑异或 | A ^ B = 0b00110100 |
~ | 按位取反,每一位分别取逻辑反 | ~A = 0b11000110 |
<< | 向左移位,右空位补0,左侧溢出则忽略,即乘以 |
A << 2 = 0b11100100 |
>> | 向右移位,左空位补0,右侧溢出则忽略,即除以 |
A >> 2 = 0b00001110 |
所有位运算符的结果均为右值。
赋值运算符
赋值运算符用于为左值赋值。
以下假设A = 24,B = 15
运算符 | 描述 | 效果 |
---|---|---|
= | 简单的赋值运算符,将右侧值赋值给左侧 | A = B,结果A=B=15 |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | 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 **= B等效于A = A ** B |
:= | 海象运算符(Python3.8 新增运算符) | 赋值并返回赋值的值 |
Python的赋值运算符除海象运算符外不可作为右值
身份运算符
身份运算符用于比较两个对象的存储单元。
运算符 | 描述 | 效果 |
---|---|---|
is | 判断两个标识符是不是引用自一个对象 | A is B |
is not | 是判断两个标识符是不是引用自不同对象 | A is not B |
所有身份运算符的结果均为bool类型右值。
成员运算符
成员运算符用于测试集合中是否包含某元素。
运算符 | 描述 | 效果 |
---|---|---|
in | 判断集合中是否包含值 | A in B |
not in | 判断集合中是否不包含值 | A not in B |
所有成员运算符的结果均为bool类型右值。
访问运算符
这是一类类似于后缀的运算符,用于访问变量或对象的对应功能或属性。这部分内容将在涉及到的地方解释。
运算符优先级
数学有四则运算,而运算之间存在优先级,指导我们分析复杂的算式。在 C
中有如此多运算符,同样有运算符优先级规则指导。
在下表中,运算符优先级从上往下、从左往右依次递减,同一行的运算符优先级均大于下一行。
类别 | 运算符 | 结合性 |
---|---|---|
集合表达式 | {expr..},[expr..],(expr..),{key:value..} | 从左到右 |
后缀 | () [] | 从左到右 |
await | await | 从左到右 |
乘方 | ** | 从左到右 |
正负、位反 | +x -x ~x | 从左到右 |
乘方 | ** | 从左到右 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
位与 | & | 从左到右 |
位异或 | ^ | 从左到右 |
位或 | | | 从左到右 |
关系、成员、身份 | < <= > >= == != is is not in not in |
从左到右 |
逻辑非 | not | 从左到右 |
逻辑与 | and | 从左到右 |
逻辑或 | or | 从左到右 |
条件 | if – else | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
结合性指多个相同运算符连续使用时的计算顺序,从左到右即从左往右依次计算;从右到左则是从右往左依次计算。
1+2+3
会先计算1+2
再计算3+3
数字
数字数据类型用于存储数值,包括整数、布尔、浮点、复数。
整数
整数(int)最基本的数字单位,内容和它的名字一样。 Python
只有一种整数 int
,有符号,没有大小限制。
1 | #Python |
布尔
布尔(bool)是 int
的子类,用来表示逻辑真假。在与数字进行操作时, True
会被转换为1, False
会被转换为0;而任何非0的数字或非空的集合类型会被视为 True
,数字0与空集合类型则会被视为 False
。
1 | #Python |
浮点
浮点(float)即小数。 Python
只有一种浮点 float
,有符号,由整数部分和小数部分组成,没有大小限制。
1 | #Python |
复数
复数(complex)包含实部与虚部,其实部与虚部均为 float
类型。
1 | #Python |
Python
的数字类型属于不可变类型,不可更改。虽然可以通过重新赋值的办法修改变量的值,但是本质上是创建了一个新数字并丢弃原本的数字。
写在最后
运算符就像数学计算一样,有序地执行各种算术或逻辑运算,大量运算符交织成代码逻辑,这也是一个程序的基石。