python input输入多个变量_「Python 秘籍」1.2 解压可迭代对象赋值给多个变量

80fa85a00c03ed9478dbfc845359d29c.png

问题

需要从某个可迭代对象中分解出 N 个元素,但是这个可迭代对象的长度可能超过 N,这会导致出现“需要解包的值过多(too many values to unpack)”的异常。

解决方案

“星号表达式”可以用来解决这个问题。例如,假设开设了一门课程,并决定在期末的作业成绩中去掉第一个和最后一个,只对中间剩下的成绩做平均分统计。如果只有 4 个成绩,也许可以简单地将 4 个都分解出来,但是如果有 24 个呢?星号表达式使这一切都变得简单:

def drop_first_last(grades): first, *middle, last = gradesreturn 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']>>> 

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

由星号修饰的变量也可以位于列表的第一个位置。例如,用一系列的值来代表公司过去 8 个季度的销售额。如果想对最近一个季度的销售额同前 7 个季度的平均值做比较,可以这么做:

*trailing_qtrs, current_qtr = sales_recordtrailing_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]>>> current3

讨论

扩展的迭代解压语法是专门为解压不确定个数或任意个数元素的可迭代对象而设计的。通常,这些可迭代对象的元素结构有确定的规则(比如第 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 (ignore)。

代码示例:

>>> record = ('ACME', 50, 123.45, (12, 18, 2012))>>> name, *_, (*_, year) = record>>> name'ACME'>>> year2012>>>

在很多函数式语言中,星号解压语法跟列表处理有许多相似之处。比如,如果你有一个列表,你可以很容易的将它分割成前后两部分:

>>> items = [1, 10, 7, 4, 5, 9]>>> head, *tail = items>>> head1>>> tail[10, 7, 4, 5, 9]>>>

如果你够聪明的话,还能用这种分割语法去巧妙的实现递归算法。比如:

def sum(items): head, *tail = itemsreturn head + sum(tail) if tail else headprint(sum([1, 10, 7, 4, 5, 9]))

然后,由于语言层面的限制,递归并不是 Python 擅长的。因此,最后那个递归演示仅仅是个好奇的探索罢了,对这个不要太认真了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么不谈恋爱?

1 存好啦!2 这是我看过最形象的小说描写了图自天秀bot3 原来游泳池是这样建的。。4 这谁还舍得拉绳子啊5 铁笼:大哥,给点面子好不好?6 别说,这门给狗子放头还挺合适的7 机器人骑自行车你点的每个赞,我都认真…

牛!又一顶级大厂开招.NET,5年35k!

继腾讯阿里百度京东华为招.NET Core后,又一顶级大厂开招.NET Core了:美团上海总部,住宿业务线别样红业务部招.NET开发,25~35k,具体参见【招聘(上海)】美团酒店招聘 .NET 高级开发。大厂遥不可及的认知该放下了&#xf…

理科生浪漫起来,谁都顶不住!

全世界只有3.14 % 的人关注了爆炸吧知识和文科常呈现出的诗词歌赋风花雪月不同,理科常常给人一种理性、严肃甚至冰冷的感觉。其实不然,理科中所蕴含的美,非肉眼可窥。在豆瓣话题#理科中的美学#里,我们找到了许多透过数字、显微镜、…

docker 修改阿里镜像源_Jetson Nano 修改源镜像

由于Jeston nano自带的软件源无法更新,因此更换为国内的软件源,本文使用中科大提供的软件源镜像,具体步骤如下:进入Ubuntu系统之后,我们发现使用以下命令,查看ubuntu版本 $ cat /etc/issue 查看Ubuntu系统版…

python中数据用折线图表示_用python处理文本数据

用python处理文本数据Q:这篇文章主要讲什么?A:这篇文章主要讨论如何用python来做一些简单的文本处理——文本相似度比较。谈起python的自然语言处理,肯定会让人想起NLTK。不过上面这两个任务并不需要NLTK这个库&#x…

.Net Core下使用KeyDB高可用缓存集群

前言提到缓存,首先会想到Redis,它是目前最流行的开源内存键值存储服务。使用单个Redis实例进行缓存非常简单,如果创建高可用集群,则需要一个主节点、两个从节点和多个监视主节点的哨兵节点:哨兵节点监控主节点的状态,一…

超赞!世界10个著名悖论的最终解答来了!

全世界只有3.14 % 的人关注了爆炸吧知识今天小编看到一篇作者Das对十大悖论的个人理解,觉得挺有意思,现在便分享给模友们看看,你们的想法是怎样的呢?电车难题引用:“电车难题”是伦理学领域最为知名的思想实验之一&…

设置计算机网络密码怎么设置路由器,如何在计算机上设置路由器密码?

问: 如何在计算机上设置路由器密码?A: 在计算机浏览器中,输入路由器的管理地址,打开登录页面,输入登录密码,然后进入设置页面.然后打开无线设置或Wi-Fi设置选项,您可以设置无线密码(wifi密码). 打开此选项可…

hive sql 怎么实现循环_不出办公室就能无水造纸?让废纸“秒循环再生”怎么实现的...

废纸变为再生纸,不出办公室就能循环利用起来,既节省大量木材,还不消耗一滴水……第三届进博会上,首次参展的打印巨头爱普生带来其全球首创的“干纤维纸张循环系统”,环保效果令人赞叹,吸引大批观众前来围观…

两头编程,测试中间

最近在做一些开发测试代码的工作,就是为了测试中间业务程序,前头调用程序,后头写挡板程序,说白了就是链路调用,因为复杂度在中间的业务程序,所以前后两端的程序应相对简单。这里就有一个问题:技…

Win32 窗口篇(3)

1.11 如何显示或隐藏窗口的标题栏 使用ModifyStyle方法改变参数来更改窗体样式 void CDemoDlg::OnTest1() {//删除标题栏风格ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED); }void CDemoDlg::OnTest2() {//添加标题栏风格ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED); …

linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列

来源CSDN:CSDN-专业IT技术社区-登录​blog.csdn.net一、概念和原理消息队列是另一种标准IPC,当然也大概遵循大部分标准消息队列,它是存放消息(数据)的队列,而队列是先进先出的线性数据结构换句话说,我们就是利用这个数据结构 进行进程间的通信消息队列允许多个进程同…

15个只有数学老师懂的泪流满面瞬间

全世界只有3.14 % 的人关注了爆炸吧知识「1」大题算了半天,就是跟标准答案对不上「2」一次令人期待的公开课啊啊——啊...「3」这就是传说中美好的协同教研「4」在网上下了一堆 PPT 准备拼到一起「5」预测高考题「6」临下课了还有三道大题没评讲「7」当我以为我已经…

matlab绘制二元一次函数图像_【八上数学】 一次函数必考知识点(下)

【八上数学】《一次函数》必考知识点(中)【八上数学】《函数、一次函数》必考知识点(上)写在前面本讲,我们重点研究一次函数与一元一次方程,不等式,二元一次方程组的问题,帮助同学们解决一些典型问题.一、一次函数与二…

计算机能代替纸笔英语作文,电脑能代替纸笔吗英语作文

电脑能代替纸笔吗英语作文在现实生活或工作学习中,说到作文,大家肯定都不陌生吧,作文可分为小学作文、中学作文、大学作文(论文)。作文的注意事项有许多,你确定会写吗?以下是小编为大家整理的电脑能代替纸笔吗英语作文…

《WinForm开发系列之高级篇》Item2 TCP异步传输

1.AsySocket.cs 代码 publicclassAsySocket {#region私有字段privateSocket mSocket null;privatestringmID "";#endregion#region构造函数publicAsySocket(string_LocalIP, int_LocalPort) { try{ mSocket newSocket(AddressFamily.InterNetwork, SocketType.Stream…

C# params的用法详解

为了将方法声明为可以接受可变数量参数的方法,我们可以使用params关键字来声明数组,要求:(1)在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。(2)该参数必须标识一个一维数组,但类…

spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!

公众号关注“程序员二哥”,设为‘星标’,带你学习更多的知识。本文内容 详细介绍5中bean的sope及使用注意点自定义作用域的实现应用中,有时候我们需要一个对象在整个应用中只有一个,有些对象希望每次使用的时候都重新创建一个&…

女生的拳头有多厉害?

1 天下武功唯快不破2 狗子:没想到我有这种天赋3 哈哈哈还是你社会啊4 女生的拳头有多厉害??5 怎么解开的?6 心中有海,脚下有沙,这就是马尔代夫7 你的人生概括

与ln的指数转化公式_高考数学48条秒杀型公式与方法

点上方蓝字,关注“云学冠学习资讯”有助于提高成绩哦!除了课本上的常规公式之外,掌握一些必备的秒杀型公式能够帮你在考试的时候节省大量的时间,师姐这次的分享就是48条秒杀公式,直接往下看!1.适用条件&…