Python程序设计案例课堂
上QQ阅读APP看书,第一时间看更新

2.5 运算符和优先级

在Python语言中,支持的运算符包括算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、身份运算符和成员运算符。

2.5.1 算术运算符

Python语言中常见的算术运算符如表2-1所示。

表2-1 算术运算符

【案例2-1】使用算术运算符(代码2.1.py)。

        x = 4
        y = 5
        z = 1
        #加法运算
        a = x + y
        print ("a的值为:", a)
        #减法运算
        a =x - y
        print ("a的值为:", a)
        #乘法运算
        a = x * y
        print ("a的值为:", a)
        #除法运算
        a = x / y
        print ("a的值为:", a)
        #取模运算
        a= x % y
        print ("a的值为:", a)
        #修改变量x、y、z
        x = 10
        y = 12
        z = x**y
        print ("z的值为:", z)
        #整除运算
        X = 15
        y = 3
        z = x//y
        print ("z的值为:", z)

保存并运行程序,结果如下:

        A的值为: 9
        a的值为: -1
        a的值为: 20
        a的值为: 0.8
        a的值为: 4
        z的值为: 1000000000000
        z的值为: 5

在本案例中,首先定义变量x、y、z并赋值,然后进行算术运算,接着修改变量的值,再次进行整除运算。

2.5.2 比较运算符

Python语言支持的比较运算符如表2-2所示。

表2-2 比较运算符

【案例2-2】使用比较运算符(代码2.2.py)。

        x = 15
    y = 6
    # 判断变量x和y是否相等
    if ( x == y ):
      print ("x等于y")
    else:
      print ("x不等于y")
    # 判断变量x和y是否不相等
    if ( x ! = y ):
      print ("x不等于y")
    else:
      print ("x等于y")
    # 判断变量x是否小于y
    if ( x < y ):
      print ("x小于y")
    else:
      print ("x大于等于y")
    # 判断变量x是否大于y
    if ( x > y ):
      print (" x大于y")
    else:
      print (" x小于等于y")
    # 修改变量x和y的值
    x = 6
    y = 18
    # 判断变量x是否小于等于y
    if ( x <= y ):
      print (" x小于等于y")
    else:
      print (" x大于  y")
    # 判断变量x是否大于等于y
    if ( y >= x):
      print (" y大于等于x")
    else:
      print (" y小于x")

保存并运行程序,结果如下:

        x不等于y
    x不等于y
    x大于等于y
    x大于y
    x小于等于y
    y大于等于y

在本案例中,首先定义变量x、y并赋值,然后使用if判断语句,并结合比较运算符判断两个变量的大小关系。

2.5.3 赋值运算符

赋值运算符表示将右边变量的值赋给左边变量,常见的赋值运算符的含义如表2-3所示。

表2-3 赋值运算符

案例2-3】使用赋值运算符(代码2.3.py)。

        x = 24
        y = 8
        z = 6
        #简单的赋值运算
        z = x + y
        print ("z的值为:", z)
        #加法赋值运算
        z += x
        print ("z的值为:", z)
        #乘法赋值运算
        z *= x
        print ("z的值为:", z)
        #除法赋值运算
        z /= x
        print ("z的值为:", z)
        #取模赋值运算
        z = 12
        z %= x
        print ("z的值为:", z)
        #幂赋值运算
        x=3
        z **= x
        print ("z的值为:", z)
        #取整除赋值运算
        z //= x
        print ("z的值为:", z)

保存并运行程序,结果如下:

        z的值为:32
        z的值为:56
        z的值为:1344
        z的值为:56.0
        z的值为:12
        z的值为:1728
        z的值为:576

在本案例中,首先定义变量x、y和z并简单赋值,然后使用各种赋值方式对变量进行赋值操作。

2.5.4 逻辑运算符

Python支持的逻辑运算符如表2-4所示。

表2-4 逻辑运算符

