六、赋值魔法与代码块

序列解包

赋值语句见过很多,有的给变量赋值,还有给数据结构的一部分(如列表中的元素和切片、或字典项)赋值,但还有其它类型的赋值。

同时(并行)给多个变量赋值:

>>> 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中,使用冒号(:)指出接下来是一个代码块,并将该代码块的每行代码都缩进相同的程度。

当缩进量与之前相同时,该代码块就到此结束了。

 

 

猜你喜欢

转载自www.cnblogs.com/kongzhou/p/9020701.html