如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError
。 那么怎样才能从这个可迭代对象中解压出N个元素出来?
Python的星号表达式可以用来解决这个问题。比如,你在学习一门课程,在学期末的时候, 你想统计下家庭作业的平均成绩,但是排除掉第一个和最后一个分数。如果只有四个分数,你可能就直接去简单的手动赋值, 但如果有24个呢?这时候星号表达式就派上用场了:
def drop_first_last(grades): first, *middle, last = grades return avg(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'] >>>
值得注意的是上面解压出的 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个元素后面都是电话号码), 星号表达式让开发人员可以很容易的利用这些规则来解压出元素来。 而不是通过一些比较复杂的手段去获取这些关联的的元素值。
值得注意的是,星号表达式在迭代元素为可变长元组的序列时是很有用的。 比如,下面是一个带有标签的元组序列:
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)
星号解压语法在字符串操作的时候也会很有用,比如字符串的分割。
代码示例:
>>> 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' >>>
有时候,你想解压一些元素后丢弃它们,你不能简单就使用 *
, 但是你可以使用一个普通的废弃名称,比如 _
或者 ign
。
代码示例:
>>> record = ('ACME', 50, 123.45, (12, 18, 2012)) >>> name, *_, (*_, year) = record >>> name 'ACME' >>> year 2012 >>>
在很多函数式语言中,星号解压语法跟列表处理有许多相似之处。比如,如果你有一个列表, 你可以很容易的将它分割成前后两部分:
>>> items = [1, 10, 7, 4, 5, 9] >>> head, *tail = items >>> 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擅长的。 因此,最后那个递归演示仅仅是个好奇的探索罢了,对这个不要太认真了。
相关推荐
2010-09-07 12:43 220,160 boost_python-vc90-mt-1_44.dll 2010-09-07 12:43 189,272 boost_python-vc90-mt-1_44.lib 2010-09-07 12:43 514,048 boost_python-vc90-mt-gyd-1_44.dll 2010-09-07 12:43 190,964 boost_...
057.Python for循环结构_遍历各种可迭代对象_range对象.mp4
(对) 2、Python 3.x完全兼容Python 2.x。(错) 3、Python 3.x和Python 2.x唯⼀的区别就是:print在Python 2.x中是输出语句,⽽在Python 3.x中是输出函数。(错) 4、在Windows平台上编写的Python程序⽆法在Unix...
Python数据结构预算法之栈(Stack)的实现与应用 数据结构预算法.pdf
本代码为基于扩展卡尔曼滤波的多传感器融合程序仿真,内附数据。
在安装pyhton扩展时,会报错:unable to find vcvarsall.bat。 是因为扩展使用C/C++编写,缺少编译需要的环境,而python2.x和3.x使用的版本也不一样,此资源提供了两个都需要的,可以根据自己的python版本选择使用。
基于breast_cancer数据集进行横向联邦学习逻辑递归的实现python源码.zip基于breast_cancer数据集进行横向联邦学习逻辑递归的实现python源码.zip基于breast_cancer数据集进行横向联邦学习逻辑递归的实现python源码....
Python3.X_HTMLTestRunner亲测可用,附说明
3_进制介绍.wmv 4_进制转换-二进制和十进制的转换.wmv 5_进制转换-练习.wmv 6_进制转换-十进制八进制十六进制的转换.wmv 7_交互模式和命令模式运行Python程序.wmv 8_Pycharm创建项目和设置Python解释器....
本文实例讲述了Python面向对象实现一个对象调用另一个对象操作。分享给大家供大家参考,具体如下: 我先总结一下python中的类的特点: 1.类中所有的方法的参数中都必须加self,并且是第一个参数 2.__init__方法用来...
python-2.7.5-90.el7.x86_64.rpm
由Python2.7.6编译得到,在64位win8上亲测可用,我是把dll文件放在了SysWOW64文件夹里,可以正常使用。
python基于LSTM神经网络进行时间序列数据预测源码+全部数据.zip包含数据清洗,数据特征提取,数据建模,数据预测使用LSTM神经网络进行时间序列数据预测分析。基于Tensorflow框架、Kerase接口开发网络模型。.LSTM单...
这篇文章主要介绍了基于python读取.mat文件并取出信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 导入所需包 from scipy.io import loadmat 读取.mat...
信号分析系统python实现版本,内含多个迭代的版本,含可运行的源码。
1.2 编程基础之变量定义、赋值及转换 python版.zip
在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量。 >>> x = 3 解析:创建了整型变量x,并赋值为3。 >>> x="Hello World." 解析:创建了字符串变量x,并赋值为“Hello World.” 。 在...
原来是通过命令行下载的docx安装包还没有完全兼容python3,估计这个安装包还只兼容python 2(python2 和python3差别还是挺大的,虽然现在python 3出来很久了,但是不少三方库还没有更新),因此需要自己找一个兼容的包...
python-keystone-2013.2.3-3.el6.noarch.rpm python-keystoneclient-0.7.1-2.el6.noarch.rpm python-kombu-1.4.1-1.el6.rf.noarch.rpm python-ldap-2.3.10-1.el6.x86_64.rpm python-libguestfs-1.20.11-2.el6.x86_64...