跳到主要内容

运算符

运算符分为7种

  • 算数运算符
  • 比较运算符
  • 赋值运算符
  • 逻辑运算符
  • 成员运算符
  • 身份运算符
  • 位运算符

算术运算符

运算符描述
+
-
*
/
%取模,规律: (a % b) + (-a % b) = b或0 (当a为0时,为0),即负数的余数和正数的余数相加为0或b
**幂,对于10为底数,可以用科学计数法,10**8 => 1e8
//整除,相当于除了之后向下取整,负数则取更小的,-13//4 => -4

比较运算符

运算符描述
==等于
!=不等于
>大于
<小于
>=大于或等于
<=小于或等于

返回布尔值:True,False

赋值运算符

运算符描述
=赋值
+=加法赋值,b += a 等于 b = b + a
-=减法赋值
*=乘法赋值
/=除法赋值
%=取模赋值
**=幂赋值
//=取整赋值
:=海象赋值运算符(Python3.8 版本新增运算符)

海象运算符

海象运算符(Walrus Operator),允许在表达式内部进行赋值操作。使用海象运算符可以使某些代码模式更简洁,尤其是在需要赋值给变量并且立即检查该变量的值的情况下

海象运算符的基本用法是在一个表达式内部进行赋值,并且这个赋值的结果可以被立即使用或检查

示例1:在while循环中使用

不使用海象运算符:

# 常规方式
n = input("请输入一个数字:")
while n != "done":
# 对n进行处理...
n = input("请输入一个数字:")

使用海象运算符:

# 使用海象运算符
while (n := input("请输入一个数字:")) != "done":
# 对n进行处理...

示例2:在列表推导式和其他表达式中使用

海象运算符也可以在如列表推导式中使用,这在需要在表达式中对某个结果进行多次引用时非常有用

# 假设我们有一个字符串列表,我们想过滤出那些长度大于4的字符串,并且返回它们的长度
words = ["hello", "world", "walrus", "python"]
lengths = [len(word) for word in words if len(word) > 4]

使用海象运算符,可以避免调用len函数两次:

lengths = [(n := len(word)) for word in words if n > 4]
备注
  • 海象运算符:=可以在需要值的同时进行赋值,这对于减少某些操作的代码量非常有用。
  • 特别适用于处理资源密集型的函数调用、复杂的计算或其他需要重复使用结果的情况。
  • 在使用海象运算符时,需要注意代码的可读性和清晰性,避免过度使用导致代码难以理解。

赋值形式

  • 增强赋值

    • 增强赋值是将操作和赋值合并成单一操作的一种方式

    • 对于所有二元运算符(如+, -, *, /等),Python都提供了一个增强赋值运算符(如+=, -=, *=, /=等)

      x = 5
      x += 1 # 等同于 x = x + 1,x 的值现在是 6
      y = 10
      y *= 2 # 等同于 y = y * 2,y 的值现在是 20
  • 序列赋值

    • 一次性地将一个序列(如列表或元组)中的元素赋值给多个变量

    • 要求:变量的数量和序列中的元素数量相匹配,否则会引发ValueError

      a, b, c = [1, 2, 3]  # a = 1, b = 2, c = 3
      x, y, z = (4, 5, 6) # x = 4, y = 5, z = 6
  • 多目标赋值

    • 在一条语句中将同一个值赋给多个变量

      a = b = c = 0  # a, b, c 都被赋值为 0
    • 对于可变数据类型(如列表),可能导致意外的行为,因为这会使得多个变量引用内存中的同一个对象,修改任一变量引用的对象可能会影响其他变量

      a = b = []
      a.append(1)
      print(b) # 输出: [1]

逻辑运算符

运算符描述
and布尔"与"(左边为假,返回左边;否则返回右边)
or布尔"或"(左边为真,返回左边;否则返回右边)
not布尔"非"(假,返回 True;真,返回 False)
备注

