内容简介:Python的Tuple是不是冗余设计?
Python的Tuple是不是冗余设计?
2017.06.14 13:05:48
问题在这里: https://www.zhihu.com/question/60574107 。
觉得这个问题挺好,值得好好思考。
Immutable
首先说说Immutable的优势:
- 为什么FP在多核时代重获重视?一个很重要的原因就是FP的Immutable特性。Immutable类型不存在Mutable类型的同步问题;
- 因为不可变,Immutable类型的内存结构设计就少了很多假设性条件,带来的直接好处就是性能优化;
- Python里只有Immutable类型是Hashable的,因为同样是Immutable使得Hash Table的设计来得简单;
- 业务上不该改变的就不允许其发生中途变化!
Tuple的使用场景
List跟Tuple使用场景上的一点主要区别
看到好多 Python 程序员都喜欢第一时间就用List,不管合不合适(当然有时候是需要可修改的):
[['张三', 35], ['陈八', 28]]
List存放的数据应该是同质数据;而Tuple呢?其存储的应该是像数据库记录这样的结构化数据——这个区别是List和Tuple使用上最直白的区别。
所以上述代码应该改为:
[('张三', 35), ('陈八', 28)]
Tuple是Hashable的
这可以应用在一些有趣的场景,比如把一些“记录”作为Key:
Out[11]: [(('张三', 1995), '√ 少林长拳'), (('张三', 1999), '√ 武当太极'), (('张三', 2015), '√ 破空神掌'), (('李七', 2007), '√ 大摔碑手'), (('李七', 2017), '√ 长空剑法')]
一个武者习武履历记录的时间轴就出来了。
此外,其实Python中大量运用Tuple。好比上图代码里,在 sorted
中指定 排序 顺序的字段。然后再看看 person.items()
,其结构类似上面的输出,里面同样藏着Tuple结构。
比如还有 print
:
In [15]: print("%s is %s." % ('Foo', 'Bar')) Foo is Bar.
Tuple解构
在上面的 print
里,其实就是Tuple解构。
比如:
In [28]: name, year = ('张三', 1995) In [29]: name Out[29]: '张三' In [30]: year Out[30]: 1995 In [31]: for (name, year), gongfu in sorted(person.items(), key=lambda item: (item[0], item[1])): ...: print('{n} -- {y} -- {gf}'.format(n=name, y=year, gf=gongfu)) ...: 张三 -- 1995 -- √ 少林长拳 张三 -- 1999 -- √ 武当太极 张三 -- 2015 -- √ 破空神掌 李七 -- 2007 -- √ 大摔碑手 李七 -- 2017 -- √ 长空剑法
Tuple解构特性对于函数返回多值是非常有意义的。
collections.namedtuple具名元组
附带提提 collections.namedtuple
,一个工厂函数,其在官方文档中的定义是:
factory function for creating tuple subclasses with named fields.
Returns a new tuple subclass named typename . The new subclass is used to create tuple-like objects that have fields accessible by attribute lookup as well as being indexable and iterable...
In [57]: from collections import namedtuple ...: ...: GF = namedtuple('GongFu', 'name, gf, pai, props') ...: data = [ ...: GF('张三丰', '太极拳', '武当派', ('男', 60)), ...: GF('刘小七', '八卦掌', '八卦门', ('男', 41)), ...: GF('石破天', '无影手', '无影门', ('男', 39)) ...: ] ...: for item in data: ...: print(f'{item.name} -- {item.gf} -- {item.pai} -- {item.props[0]} -- {item.props[1]}.') ...: 张三丰 -- 太极拳 -- 武当派 -- 男 -- 60. 刘小七 -- 八卦掌 -- 八卦门 -- 男 -- 41. 石破天 -- 无影手 -- 无影门 -- 男 -- 39.
collections.namedtuple可以
带上名称属性,在逻辑及调试上更加清晰。在作为“记录”使用时,无疑 collections.namedtuple
更为合适。而且 collections.namedtuple
的构建在内存上跟Tuple是一样的,从而也足够优化。
而且 collections.namedtuple
也能够解构:
In [65]: name, gf, pai, (props0, props1) = data[2] In [66]: name, gf, pai, props0, props1 Out[66]: ('石破天', '无影手', '无影门', '男', 39)
番外篇
Tuple的一个定义:
Tuple其实是在大量编程语言中得以大量使用的。在一些FP语言中Tuple的基础其实是Pair,比如Idris中, ("Baz", "Foo", "Bar", 39)
被当成 ("Baz", ("Foo", ("Bar", 39)))
。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Windows Server 存储空间之存储冗余
- Micronaut + GraalVM 是不是真的香
- 关于arduino是不是玩具的讨论
- DBA 防跑路,是不是备份最重要?
- Debian/Ubuntu清理无效包、废弃包、冗余包、rc包
- Python 的缩进是不是反人类的设计?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
软件人才管理的艺术
Michael Lopp / 罗小平 / 人民邮电出版社 / 201008 / 35.00元
本书作者具有15年的硅谷人才管理经验,他在博客上发表了大量探讨软件人才的管理之道的文章,深受读者欢迎。本书素材取自他的博客文章,用深入浅出的语言,讲述发人深思的道理,具有很强的现实操作性。 本书分为三大部分:“管理的箭袋”、“过程就是产品”、“你的其他版本”。前两部分分别讲述了人员与产品的管理,第三部分除了讨论管理之外,还讲述了如何有针对性地准备简历和电话面试,来提高自己面试成功的几率。书中......一起来看看 《软件人才管理的艺术》 这本书的介绍吧!