案例2-4】使用逻辑运算符(代码2.4.py)。

        a = 10
        b = 15
        #布尔“与”运算
        if ( a and b ):
          print ("变量a和b都为true")
        else:
          print ("变量a和b有一个不为true")
        #布尔“或”运算
        if ( a or b ):
          print ("变量a和b都为true,或其中一个变量为true")
        else:
          print ("变量a和b都不为true")
        # 修改变量a的值
        a = 0
        if ( a and b ):
          print ("变量a和b都为true")
        else:
          print ("变量a和b有一个不为true")
        if ( a or b ):
          print ("变量a和b都为true,或其中一个变量为true")
        else:
          print ("变量a和b都不为true")
        # 布尔“非”运算
        if not( a and b ):
          print ("变量a和b都为false,或其中一个变量为false")
        else:
          print ("变量a和b都为true")

保存并运行程序,结果如下:

        变量a和b都为true
        变量a和b都为true,或其中一个变量为true
        变量a和b有一个不为true
        变量a和b都为true,或其中一个变量为true
        变量a和b都为false,或其中一个变量为false

在本案例中,首先定义变量a和b并简单赋值,然后对变量进行各种逻辑运算操作。

2.5.5 位运算符

在Python中,按位运算是把数字转换为二进制来进行计算。Python支持的位运算符如表2-5所示。

表2-5 位运算符

【案例2-5】使用位运算符(代码2.5.py)。

        a = 12              # 12 =00001100
        b = 6               # 6= 00000110
        c = 0
        #按位与运算
        c = a & b           # 4 = 00000100
        print ("c的值为:", c)
        #按位或运算
        c = a | b           # 14 = 00001110
        print ("c的值为:", c)
        #按位异或运算
        c = a ^ b           # 10 = 00001010
        print ("c的值为:", c)
        #按位取反运算
        c = ~a             # -13 = 10001101
        print ("c的值为:", c)
        #左移动运算
        c = a << 2          # 48 = 00110000
        print ("c的值为:", c)
        #右移动运算
        c = a >> 2          # 3 = 00000011
        print ("c的值为:", c)

保存并运行程序,结果如下:

        c的值为: 4
        c的值为: 14
        c的值为: 10
        c的值为: -13
        c的值为: 48
        c的值为: 3

在本案例中,首先定义变量a、b和c并简单赋值,然后对变量进行各种位运算操作。读者特别需要注意按位取反运算的操作结果。

2.5.6 身份运算符

Python支持的身份运算符为is和not is。其中is是判断两个标识符是不是引用自同一个对象;is not是判断两个标识符是不是引用自不同对象。

案例2-6】使用身份运算符(代码2.7.py)。

        a =’张笑笑’
        b = ’刘萍’
        #使用is身份运算符
        if ( a is b):
          print ("a和b有相同的标识")
        else:
          print ("a和b没有相同的标识")
        #使用is not身份运算符
        if ( a is not b ):
          print ("a和b没有相同的标识")
        else:
          print ("a和b有相同的标识")
        # 修改变量a的值
        a = ’刘萍’
        if ( a is b):
          print ("修改后的a和b有相同的标识")
        else:
          print ("修改后的a和b仍然没有相同的标识")

保存并运行程序,结果如下:

        a和b没有相同的标识
        a和b没有相同的标识
        修改后的a和b有相同的标识

在本案例中,首先定义变量a和b并简单赋值,然后判断a和b是否具有相同的标识,接着修改变量a的值,修改后的a和b有相同的标识。

2.5.7 成员运算符

Python还支持成员运算符,测试实例中包含了一系列成员,包括字符串、列表或元组。成员运算符包括in和not in, x in y表示如果x在y序列中返回true; x not in y表示如果x不在y序列中返回true。

案例2-7】使用成员运算符(代码2.6.py)。

        a =’张笑笑’
        b = ’刘萍’
        students = [’王平’, ’张小平’, ’李晓莉’, ’张雁峰’, ’韩恩丽’ ];
        # 使用in成员运算符
        if ( a in students ):
          print ("变量a在给定的列表students中")
        else:
          print ("变量a不在给定的列表students中")
        # 使用not in成员运算符
        if ( b not in students ):
          print ("变量b不在给定的列表students中")
        else:
          print ("变量b在给定的列表students中")
        # 修改变量a的值
        a = ’张小平’
        if ( a in students ):
          print ("变量a在给定的列表students中")
        else:
          print ("变量a不在给定的列表students中")

保存并运行程序,结果如下:

        变量a不在给定的列表students中
        变量b不在给定的列表students中
        变量a在给定的列表students中

