解包sequence
>>> p = (4 , 5 )
>>> x, y = p
>>> x
4
>>> y
5
>>>
>>> data = [ 'ACME' , 50 , 91.1 , (2012 , 12 , 21 ) ]
>>> name, shares, price, date = data
>>> name
'ACME'
>>> date
(2012 , 12 , 21 )
>>> name, shares, price, (year, mon, day) = data
>>> name
'ACME'
>>> year
2012
>>> mon
12
>>> day
21
>>>
解包string
>>> s = 'Hello'
>>> a, b, c, d, e = s
>>> a
'H'
>>> b
'e'
>>> e
'o'
>>>
解包指定定内容
>>> data = [ 'ACME' , 50, 91.1, (2012, 12, 21) ]
>>> _, shares, price, _ = data
>>> shares
50
>>> price
91.1
前后任意长度解包
中间
def drop_first_last (grades) :
first, *middle, last = grades
return avg(middle)
最后
>>> record = ('Dave' , 'dave@example.com' , '773-555-1212' , '847-555-1212' )
>>> name, email, *phone_numbers = user_record
>>> name
'Dave'
>>> email
'dave@example.com'
>>> phone_numbers
['773-555-1212' , '847-555-1212' ]
第一个
>>> *trailing, current = [10 , 8 , 7 , 1 , 9 , 5 , 10 , 3 ]
>>> trailing
[10 , 8 , 7 , 1 , 9 , 5 , 10 ]
>>> current
3
解包包含tag的元组
records = [
('foo' , 1 , 2 ),
('bar' , 'hello' ),
('foo' , 3 , 4 ),
]
def do_foo (x, y) :
print('foo' , x, y)
def do_bar (s) :
print('bar' , s)
for tag, *args in records:
if tag == 'foo' :
do_foo(*args)
elif tag == 'bar' :
do_bar(*args)
解包实际应用
>>> line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'
>>> uname, *fields, homedir, sh = line.split(':' )
>>> uname
'nobody'
>>> homedir
'/var/empty'
>>> sh
'/usr/bin/false'
数组里面有元组的情况
>>> record = ('ACME' , 50 , 123.45 , (12 , 18 , 2012 ))
>>> name, *_, (*_, year) = record
>>> name
'ACME'
>>> year
2012
分割递归方法
>>> def sum (items) :
head, *tail = items
return head + sum(tail) if tail else head
>>> sum(items)
36
>>>