首页 > 技术文章 > Python学习-解压可迭代对象赋值给多个变量

cq90 2017-06-27 14:03 原文

解压序列赋值给多个对象

任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量。唯一的前提就是变量的数量必须跟序列元素的数量是一样的。

>>> data = ['abcd','a',1,2,(3,4)]
>>> a,b,c,d,e = data
>>> a,b,c,d,e
('abcd', 'a', 1, 2, (3, 4))
>>> a,b,c,d,(e,f) = data
>>> f
4
>>>

这种解压赋值可以用在任何可迭代对象上面,而不仅仅是列表或者元祖。包括字符串,文件对象,迭代器和生成器。

>>> s= 'Hello'
>>> a,b,c,d,e = s
>>> e
'o'
>>>

有时候,你可能只想解压一部分,丢弃其它的值。对于这种情况Python并没有提供特殊的语法。但是你可以使用任意变量名去占位,到时候丢掉这些变量就可以了。

但是你必须保证你选用的那些占位变量名在其它地方没有被使用到。

*星号表达式的用法

如果你想统计一门课程24次考试的平均成绩,需要排除第一次和最后一次的成绩,可以使用星号表达式。

def grades_avg(grades):
    fist,*middle,last = grades
    return sum(middle)/len(middle)

另外一种情况,假设你现在有一些用户的记录列表,每条记录包含一个名字、邮件,接着就是不确定数量的电话号码。你可以像下面这样分解这些记录:

>>> 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']
>>> 

 

星号表达式也能用在可迭代对象的开始部分:

>>> a = ('wang','li','zhang','male',30)
>>> *name,sex,age = a
>>> name
['wang', 'li', 'zhang']
>>>

注意:

以上星号表达式解压出来的变量都是列表类型,不管解压的对象是什么类型,这样你使用星号表达式解压出来的对象时就不用做多余的检查它到低是什么类型(永远是list)

 

值得注意的是:星号表达式在迭代元素为可变长元组的序列时是很有用的。比如

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)

输出:
foo 1 2
bar hello
foo 3 4

星号解压语法在字符串操作的时候也会很有用,比如字符串的分割:

>>> 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'
>>>

 

推荐阅读