Python学习-解压可迭代对象赋值给多个变量

解压序列赋值给多个对象

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

>>> 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‘, ‘[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‘]
>>> 

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

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

时间: 2024-08-24 01:04:17

Python学习-解压可迭代对象赋值给多个变量的相关文章

第一章 1.2 解压可迭代对象赋值给多个变量

问题:如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError . 那么怎样才 能从这个可迭代对象中解压出N个元素出来? 解决方案:Python的星号表达式可以用来解决这个问题.比如,你在学习一门课程,在学期末的时 候, 你想统计下家庭作业的平均成绩,但是排除掉第一个和后一个分数.如果只有四 个分数,你可能就直接去简单的手动赋值, 但如果有24个呢?这时候星号表达式就派上 用场了: def drop_first_last(grades): first, *middle, la

python_cookbook之路:数据结构-解压可迭代对象赋值给多个变量以及扩展的迭代解压语法(*)

1.一一对应: >>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ] >>> name, shares, price, date = data >>> name 'ACME' >>> date (2012, 12, 21) >>> name, shares, price, (year, mon, day) = data >>> name 'ACME' >

python学习--如何实现可迭代对象(itearable)和迭代器(iterator)

关于可迭代对象Iterable 和迭代器对象iterator 可迭代对象:可以直接作用于for循环的对象统称为可迭代对象:Iterable. 可迭代对象包含一个__iter__方法,或__getitem__方法,其中__iter__方法会返回一个迭代器iterator. 可迭代对象一类是集合数据类型,如list,tuple ,dict, set,str,  另一类可迭代对象是生成器generator. 迭代器对象:可以作用于next()函数的对象都是迭代器对象.迭代器对象必须实现__next__

Python学习心得:类与对象

教材:<简明Python教程> Python面向对象: 如shell这种面向过程的程序都是通过"操作数据的函数"或者"语句块"来设计函数. python的程序(面向对象): 类是一个"class"类型,对象是类中的一个实例. 类的属性包括了:域和方法.(即变量和函数) 属于一个对象或类的变量被称为域,一个定义在类中的函数,叫做类的方法. 类使用关键字"class"来创建.域和方法放在同一个缩进块中. 1.域有两种:

C++ 类继承与对象赋值 情况下 成员变量的覆盖 浅析

[摘要] 类的继承以及对象的赋值会带来成员变量的相互传递.这里详细讨论了,类间继承带来的成员变量的传递采用覆盖原则,采用函数级的成员变量的取值:对象赋值带来的成员变量的传递采用,实函数采用数据类型的实函数,虚函数采用赋值源的虚函数,成员变量采用赋值源的成员变量,其实也是函数级的成员变量. [正文] 在类继承中,成员变量存在覆盖的情况,成员函数则存在隐藏和覆盖以及重载的情况.在类继承中,公有继承会导致公有成员变量的覆盖,从而使得成员函数的调用出现各种结果. [代码示例 01] #include<i

【python】解压文件

参考:http://essen.iteye.com/blog/1941489 tarfile模块 具体使用方法: https://docs.python.org/2/library/tarfile.html 例子:一次性解压所有文件 import tarfile t = tarfile.open("abc.tgz", "r:gz") t.extractall(path = 'dir/') t.close() 还可以一次解压一个文件 tar = tarfile.ope

python递归解压文件夹中所有压缩包

1. 简述 递归解压文件夹中的所有压缩包到指定文件夹 2. 环境配置 python解压rar文件需要安装依赖库 (python-unrar) Windows: 在 RARLab 官方下载安装库文件 http://www.rarlab.com/rar/UnRARDLL.exe 默认路径伪 C:\Program Files (x86)\UnrarDLL\ 添加环境变量 UNRAR_LIB_PATH 键值 C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll,

11.Python初窥门径(函数名,可迭代对象,迭代器)

Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return l print(func(1)) # [1] print(func(2)) # [1,2] print(func(3)) # [1,2,3] 二.函数名的应用 函数名指向的是函数的内存地址,加上()就执行这个函数 def func(args): return args print(func) #

Python 迭代器协议以及可迭代对象、迭代器对象

一.迭代器协议定义: 迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而来 while True: #单纯的重复 print('你瞅啥') l=['a','b','c','d'] count=0 while count < len(l): print(l[count]) count+=1 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 二.可迭代对象定义: 实现了迭代器协议