在本案例中,首先定义变量a和b并简单赋值,然后定义了一个列表变量students,接着开始判断变量a和b是否属于列表students的成员,修改变量a的值后,变量a属于列表students的成员。

2.5.8 运算符的优先级

Python运算符以处理的先后排列如下。

(1)(), [], {}。

(2)'object'。

(3)object[i], object[1:r], object.attribute, function()。

(4)(.)符号用来存取对象的属性与方法。下列案例调用对象t的append()方法,在对象t的结尾加上一个字符"t":

        >>> t = ["P", "a", "r", "r", "o"]
        >>> t.append("t")
        >>> t
        ['P', 'a', 'r', 'r', 'o', 't']

(5)+x, -x, ~x。

(6)x**y:x的y次方。

(7)x * y, x / y, x % y:x乘y, x除以y, x除以y的余数。

(8)x + y, x - y:x加上y, x减y。

(9)x << y, x >> y:x左移y位,x右移y位。例如:

        >>> x = 4
        >>> x << 2
        16

(10)x & y:按位与运算符。

(11)x ^ y:按位异或运算符。

(12)x | y:按位或运算符。

(13)<, <=, >, >=, ==, !=, <>, is, is not, in, not in。in与not in运算符应用在列表(list)上。is运算符检查两个变量是否属于相同的对象。is not运算符则是检查两个变量是否不属于相同的对象。! =与<>运算符是相同功能的运算符,都是测试两个变量是否不相等。Python建议使用!=运算符,而不要使用<>运算符。

(14)not。

(15)and。

(16)or, lambda args:expression。

使用运算符时须注意下列事项。

(1)将除法应用在整数时,其结果会是一个浮点数。例如8/4会等于2.0,而不是2。余数运算会将x / y所得的余数返回来,例如7%4 =3。

(2)如果将两个浮点数相除取余数,其返回值也会是一个浮点数,其计算方式是x - int(x/ y)* y。例如:

        >>>7.0 % 4.0
        3.0

(3)比较运算符可以连在一起处理,例如a<b<c<d, Python会将这个式子解释成a<b and b<c and c<d。像x<y>z也是有效的表达式。

(4)如果运算符(operator)两端的运算数(operand)数据类型不相同,Python会将其中一个运算数的数据类型,转换成跟另一个运算数一样的数据类型。转换方式为:若有一个运算数是复数,另一个运算数也会被转换成复数;若有一个运算数是浮点数,另一个运算数也会被转换成浮点数。

(5)Python有一个特殊的运算符:lambda。利用lambda运算符能够以表达式的方式创建一个匿名函数。lambda运算符的语法如下:

        lambda args : expression

args是以逗号(,)隔开的参数列表(list),而expression则是对这些参数进行运算的表达式。

例如:

        >>>a=lambda x, y:x + y
        >>>print (a(3,4))
        7

x与y是a()函数的参数,a()函数的表达式是x+y。lambda运算符后只允许有一个表达式。要达到相同的功能,也可以使用函数来定义a,如下所示:

        >>> def a(x, y):     #定义一个函数
         return x + y        #返回参数的和
        >>> print (a(3,4))
        7

案例2-8】比较运算符的优先级(代码2.8.py)。

        a = 10
        b = 6
        c = 4
        d = 2
        e = 0
        e = (a + b) * c / d      #(16 *4 ) / 2
        print ("(a + b) * c / d运算结果为:",  e)
        e = ((a + b) * c) / d    # (16 *4 ) /2
        print ("((a + b) * c) / d运算结果为:",  e)
        e = (a + b) * (c / d);   # (16) * (4/2)
        print ("(a + b) * (c / d) 运算结果为:",  e)
        e = a + (b * c) / d;     # 10 + (24/2)
        print ("a + (b * c) / d运算结果为:",  e)

保存并运行程序,结果如下:

        (a + b) * c / d运算结果为:32.0
        ((a + b) * c) / d运算结果为:32.0
        (a + b) * (c / d) 运算结果为:32.0
        a + (b * c) / d运算结果为:22.0

在本案例中,首先定义变量a、b、c、d、e并简单赋值,然后通过各种类型的运算符混合计算,用户可以分辨出这些运算符的优先级。