值得注意的是,星号表达式在迭代元素为可变长元组的序列时是很有用的。比如, 下面是一个带有标签的元组序列:
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' >>>
有时候,你想解压一些元素后丢弃它们,你不能简单就使用 * ,但是你可以使用一 个普通的废弃名称,比如 _ 或者 ign (ignore)。
代码示例:
>>> record = ('ACME', 50, 123.45, (12, 18, 2012)) >>> name, *_, (*_, year) = record
>>> name
'ACME'
>>> year 2012 >>>
在很多函数式语言中,星号解压语法跟列表处理有许多相似之处。比如,如果你有 一个列表,你可以很容易的将它分割成前后两部分:
>>> items = [1, 10, 7, 4, 5, 9] >>> head, *tail = items
>>> head
1
>>> tail
[10, 7, 4, 5, 9] >>>
还能用这种分割语法去巧妙的实现递归算法。比如:
>>> def sum(items):
... head, *tail = items
... return head + sum(tail) if tail else head ...
>>> sum(items)
36
>>>
然后,由于语言层面的限制,递归并不是 Python 擅长的。因此,最后那个递归演 示仅仅是个好奇的探索罢了,对这个不要太认真了。