目录
- 问题
- 解决方案
- 讨论
问题
从某个不确定长度的迭代对象中分解出 N N N 个元素。
解决方案
*分解操作和各种函数式语言中的列表处理功能有着一定的相似性。例如,如果有一个列表,可以像下面这样轻松将其分解为头部和尾部。
scores = [99, 97, 91, 89, 88.5, 81, 79]
head, *tails = scores
print(head)
print(tails)
讨论
对于分解未知或者任意长度的可迭代对象,这种扩展分解操作可谓量身定制。比如在如下案例中,*tags
作为参数部分,轻松对模式和数量不定的参数进行分割。
records = [('foo', 1, 2),('bar', "hello"),('foo', 3, 4),('chat', "Hi", 2.5)
]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(":")
print(uname)
print(homedir)
print(sh)