Python3.5从零开始学
上QQ阅读APP看书,第一时间看更新

6.3 别样的赋值

之前我们介绍了很多赋值语句,在实际使用中,赋值语句还有很多特殊用法,掌握这些用法对于提高编程水平很有帮助。

6.3.1 序列解包

前面已经有不少赋值语句的示例,比如变量和数据结构成员的赋值,不过赋值的方法不止这些,例如:

        >>> x,y,z=1,2,3
        >>> print(x, y, z)
        1 2 3

由输出结果看到,可以多个赋值操作同时进行。后面再遇到对多个变量赋值时,就不需要对一个变量赋完值再对另一个变量赋值了,用一条语句就可以搞定,例如:

        >>> x, y, z=1,2,3
        >>> x, y=y, x
        >>> print(x, y, z)
        2 1 3

由输出结果看到,x和y的值交换了,所以可以交换两个或多个变量的值。

在Python中,交换所做的事情叫作序列解包(sequence unpacking)或可选迭代解包,即将多个值的序列解开,然后放到变量序列中。可以通过下面的示例理解:

        >>> nums=1,2,3
        >>> nums
        (1, 2, 3)
        >>> x, y, z=nums
        >>>x           #获得序列解开的值
        1
        >>> print(x, y, z)
        1 2 3

由输出结果看到,序列解包后,变量获得了对应的值。

再看另一个示例:

        >>> student={'name':’小萌’, 'number':'1001'}
        >>> key, value=student.popitem()
        >>> key
        'number'
        >>> value
        '1001'

由输出结果可知,此处作用于元组,使用popitem方法将键-值作为元组返回,返回的元组可以直接赋值到两个变量中。

序列解包允许函数返回一个以上的值并打包成元组,然后通过一个赋值语句进行访问。这里有一点要注意,解包序列中的元素数量必须和放置在赋值符号“=”左边的数量完全一致,否则Python会在赋值时引发异常,例如:

        >>> x, y, z=1,2,3
        >>> x, y, z
        (1, 2, 3)
        >>> x, y, z=1,2
        Traceback (most recent call last):
          File "<pyshell#45>", line 1, in <module>
            x, y, z=1,2
        ValueError: not enough values to unpack (expected 3, got 2)
        >>> x, y, z=1,2,3,4,5
        Traceback (most recent call last):
          File "<pyshell#46>", line 1, in <module>
            x, y, z=1,2,3,4,5
        ValueError: too many values to unpack (expected 3)

由以上输出结果看到,当右边的元素数量和左边的变量数量不一致时,执行结果就会报错。错误原因是没有足够的值解包(左边变量多于右边元素)或多个值未解包(左边变量少于右边元素)。

谨记在操作序列解包时,要注意保证左边和右边数量的相等。

6.3.2 链式赋值

6.3.1小节介绍了可以对序列解包,序列解包在对不同变量赋不同的值时非常有用,赋相同的值时用序列解包也可以实现。其实还可以使用其他方法,如链式赋值(Chained Assignment),例如:

        >>> x=y=z=10
        >>> x
        10

由输出结果可知,可以通过多个等式为多个变量赋同一个值,这种方法叫作链式赋值。

链式赋值是将同一个值赋给多个变量。

上面的语句效果和下面的语句效果一样:

        >>> x=10
        >>> y=x
        >>> y
        10

由输出结果可知,既可以使用链式方式赋值,也可以单独赋值,显然链式方法更简洁。

6.3.3 增量赋值

我们在第2章讲解了赋值运算符。使用赋值运算符时没有将表达式写成类似x=x+1的形式,而是将表达式放置在赋值运算符(=)的左边(如将x=x+1写成x+=1),这种写法在Python中叫作增量赋值(Augemented Assignment)。这种写法对*(乘)、/(除)、%(取模)等标准运算符都适用,例如:

        >>> x=5
        >>>x+=1   #加
        >>>x
        6
        >>> x-=2 #减
        >>> x
        4
        >>> x*=2 #乘
        >>> x
        8
        >>>x/=4  #除
        >>> x
        2.0

由操作结果可以看到,使用增量赋值相对赋值操作看上去更简洁。

增量赋值除了适用于数值类型,还适用于二元运算符的数据类型,例如:

        >>> field ='Hello, '
        >>> field += 'world'
        >>> field
        'Hello, world'
        >>> field*=2
        >>> field
        'Hello, worldHello, world'

由操作结果可知,增量赋值操作也可以用于字符串。

增量赋值可以让代码在很多情况下更易读,也可以帮助我们写出更紧凑、简练的代码。