内置函数all(iterable) / any(iterable)

  • all():如果 iterable 的所有元素均为真值(或 iterable 为空)则返回True
  • any():如果 iterable 的任一元素为真值则返回 True(可迭代对象为空,返回 False

短路原则

  • and:如果第一个操作数为False,Python将不会评估第二个操作数

  • or:如果第一个操作数为True,Python将不会评估第二个操作数

  • 性能优化:通过避免不必要的计算,短路原则可以提高程序的运行效率。

  • 防止执行不安全的操作:短路原则可以用来确保只在安全或必要的情况下执行某些操作

    # 安全检查示例
    # 只有当lst不是None时,才会对lst进行长度检查,这样可以避免在尝试访问None对象的属性时抛出异常
    if lst is not None and len(lst) > 0:
    print("List is not empty!")

成员运算符

运算符描述
in判断某个元素是否存在对象中
not in判断某个元素是否不存在对象中

返回布尔值:True,False

身份运算符

运算符描述
is判断两个标识符是不是引用自一个对象,类似判断 id(a) == id(b)
is not判断两个标识符是不是引用自不同对象,类似判断 id(a) != id(b)

返回布尔值:True,False

位运算符

运算符描述
&按位与运算符,如果两个相应位都为1,则该位的结果为1,否则为0
|按位或运算符,只要两个相应位有一个为1时,结果位就为1
^按位异或运算符,只要两个相应位不同,结果就为1
~按位取反运算符,对数据的每个二进制位(包括符号位)取反,即把1变为0,把0变为1,Python中的~运算符返回的是数的补码,所以~x 值等于 -(x+1)
<<左移动运算符:运算数的各二进位全部左移若干位,右边补0
>>右移动运算符:运算数的各二进位全部右移若干位,左边补对应的符号位值
print(5 & 3)  # 输出: 1 (二进制:0101 & 0011 = 0001)
print(5 | 3) # 输出: 7 (二进制:0101 | 0011 = 0111)
print(5 ^ 3) # 输出: 6 (二进制:0101 ^ 0011 = 0110)
print(~5) # 输出: -6 (二进制:~0101 = 1010,补码表示-6)
print(5 << 1) # 输出: 10 (二进制:0101 << 1 = 1010)
print(5 >> 1) # 输出: 2 (二进制:0101 >> 1 = 0010)

位运算可以用于设置或查询整数类型数据的某些位,或用于快速乘除以2的幂(通过左移和右移实现)

进制转换函数

进制转换函数不适用于浮点数,对于浮点数,需要先将其转换为整数,或者使用格式化方法来表示为不同进制的字符串

bin(x)

  • 将一个整数转变为一个前缀为0b的二进制字符串

    print(bin(10))  # 输出: 0b1010

hex(x)

  • 将一个整数转变为一个前缀为0x的十六进制字符串

    print(hex(10))  # 输出: 0x0a

oct(x)

  • 将一个整数转变为一个前缀为0o的八进制字符串

    print(oct(10))  # 输出: 0o12

运算符优先级

从高到低如下:

运算符描述
()改变运算的正常顺序
**指数 (最高优先级)
~按位取反
* / % //乘,除,求余数和取整除
+ -加法、减法
<< >>左移,右移
&按位与
^|按位异或、或
<= < > >=比较运算符
== !=等于运算符
%= /= //= -= += *= **=赋值运算符
is is not身份运算符
in not in成员运算符
not and or逻辑运算符

拼接操作

在Python中,加号(+)和乘号(*)运算符以及它们的增强赋值形式(+=*=)还可以用于字符串、列表和在一定条件下对元组进行拼接和重复操作

字符串

  • +:用于连接两个字符串
  • +=:将右侧的字符串添加到左侧的字符串变量上
  • *:用于重复字符串
  • *=:将字符串重复指定次数,并赋值给原变量
# 字符串
s = "Hello"
s += " World" # s = "Hello World"
s = s * 2 # s = "Hello WorldHello World"

列表

  • +:用于连接两个列表
  • +=:可以用来向列表追加元素或另一个列表的元素
  • *:用于重复列表
  • *=:将列表重复指定次数,并赋值给原变量
# 列表
lst = [1, 2]
lst += [3, 4] # lst = [1, 2, 3, 4]
lst = lst * 2 # lst = [1, 2, 3, 4, 1, 2, 3, 4]

元组

对于元组,+* 运算符的行为与字符串和列表类似,但请注意,元组是不可变的,所以每次使用这些运算符时,实际上是在创建一个新的元组对象

  • +:用于连接两个元组
  • *:用于重复元组
# 元组
t = (1, 2)
t = t + (3, 4) # t = (1, 2, 3, 4)
t = t * 2 # t = (1, 2, 3, 4, 1, 2, 3, 4)

元组没有+=*=操作符的原地修改行为,因为元组是不可变的。使用+=*=会创建一个新的元组对象,并重新绑定给原来的变量名