基础知识

Python 的数学运算与预期一致:

>>> x = 2
>>> y = 3
>>> z = 5
>>> x * y
6
>>> x + y
5
>>> y - x
1
>>> x * y + z
11
>>> (x + y) * z
25
>>> 3.0 / 2.0  # 真除法
1.5
>>> 3 // 2  # 向下取整除法
1
>>> 2 ** 3  # 指数运算
8

请注意,Python 遵循 PEMDAS 运算顺序。

幂运算

Python 有一个内建的幂运算符 **,它可以处理整数、浮点数或复数。这一运算符在运算顺序中占有正确的位置。

>>> 2 ** 8
256

向下取整除法与真除法

在 Python 3.x 中,除法运算符 / 对所有型(包括整数)执行真除法。因此,3 / 2 == 1.5。即使两个输入都是整数,结果也是浮点数,例如 4 / 2 返回 2.0

在 Python 3.x 和最新的 2.x 版本中,整数和浮点数的向下取整除法通过双斜线(//)运算符实现。对于负数,Python 会向负无穷方向取整,而不是像 C 语言中向零取整。例如,-3 // 2 == -2 在 Python 中,而 -3 / 2 == -1 在 C 语言中。

需要注意的是,由于浮点数运算的局限性,四舍五入错误可能导致一些意外结果。例如:

>>> print(0.6 / 0.2)
3.0
>>> print(0.6 // 0.2)
2.0

对于 Python 2.x,/ 运算符对整数和长整型执行向下取整除法,并返回整数或长整型。因此,5 / 2 == 2-3 / 2 == -2。但是,使用 / 执行除法操作已被弃用,如果你想要向下取整除法,应该使用 //(从 Python 2.2 版本开始支持)。当涉及浮点数除法时,Python 会使用真除法。因此,为了确保 Python 2.x 中的真除法:x = 3; y = 2; float(x) / y == 1.5

求余(Modulus)

求余(即两个操作数相除的余数,而不是商)可以通过 % 运算符或者 divmod 内建函数获得。divmod 函数返回一个包含商和余数的元组。

>>> 10 % 7
3
>>> -10 % 7
4

请注意,-10 % 7 的结果是 +4,而在 C 语言中,结果是 -3。这是因为 Python 的取余是向负无穷方向舍入,而不是像 C 语言那样向零舍入。因此,余数向正无穷方向增加。

取反(Negation)

与其他语言不同,变量可以直接取反:

>>> x = 5
>>> -x
-5

比较操作

操作符 含义
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于

数字、字符串和其他型的对象可以进行相等/不等和排序的比较:

>>> 2 == 3
False
>>> 3 == 3
True
>>> 3 == '3'
False
>>> 2 < 3
True
>>> "a" < "aa"
True

身份比较

isis not 操作符用于测试对象的身份,与 ==(相等)操作符不同:x is y 为真,仅当 xy 是内存中同一对象的引用。x is not y 返回相反的布尔值。请注意,身份测试比相等测试更严格,因为两个不同的对象可能具有相同的值。

>>> [1,2,3] == [1,2,3]
True
>>> [1,2,3] is [1,2,3]
False

对于内建的不可变数据类型(如 intstrtuple),Python 使用缓存机制以提高性能,即解释器可能决定重用现有的不可变对象,而不是生成具有相同值的新对象。对象缓存的细节在不同的 Python 版本中可能有所变化,并且不保证在不同的系统上是独立的,因此像 'hello' is 'hello'(1, 2, 3) is (1, 2, 3)4 is 2**2 这样的身份测试可能在不同的机器上给出不同的结果。

在一些 Python 实现中,以下结果适用:

print(8 is 8)           # True
print("str" is "str")   # True
print((1, 2) is (1, 2)) # False - 尽管是不可变的
print([1, 2] is [1, 2]) # False
print(id(8) == id(8))   # True
int1 = 8
print(int1 is 8)        # True
oldid = id(int1)
int1 += 2
print(id(int1) == oldid) # False

链接:

增强赋值操作

有一种简写方式可以将操作的结果赋值给一个输入变量:

>>> x = 2
>>> x  # 2
2
>>> x *= 3
>>> x  # 2 * 3
6
>>> x += 4
>>> x  # 2 * 3 + 4
10
>>> x /= 5
>>> x  # (2 * 3 + 4) / 5
2
>>> x **= 2
>>> x  # ((2 * 3 + 4) / 5) ** 2
4
>>> x %= 3
>>> x  # ((2 * 3 + 4) / 5) ** 2 % 3
1
>>> x = 'repeat this  '
>>> x  # repeat this
repeat this
>>> x *= 3  # 重复三次填充
>>> x
repeat this  repeat this  repeat this

逻辑运算符

逻辑运算符作用于布尔值。

or

or 运算符如果任何一个布尔值为真,则返回真。如果所有布尔值都为假(即它们都是假),则 or 运算符返回假。

if a or b:
    do_this
else:
    do_this

and

and 运算符只有当所有布尔值都为真时才返回真。如果其中任何一个为假,则 and 运算符返回假。

if a and b:
    do_this
else:
    do_this

not

not 运算符只作用于一个布尔值,并返回它的相反值。所以,真变为假,假变为真。

if not a:
    do_this
else:
    do_this

运算顺序为:not 优先,其次是 and,最后是 or。特别地,"True or True and False or False" 会变成 "True or False or False",结果为 True。

警告: 逻辑运算符不仅仅可以作用于布尔值。例如,1 and 6 将返回 6。具体来说,and 返回第一个假值,或者返回最后一个值(如果所有值都为真)。or 返回第一个真值,或者返回最后一个值(如果所有值都为假)。在 Python 中,数字零和空字符串、列表、集合等被视为假。你可以使用 bool() 来检查某个值是否被视为真或假。

>>> bool(0.0)  # False
>>> bool([])   # False

位运算符

Python 的位运算符与 C 语言中的似。它们包括:

  • &(按位与)
  • |(按位或)
  • ^(按位异或,简称 xor)
  • <<(左移)
  • >>(右移)
  • ~(按位取反)

增强赋值运算符(复合赋值运算符)包括:&=, |=, ^=, <<=, >>=。位运算符适用于整数,包括负数和非常大的整数;对于移位运算符,第二个操作数必须是非负数。

示例:

0b1101 & 0b111 == 0b101  # 按位与
0b1 | 0b100 == 0b101     # 按位或
0b111 ^ 0b101 == 0b10    # 按位异或
1 << 4 == 16              # 左移
7 >> 1 == 3               # 右移
1 << 100 == 0x10000000000000000000000000  # 大数支持

注意: 0b 表示二进制字面量,就像 0x 表示十六进制字面量。

位运算符和复合赋值运算符在 Python 中可用于处理整数,包括负数。例如,负数按补码形式表示,进行与操作时会考虑无限多的前导1。

-2 & 15 == 14  # 负数与运算

位运算符的常见用法

以下是增强赋值运算符的示例:

a = 0b1101; a &= 0b111; a == 0b101  # 按位与赋值
a = 0b1; a |= 0b100; a == 0b101    # 按位或赋值
a = 0b111; a ^= 0b101; a == 0b10   # 按位异或赋值
a = 1; a <<= 4; a == 16            # 左移赋值
a = 7; a >>= 1; a == 3             # 右移赋值

自定义和运算符重载

定义可以重载操作符,以便实例化的对象支持运算符。例如,集合重载了 | 运算符来表示集合并集:{1, 2} | {3, 4} == {1, 2, 3, 4}。这些重载方法的名称如下:

  • __and__ 对应 &
  • __or__ 对应 |
  • __xor__ 对应 ^
  • __invert__ 对应 ~
  • __lshift__ 对应 <<
  • __rshift__ 对应 >>
  • __iand__ 对应 &=
  • __ior__ 对应 |=
  • __ixor__ 对应 ^=
  • __ilshift__ 对应 <<=
  • __irshift__ 对应 >>=

示例:位运算在 Python 中的应用

位运算在一些应用中非常有用,例如 CRC 校验和 MD5。尽管这些通常会用 C 实现以获得更高的速度,但 Python 也可以实现这些操作。

链接:

Last modified: Thursday, 30 January 2025, 11:58 PM