Python编程
基础知识
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
身份比较
is
和 is not
操作符用于测试对象的身份,与 ==
(相等)操作符不同:x is y
为真,仅当 x
和 y
是内存中同一对象的引用。x is not y
返回相反的布尔值。请注意,身份测试比相等测试更严格,因为两个不同的对象可能具有相同的值。
>>> [1,2,3] == [1,2,3]
True
>>> [1,2,3] is [1,2,3]
False
对于内建的不可变数据类型(如 int
、str
和 tuple
),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 也可以实现这些操作。
链接: