# 运算符

# 算术运算符

  • 如下:

    >>> 1 + 2   # 加
    3
    >>> 1 - 2   # 减
    -1
    >>> 1 * 2   # 乘
    2
    >>> 2 ** 3  # 幂运算
    8
    >>> 2 / 1   # 一个斜杠 / 表示算术除(保留商的小数部分,结果为浮点型数字)
    2.0
    >>> 1 // 2  # 两个斜杠 // 表示整除(去除商的小数部分,结果为整型数字)
    0
    >>> 4 % 3   # 取模,也就是取余数
    1
    
  • int 与 float 类型的值,都属于数字,可以混合运算。例如:

    >>> 1 + 1.0
    2.0         # int 与 float 混合运算时,结果会自动转换成 float 类型
    
  • 数字与字符串,不可混合运算。例如:

    >>> 1 + '1.0'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unsupported operand type(s) for +: 'int' and 'str'
    
  • C 语言中有自加运算符、自减运算符,比如 a++a-- 。而 Python 中没有这两种运算符,可以用 a+=1a-=1 的方式,实现相似的功能。

  • 除法运算中,如果被除数为 0 ,则会抛出异常:

    >>> 1 / 0
    ZeroDivisionError: division by zero
    >>> 1 // 0
    ZeroDivisionError: integer division or modulo by zero
    

# 赋值运算符

  • 赋值运算符就是等号 = ,用于将等号右侧的值,赋予等号左侧的变量。

  • 在赋值的同时,可以进行算术运算。例如:

    >>> a = 1
    >>> a += 2
    >>> a
    3
    
    >>> a = 1
    >>> a /= 2
    >>> a
    0.5
    
  • 可以连续使用多个等号,给多个变量传递赋予同一个值。例如:

    a = b = c = 1
    

    相当于:

    c = 1
    b = c
    a = b
    
  • 如果等号右侧的值,属于可迭代对象,则可以 unpack 拆开成 n 个值,同时赋值给 n 个变量。

    • 例:
      >>> a, b = [1, 2]
      >>> a
      1
      
    • 如果等号左侧有 n>1 个变量,则等号右侧必须刚好有 n 个值,否则会抛出异常:
      >>> a, b = [1]
      ValueError: not enough values to unpack (expected 2, got 1)
      >>> a, b = [1, 2, 3]
      ValueError: too many values to unpack (expected 2)
      >>> _, b, _ = [1, 2, 3]     # 为了避免异常,可以用 _ 来接收多余的赋值。变量名为 _ 表示这是临时变量,读者不需要关心
      >>> a, *others = [1, 2, 3]  # 或者可以用 * 加变量名,接收任意数量(包括 0 个)的赋值
      
    • 可通过该语法,交换几个变量的值。例如:
      a, b = b, a
      
      相当于:
      _ = b, a
      a, b = _
      

# 比较运算符

  • 又称为关系运算符,如下:

    >   # 大于
    <   # 小于
    ==  # 等于
    >=  # 大于等于
    <=  # 小于等于
    !=  # 不等于
    
    • 如果比较运算的结果为真,则返回值为 True 。
    • 如果比较运算的结果为假,则返回值为 False 。
  • 可以连续使用多个比较运算符,同时比较多个值。

    • 例:
      >>> 1 < 2 < 3
      True
      
      相当于:
      >>> 1 < 2 and 2 < 3
      True
      
  • bool 值,与数字之间,可以比较运算。

    • 例:
      >>> True < 2
      True
      
    • 这是因为,Python 会自动将 bool 值转换成数字:
      >>> int(True)
      1
      >>> int(False)
      0
      
  • str 对象之间,可以比较运算。

    • 例:
      >>> 'A' < 'a'   # 比较两个 str 时,是比较第一个字符的 ASCII 码
      True
      >>> 'AA' < 'Aa' # 如果第一个字符相同,则比较下一个字符的 ASCII 码
      True
      >>> '' < 'A'
      True
      
    • 但是,数字与 str 之间,不允许比较运算:
      >>> 1 < 'a'
      TypeError: '<' not supported between instances of 'int' and 'str'
      

# 逻辑运算符

  • and 与运算符

    • 语法:
      x and y
      
      相当于:
      if bool(x):
          return y
      else:
          return x
      
    • 例:
      >>> 1 and 'hello'
      'hello'
      
  • or 或运算符

    • 语法:
      x or y
      
      相当于:
      if bool(x):
          return x
      else:
          return y
      
  • not 非运算符

    • 语法:
      not x
      
      相当于
      !bool(x)
      
    • ! 也可进行非运算,常用于表达式中,左右可以没有空格。而 not 的左右必须存在空格。
    • 例:
      >>> not 'Hello'
      False
      

# 三目运算符

  • C 语言中,三目运算符写作 ... ? ... : ... 格式。
  • Python 中,三目运算符写作 <return_value> if <condition> else <return_value> 格式。
    • 功能:如果条件为真,则返回第一个值,否则返回第二个值。
    • 例:
      >>> 'hello' if 1>2 else 'world'
      'world'
      

# 身份运算符

  • is 用于判断两个对象是否相同。

    • 例:
      >>> a=b=1
      >>> a is b  # 相当于 id(a) == id(b)
      True
      
    • 运算符 is 是判断两个对象的 id() 是否相同,运算符 == 是判断两个对象的值是否相等。如下:
      >>> 0 is 0.0
      False
      >>> 0 == 0.0
      True
      
  • is not 表示相反的运算。

# 成员运算符

  • in 用于判断左侧的对象,是否与右侧对象中某个成员的值相等。

    • 例:
      >>> 'H' in 'Hello'
      True
      >>> 0 in [0.0, 1.0]
      True
      
  • not in 表示相反的运算。

# 位运算符

  • 位运算符是对二进制位进行运算,如下:
    >>> x=1; y=0
    >>> x & y   # 按位与
    0
    >>> x | y   # 按位或
    1
    >>> x ^ y   # 按位异或
    1
    >>> ~ x     # 取反(相当于 -x-1 )
    -2
    >>> x << 1  # 左移
    2
    >>> x >> 1  # 右移
    0