2.2 Python运算符与表达式

在Python中,单个常量或变量可以看作最简单的表达式,使用除赋值运算符之外的其他任意运算符连接的式子也属于表达式,在表达式中也可以包含函数调用。

常用的Python运算符如表2-2所示,运算符优先级遵循的规则为:算术运算符优先级最高,其次是位运算符、成员测试运算符、关系运算符、逻辑运算符等,算术运算符遵循“先乘除,后加减”的基本运算原则,而相同优先级的运算符一般按从左往右的顺序计算,不过幂运算符是个例外。虽然Python运算符有一套严格的优先级规则,但是强烈建议在编写复杂表达式时尽量使用圆括号来明确说明其中的逻辑来提高代码的可读性。

表2-2 Python运算符

2.2.1 算术运算符

1)+运算符除了用于算术加法以外,还可以用于列表、元组、字符串的连接,但不支持不同类型的对象之间相加或连接。

     > > > 3 + 5 << 1                #算术运算符优先级高于位运算符
    16
     > > > 3 + (5 << 1)              #使用括号可以修改运算顺序
    13
     > > > [1, 2, 3] + [4, 5, 6]           #连接两个列表
    [1, 2, 3, 4, 5, 6]
     > > > (1, 2, 3) + (4, )               #连接两个元组
    (1, 2, 3, 4)
     > > > 'abcd' + '1234'                 #连接两个字符串
    'abcd1234'
     > > > 'A' + 1                         #不支持字符与数字相加,抛出异常
    Traceback (most recent call last):
      File "<pyshell#20 >", line 1, in <module >
        'A' + 1
    TypeError: Can't convert 'int' object to str implicitly

2)*运算符除了表示算术乘法,还可用于列表、元组、字符串这几个序列类型与整数的乘法,表示序列元素的重复,生成新的序列对象。

     > > > [1, 2, 3] * 3
    [1, 2, 3, 1, 2, 3, 1, 2, 3]
     > > > (1, 2, 3) * 3
    (1, 2, 3, 1, 2, 3, 1, 2, 3)
     > > > 'abc' * 3
    'abcabcabc'

3)运算符/和//在Python中分别表示算术除法和算术求整商。

     > > > 3 / 2                 #数学意义上的除法
    1.5
     > > > 15 // 4               #如果两个操作数都是整数,结果为整数
    3
     > > > 15.0 // 4             #如果操作数中有实数,结果为实数形式的整数值
    3.0
     > > > -15//4                #向下取整
    -4

4)%运算符可以用于整数或实数的求余数运算,还可以用于字符串格式化。

     > > > 789 % 23              #余数
    7
     > > > 123.45 % 3.2          #可以对实数进行余数运算,注意精度问题
    1.849999999999996
     > > > '%c, %d' % (65, 65)   #把65分别格式化为字符和整数
    'A, 65'
     > > > '%f, %s' % (65, 65)   #把65分别格式化为实数和字符串
    '65.000000,65'

5)**运算符表示幂运算。

     > > > 3 ** 2                #3的2次方,等价于pow(3, 2)
    9
     > > > 9 ** 0.5              #9的0.5次方,平方根
    3.0
     > > > 3 ** 2 ** 3           #幂运算符从右往左计算
    6561

2.2.2 关系运算符

Python关系运算符可以连用,要求操作数之间必须可比较大小。

     > > > 1 < 3 < 5             #等价于1 < 3 and 3 < 5
    True
     > > > 3 < 5  > 2
    True
     > > > 'Hello'  > 'world'           #比较字符串大小
    False
     > > > [1, 2, 3] < [1, 2, 4]     #比较列表大小
    True
     > > > 'Hello'  > 3                  #字符串和数字不能比较
    TypeError: unorderable types: str()  > int()
     > > > {1, 2, 3} < {1, 2, 3, 4}    #测试是否是子集
    True
     > > > {1, 2, 3} == {3, 2, 1}         #测试两个集合是否相等
    True
     > > > {1, 2, 4}  > {1, 2, 3}         #集合之间的包含测试
    False
     > > > {1, 2, 4} < {1, 2, 3}
    False
     > > > {1, 2, 4} == {1, 2, 3}
    False

2.2.3 成员测试运算符

成员测试运算符in用于成员测试,即测试一个对象是否包含另一个对象。

     > > > 3 in [1, 2, 3]                #测试3是否存在于列表[1, 2, 3]中
    True
     > > > 5 in range(1, 10, 1)          #range()用来生成指定范围数字
    True
     > > > 'abc' in 'abcdefg'            #子字符串测试
    True
     > > > for i in (3, 5, 7):           #循环,成员遍历
        print(i, end='\t')               #注意,循环结构属于复合语句
                                         #这里要连续按〈Enter〉键两次才能执行
                                         #后面类似的情况不再说明
    3   5   7

2.2.4 集合运算符

集合的交集、并集、对称差集等运算分别使用&、|和^运算符来实现,而差集则使用减号运算符实现。

     > > > {1, 2, 3} | {3, 4, 5}             #并集,自动去除重复元素
    {1, 2, 3, 4, 5}
     > > > {1, 2, 3} & {3, 4, 5}         #交集
    {3}
     > > > {1, 2, 3} ^ {3, 4, 5}             #对称差集
    {1, 2, 4, 5}
     > > > {1, 2, 3} - {3, 4, 5}             #差集
    {1, 2}

2.2.5 逻辑运算符

逻辑运算符and、or、not常用来连接条件表达式构成更加复杂的条件表达式,并且and和or具有惰性求值或逻辑短路的特点,即当连接多个表达式时只计算必须要计算的值,前面介绍的关系运算符也具有类似的特点。

     > > > 3 >5 and a >3                #注意,此时并没有定义变量a
    False
     > > > 3 >5 or a >3                 #3 >5的值为False,所以需要计算后面表达式
    NameError: name 'a' is not defined
     > > > 3<5 or a >3                #3<5的值为True,不需要计算后面表达式
    True
     > > > 3 and 5                      #and和or连接的表达式的值不一定是True或False
    5
     > > > 3 and 5 >2                   #而是把最后一个计算的表达式的值作为整个表达式的值
    True
     > > > 3 not in [1, 2, 3]           #逻辑非运算符not
    False

2.2.6 补充说明

除了表2-2中列出的运算符之外,Python还有赋值运算符=和+=、-=、*=、/=、//=、**=、|=、^=等大量复合赋值运算符。

Python不支持++和--运算符,虽然在形式上有时候似乎可以这样用,但实际上是另外的含义。

     > > > i = 3
     > > > ++i                       #这里的++是解释为两个正号的
    3
     > > > +(+3)                     #与++i等价
    3
     > > > i++                       #Python不支持++运算符,语法错误
    SyntaxError: invalid syntax
     > > > --i                       #负负得正
    3
     > > > -(-i)                     #与--i等价
    3
     > > > ---i                      #等价于-(-(-i))
    -3
     > > > i--                       #Python不支持--运算符,语法错误
    SyntaxError: invalid syntax