1.2 解压可迭代对象赋值给多个变量
问题
如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError 。那么 怎样才能从这个可迭代对象中解压出 N 个元素出来?
解决方案
Python 的星号表达式可以用来解决这个问题。比如,你在学习一门课程,在学期 末的时候,你想统计下家庭作业的平均成绩,但是排除掉第一个和最后一个分数。如果 只有四个分数,你可能就直接去简单的手动赋值,但如果有 24 个呢?这时候星号表达 式就派上用场了:
def drop_first_last(grades):
first, *middle, last = grades
return avg(middle)
另外一种情况,假设你现在有一些用户的记录列表,每条记录包含一个名字、邮 件,接着就是不确定数量的电话号码。你可以像下面这样分解这些记录:
>>> record = ('Dave', '[email protected]', '773-555-1212', '847-555-1212') >>> name, email, *phone_numbers = record
>>> name
'Dave'
>>> email
'[email protected]'
>>> phone_numbers ['773-555-1212', '847-555-1212'] >>>
值得注意的是上面解压出的 phone_numbers 变量永远都是列表类型,不管解压的 电话号码数量是多少(包括 0 个)。所以,任何使用到 phone_numbers 变量的代码就不 需要做多余的类型检查去确认它是否是列表类型了。
星号表达式也能用在列表的开始部分。比如,你有一个公司前 8 个月销售数据的 序列,但是你想看下最近一个月数据和前面 7 个月的平均值的对比。你可以这样做:
*trailing_qtrs, current_qtr = sales_record trailing_avg = sum(trailing_qtrs) / len(trailing_qtrs) return avg_comparison(trailing_avg, current_qtr)
下面是在 Python 解释器中执行的结果:
>>> *trailing, current = [10, 8, 7, 1, 9, 5, 10, 3] >>> trailing
[10, 8, 7, 1, 9, 5, 10]
>>> current
3
讨论
扩展的迭代解压语法是专门为解压不确定个数或任意个数元素的可迭代对象而设 计的。通常,这些可迭代对象的元素结构有确定的规则(比如第 1 个元素后面都是电 话号码),星号表达式让开发人员可以很容易的利用这些规则来解压出元素来。而不是 通过一些比较复杂的手段去获取这些关联的元素值。
标签:解压,1212,迭代,python,元素,current,trailing From: https://blog.51cto.com/u_16251183/8669034