运算符是一些特殊的符号,他们可以进行诸如“加减”(+ 和 -)或者“比较两个数的大小”(< 和 >)以及逻辑运算等运算。
Python 的运算符主要包括算术运算符、赋值运算符、比较(关系)运算符、逻辑运算符和位运算符。
使用运算符将不同类型的数据按照一定的规则连接起来的式子,称为表达式。
算术运算符#
算术运算符是处理四则运算的符号,在数字的处理中应用得最多。
| 运算符 | 说明 | 示例表达式 | 结果 |
|---|---|---|---|
+ |
加 | 43.3 + 10 |
53.3 |
- |
减 | 43.3 - 10 |
33.3 |
* |
乘 |
43.3 * 10
|
433.0
|
/ |
除,其结果总是为浮点数 (注意除数不能为零) |
43 / 1043.3 / 10
|
4.34.33
|
% |
求余,即返回除法的余数 |
43 % 1043.3 % 10-43 % 1043 % -10
|
33.37-7
|
// |
整除,即返回商的整数部分 (注意除数不能为零) |
43 // 1043.3 // 10-43 // 10
|
44.0-5
|
** |
幂,即返回 x 的 y 次方 |
3 ** 23.0 ** 2
|
99.0
|
示例:已知一个三角形三边的长度分别为 $a = 3.3, b = 6.2, c = 4.2$,求该三角形的面积 $S$。
根据三边长求三角形面积的公式为:
a = 3.3
b = 6.2
c = 4.2
p = (a + b + c) / 2
s = (p*(p-a)*(p-b)*(p-c)) ** 0.5
print(s) # 6.472008478826334
赋值运算符#
赋值运算符主要用来为变量等赋值。除了 = 外,Python 还支持像 +=、-= 这样的复合赋值运算符。
| 运算符 | 说明 | 示例 | 展开形式 |
|---|---|---|---|
= |
简单的赋值运算 | x = y |
x = y |
+= |
加赋值 | x += y |
x = x + y |
-= |
减赋值 | x -= y |
x = x - y |
*= |
乘赋值 | x *= y |
x = x * y |
/= |
除赋值 | x /= y |
x = x / y |
%= |
取余数赋值 | x %= y |
x = x % y |
**= |
幂赋值 | x **= y |
x = x ** y |
//= |
整除赋值 | x //= y |
x = x // y |
比较(关系)运算符#
比较运算符,也称关系运算符,用于对变量或表达式的结果大小、真假等进行比较。如果比较结果为真,则返回 True;如果为假,则返回 False。比较运算符通常用在 if 和 while 语句中作为判定语句流流向的依据。
| 运算符 | 作用 | 示例 | 结果 |
|---|---|---|---|
> |
大于 | 5 > 6 |
False |
< |
小于 | 5 < 6 |
True |
== |
等于 | 'abc' == 'ab' |
False |
!= |
不等于 | 'abc' != 'ab' |
True |
>= |
大于等于 | 5 >= 5 |
True |
<= |
小于等于 | 5 <= 5 |
True |
Python 支持链式比较,相当于拆分多个逻辑表达式,再进行逻辑与操作。如下所示:
print(1 < 2 < 3) # True
# 相当于
print(1 < 2 and 2 < 3) # True
x = 8
print(0 < x <= 10) # True
# 相当于
print(x > 0 and x <= 10) # True
逻辑运算符#
逻辑运算符是对真或假两种布尔值进行运算,运算的结果仍是一个布尔值。
| 运算符 | 含义 | 用法 | 说明 |
|---|---|---|---|
and |
逻辑与 | op1 and op2 |
仅当 op1 和 op2 都为 True 时,结果才为 True,否则为 False。 |
or |
逻辑或 | op1 or op2 |
仅当 op1 和 op2 都为 False 时,结果才为 False,否则为 True。 |
not |
逻辑非 | not op |
当 op 为 True 时,结果为 False;当 op 为 False 时,结果为 True。 |
示例:某软件开发公司要招聘一名程序员,其职位要求如下:
- 具备三年及以上工作经验,或者应届本科毕业,且平均成绩在 75 分及以上;
- 掌握 Python 语言;
- 主导开发过任何语言编写的较知名开源项目的,可直接参与面试。
以下代码描述了某个面试者的基本条件,其中各个变量的意义可以从变量名称直接看出,请进一步完成程序设计,判断该面试者是否能获得面试资格。
某面试者的条件:
service_years = 0
is_green_graduate = True
avg_score = 75.7
is_python_programmer = True
is_opensource_owner = False
答案
has_interview_qualification = ((service_years >= 3
or (is_green_graduate and avg_score >= 75))
and is_python_programmer) or is_opensource_owner
print(has_interview_qualification) # True
位运算符#
位运算符是把数字看作二进制数来进行计算的,因此,需要先把要执行运算的数据转换为二进制,然后才能执行运算。
Python 中的位运算符有位与(&)、位或(|)、位异或(^)、取反(~)、左移位(<<)和右移位(>>)。
位与运算#
位与运算的运算符为 &,其运算规则是:两个操作数的二进制表示,只有对应数位都是 1 时,结果数位才是 1,否则为 0。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同。
# 0010_1100
# & 0011_1010
# = 0010_1000
位或运算#
位或运算的运算符为 |,其运算规则是:两个操作数的二进制表示,只有对应数位都是 0 时,结果数位才是 0,否则为 1。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同。
# 0010_1100
# | 0011_1010
# = 0011_1110
位异或运算#
位异或运算的运算符为 ^,其运算规则是:两个操作数的二进制表示相同时(同时为 0 或同时为 1),结果数位才是 0,否则为 1。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同。
# 0010_1100
# ^ 0011_1010
# = 0001_0110
位取反运算也称位非运算,其运算符为 ~,运算规则是:将操作数中对应的二进制数 1 修改为 0,0 修改为 1。
# ~ 00101100
# = 11010011
左移位运算#
左移位运算的运算符为 <<,该运算将一个二进制操作数向左移动指定的位数,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用 0 补充。左移 n 位运算相当于乘以 2 的 n 次幂。
# 0010_1100 << 1
# = 0101_1000
#
# 0010_1100 << 2
# = 1011_0000
右移位运算#
右移位运算的运算符为 >>,该运算将一个二进制操作数向右移动指定的位数,右边(低位端)溢出的位被丢弃,而在填空左边(高位端)的空位时,如果最高位是 0(正数),左侧空位填入 0;如果最高位是 1(负数),左侧空位填入 1。右移 n 位运算相当于除以 2 的 n 次幂。
# 0010_1100 >> 1
# = 0001_0110
#
# 0010_1100 >> 2
# = 0000_1011
# 1101_1010 >> 1
# = 1110_1101
运算符的优先级#
请先回答表达式 2 + 2 * 4 的计算结果!
——答案不是 16,而是 10。这是因为数学的四则运算应遵循先乘除,后加减的规则。
在 Python 中,各种运算符也有不同的优先级,其运算规则为:
优先级高的运算先执行,优先级低的运算后执行,同一优先级的操作按照从左到右的顺序进行。也可以像四则运算那样使用小括号,括号内的运算最先执行。
以下两页表按照优先级从高到低的顺序列出了各运算符的优先级,同一行中的运算符具有相同的优先级。
| 运算符 | 描述 |
|---|---|
(expressions...),
[expressions...],{key: value...},
{expressions...}
|
绑定或加圆括号的表达式,列表显示,字典显示,集合显示 |
x[index], x[index:index], x(arguments...), x.attribute
|
索引,切片,调用,属性引用 |
await x |
await 表达式 |
** |
乘方 |
+x, -x, ~x |
正,负,按位非 NOT |
*, @, /, //, % |
乘,矩阵乘,除,整除,取余 |
+, - |
加和减 |
<<, >> |
移位 |
& |
按位与 AND |
^ |
按位异或 XOR |
| |
按位或 OR |
in, not in,
is, is not, <,
<=, >, >=, !=, ==
|
比较运算,包括成员检测和标识号检测 |
not x |
布尔逻辑非 NOT |
and |
布尔逻辑与 AND |
or |
布尔逻辑或 OR |
if -- else |
条件表达式 |
lambda |
lambda 表达式 |
:= |
赋值表达式 |