序列解包
赋值语句见过很多,有的给变量赋值,还有给数据结构的一部分(如列表中的元素和切片、或字典项)赋值,但还有其它类型的赋值。
同时(并行)给多个变量赋值:
>>> x, y, z = 1, 2, 3 >>> print(1, 2, 3) 1 2 3
这种方式还可交换多个
>>> x, y, z = 1, 2, 3 >>> print(x, y, z) 1 2 3 >>> x, y = y, x >>> print(x, y, z) 2 1 3
这里执行的操作成为序列解包(或可迭代对象解包):将一个序列(或任何可迭代的对象)解包,并将得到的值存储到一系列变量中。
>>> values = 1, 2, 3 >>> x, y, z = values >>> x 1
这在使用返回元祖(或其它序列或可迭代对象)的函数或方法时很有用。假设要从字典中随机获取(删除)一个键-值对,可使用popitem,它会获取一个键-值对,并以元祖的方式返回。这样,就可直接将返回的元祖解包到俩个变量。
>>> phonebook = {'lilei':666, 'hanmeimei':888} >>> name, phone = phonebook.popitem() >>> name 'hanmeimei' >>> phone 888
PS:要解包的序列包含的元素必须与你再等号左边列出的目标个数相同。否则会抛出异常。
>>> x, y, z = 1, 2, 3, 4 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 3) >>> x, y, z = 1, 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: not enough values to unpack (expected 3, got 2)
可使用星号运算符(*)来收集多余的值,这样无需确保值和变量的个数相同,
>>> a, b, *rest = 1, 2, 3, 4, 5 >>> rest [3, 4, 5]
还可以将带*号的变量放在其他位置:
>>> a, *b, c = 1, 2, 3, 4, 5 >>> b [2, 3, 4]
赋值语句的右边可以是任何类型的序列,但是带*号的变量最终包含的总是一个列表。在变量和值的个数相同时亦如此:
>>> a, *b, c = 1, 2, 3 >>> b [2]
链式赋值
链式赋值时一种快捷方式,用于将多个变量关联到同一个值。
>>> x = y = 'hello'
等价于
>>> y = 'hello' >>> x = y
增强赋值
可以不编写代码x = x + 1,而将右边表达式中的运算符(这里是+)移到赋值运算符(=)的前面,从而写成 x += 1.这成为增强赋值,适用于所有的标准运算符。如 *、/、%等。
增强赋值也可用于其他的数据类型(只要使用的时双目运算符可用于这些数据类型)
>>> name = 'root' >>> name += 'ubuntu' >>> name 'rootubuntu' >>> name *= 2 >>> name 'rootubunturootubuntu'
代码块
代码块是一组语句,可在满足条件时执行(if语句),可执行多次(循环),等等,代码块是通过缩进代码来创建的。
在同一个代码中,各行代码的缩进量必须相同。
在Python中,使用冒号(:)指出接下来是一个代码块,并将该代码块的每行代码都缩进相同的程度。
当缩进量与之前相同时,该代码块就到此结束了。