- 问题
需要从某个可迭代对象中分解出N个元素,但是这个可迭代对象的长度可能超过N,这会导致出现“分解值过多”的异常。 - 解决方案
python的 *表达式可以用来解决这个问题。
3.例如开设了一门课程,并决定在期末的作业成绩中去掉第一个和最后一个,只对中间剩下的成绩做平均分统计。如果只有四个成绩,也许可以简单地将4个都分解出来,但是如果有24个呢?
*表达式可以使这这一切都变得简单.
def drop_first_last(grades):
first,*middle,last=grades
return avg(middle)
4.另一个用例是假设有一些用户记录,记录由姓名和电子邮件地址组成,后面跟着任意数量的电话号码。则可以像这样分解记录:
record=('Dave','dave@qq.com','773-556-222','282-222-332')
name,email,*phone_numbers=user_record
print(name,email,phone_numbers)
注意:不管需要分解多少个电话号码(甚至没有),变量phone—numbers都一直是列表。由*修饰的变量也可以位于列表的第一个位置。
5.*式语法在迭代一个变长的元组序列时尤其有用。例如有一个带标记的元组序列:
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)
if tag=='bar':
do_bar(*args)
6.另外当和某些特定的字符串处理操作相结合,比如拆分(split)操作时,这种*式的语法所支持的分解操作也非常有用。