西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代目标赋值给多个变量,中央一套

1.2 解压可迭代方针赋值给多个变量

问题

假如一个可迭代方针的元素个数超越变量个数时,会抛出一个 ValueErr西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代方针赋值给多个变量,中心一套or 。 那么怎样才能从这个可迭代方针中解压出 N 个元素出来?

处理方案

Python 的星号表达式能够用来处理这个问题。比方,你在学习一门课程,在学期末的时分, 你想计算下家庭作业的均匀成果,可是排除去第一个和最终一个分数。假如只要四个分数,你或许就直接去简略的手动赋值, 但假如有 24 个呢?这时分星号表达式就派上用场了:

def drop_first_last(grades):
first, *middle, last = grades
return avg(middle)duck

别的一黄霑种状况,假定你现在有一些用户的记载列表,每条记载包含一个姓名、邮件,接着就是不确认数量的电话号码。 你能够像下面这样分化这些记载:

>>> record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
>>> name, email, *phone_numbers = record
>>> name
'Dave'
>>> email
'dave@example.com'
>>> phone_numbers
['773-显卡排行555-1212', '847-555-1212']
>>>

值得留意的是上面解压出的 phone_numbers 变量永远都是列表类型,不论解压的电话号码数量是多少(包含 0 个)。 所以,任何运用到 phone_numbers 变量的代码就不需要做剩余的类型查看去承认它是否是列表类型了。

星号表达式也能用在列表的开端部分。比方,你有一个公司前 8 个月出售数据的序列, 可是你想看下最近一个月数据和前面 7 个月的均匀值的比照。你能够这样做:

*trail大唐武侯ing_qtrs, current_qtr = sa虎斑猫les_record
trai奥ling_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,西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代方针赋值给多个变量,中心一套 9, 5, 10]
>>> current
3

评论

扩展的迭代解压语法是专门为解压不确认个数或恣意个数元素的可迭代方针而规划的。 一般,这些可迭代方针的元素结构有确认的规矩(比方第 1 个元素后边都是电话号码), 星号表达式让开发人员能够很简略的运用这些西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代方针赋值给多个变量,中心一套规矩来解压出元从来。 而不是经过一些比较复杂的手法去获取这些相关的元素值。

值得扎纸人姜琳留意的是,星号表达式在迭代元素为可变长元组的序列时是很有用的。 比方,下面是一个带有一般话水平测试标签的元组序列:

records = [
('foo', 1, 2),
('bar', 'hello'),
('foo', 3, 4),
]
def do_西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代方针赋值给多个变量,中心一套foo(x, y):
print('foo', x, y)
def do_bar(s):
print('bar', s)
for tag, *apowerpointr沈殿霞gs in records:
if tag == 'foo':
do_foo(*args)
elif tag == 'bar':
do火影之_bhuyar(*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'
>>>

有时分,你想解压一些元西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代方针赋值给多个变量,中心一套素后丢掉它们,你不能简略就运用 * , 可是你能够运用一个一般的抛弃称号,比方 _ 或许 ign (ignore)。

代码示例:

>>> record = ('ACME', 50, 123.托福报名官网45, (12, 18, 2012))
>>> name, *_, (*_, year) = record
>>> name
'ACME'
>>> year
2012
>>>

在许多函数式言语中,星号解酱汁淮山压西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代方针赋值给多个变量,中心一套语法跟列表处理有许多相似之处。比方,假如你有一个列表, 你能够很简略的将它切割成前后两部分:

>>> items = [1, 10, 7,negociate 4, 5, 9]
>>> head,韩国演艺圈 *tail = item西红柿牛腩,python3-数据结构和算法 » 1.2 解压可迭代方针赋值给多个变量,中心一套s
>>> 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 拿手的。 因而,最终那个递归演示仅仅是个猎奇的journey探究算了,对这个不要太仔细了。