Python中哪些序列可以通过赋值操作进行拆分
Admin 2022-06-21 群英技术资讯 532 次浏览
Python
中的任何序列(可迭代的对象)都可以通过赋值操作进行拆分,包括但不限于元组、列表、字符串、文件、迭代器、生成器等。
元组拆分是最为常见的一种拆分,示例如下:
p = (4, 5) x, y = p print(x, y) # 4 5
如果写成
x, y, z = p
那么就会抛出ValueError异常: “not enough values to unpack (expected 3, got 2)”
如果写成
p = (4, 5, 6) x, y = p
那么就会抛出ValueError异常: “ too many values to unpack (expected 2)”
字符串的拆分示意如下:
s = 'Hello' a, b, c, d, e = s print(a) # H
如果在拆分时想丢弃某些特定的值,可以用一个用不到的变量名来作为丢弃值的名称(常选'_'做为变量名),如下所示:
s = 'Hello' a, b, _, d, _ = s print(a) # H
Python也提供简洁的对嵌套序列进行拆分的语法。如下所示我们对一个比较复杂的异质列表进行拆分:
data = ['zhy', 50, 123.0, (2000, 12, 21)] name, shares, price, (year, month, day) = data print(year) # 2000
如果你想完整地得到(2000, 12, 21)
这个表示时间戳的元组,那么你就得这样写:
data = ['zhy', 50, 123.0, (2000, 12, 21)] name, shares, price, date = data print(date) # (2000, 12, 21)
之前我们说过,如果我们想从可迭代对象中分解出N个元素,但如果这个可迭代对象长度超过N,则会抛出异常"too many values to unpack"。针对这个问题的解决方案是采用"*"表达式。
比如我们给定学生的分数,想去掉一个最高分和一个最低分,然后对剩下的学生求平均分,我们可以这样写:
def avg(data: list): return sum(data)/len(data) # 去掉最高分,最低分然后做均分统计 def drop_first_last(grades): first, *middle, last = grades return avg(middle) print(drop_first_last([1,2,3,4])) # 2.5
还有一种情况是有一些用户记录,记录由姓名+电子邮件+任意数量的电话号码组成,则我们可以这样分解用户记录:
record = ['zhy', 'zhy1056692290@qq.com', '773-556234', '774-223333'] name, email, *phone_numbers = record print(phone_numbers) # ['773-556234', '774-223333']
事实上,如果电话号码为空也是合法的,此时phone_numbers
为空列表。
record = ['zhy', 'zhy1056692290@qq.com'] name, email, *phone_numbers = record print(phone_numbers) # []
还有一种使用情况则更为巧妙。如果我们需要遍历变长元组组成的列表,这些元组长度不一。那么此时*表达式可大大简化我们的代码。
records = [('foo', 1, 2), ('bar', 'hello'), ('foo', 3, 4)] for tag, *args in records: if tag == 'bar': print(args) # ['hello']
在对一些复杂的字符串进行拆分时,*表达式也显得特别有用。
line = "nobody:*:-2:-2:-2:Unprivileged User:/var/empty:/usr/bin/false" uname, *fields, home_dir, sh = line.split(':') print(home_dir) # /var/empty
*表达式也可以和我们前面说的嵌套拆分和变量丢弃一起结合使用。
record = ['ACME', 50, 123.45, (128, 18, 2012)] name, *_, (*_, year) = record print(year) # 2012
最后再介绍*表达式用于递归函数的一种黑魔法,比如与递归求和结合可以这样写:
items = [1, 10, 7, 4, 5, 9] def sum(items): head, *tail = items return head + sum(tail) if tail else head print(sum(items)) # 36
不过,Python
由于自身递归栈的限制,并不擅长递归。我们最后一个递归的例子可以做为一种学术上的尝试,但不建议在实践中使用它。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python数据提取-lxml模块,lxml模块和xpath语法的关系,lxml模块的使用场景、lxml模块的安装、谷歌浏览器xpath helper插件的安装和使用等相关内容介绍,需要的朋友可以参考一下
这篇文章主要为大家介绍一个Python中的模块:watchdog模块,它可以实现监控文件的变化。文中通过示例详细介绍了watchdog模块的使用,需要的可以参考一下
这篇文章主要为大家详细介绍了Python实现FIFO(先进先出)缓存置换算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要分享的是Python常见的几种数据加密方式,主要包括线性散列算法(签名算法)MD5,sha1、对称性加密算法 AES DES、非对称性加密算法 RSA,具体详细内容介绍,需要的小伙伴可以参考一下
这篇文章介绍了Python使用psutil获取系统信息的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008