Python的Tuple是不是冗余设计?

栏目: Python · 发布时间: 7年前

内容简介:Python的Tuple是不是冗余设计?

Python的Tuple是不是冗余设计?

2017.06.14 13:05:48

Python的Tuple是不是冗余设计?

问题在这里: https://www.zhihu.com/question/60574107

Python的Tuple是不是冗余设计?

觉得这个问题挺好,值得好好思考。

Immutable

首先说说Immutable的优势:

  1. 为什么FP在多核时代重获重视?一个很重要的原因就是FP的Immutable特性。Immutable类型不存在Mutable类型的同步问题;
  2. 因为不可变,Immutable类型的内存结构设计就少了很多假设性条件,带来的直接好处就是性能优化;
  3. Python里只有Immutable类型是Hashable的,因为同样是Immutable使得Hash Table的设计来得简单;
  4. 业务上不该改变的就不允许其发生中途变化!

Tuple的使用场景

List跟Tuple使用场景上的一点主要区别

看到好多 Python 程序员都喜欢第一时间就用List,不管合不合适(当然有时候是需要可修改的):

[['张三', 35], ['陈八', 28]]

List存放的数据应该是同质数据;而Tuple呢?其存储的应该是像数据库记录这样的结构化数据——这个区别是List和Tuple使用上最直白的区别。

所以上述代码应该改为:

[('张三', 35), ('陈八', 28)]

Tuple是Hashable的

这可以应用在一些有趣的场景,比如把一些“记录”作为Key:

Python的Tuple是不是冗余设计?

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的一个定义:

Python的Tuple是不是冗余设计?

Tuple其实是在大量编程语言中得以大量使用的。在一些FP语言中Tuple的基础其实是Pair,比如Idris中, ("Baz", "Foo", "Bar", 39) 被当成 ("Baz", ("Foo", ("Bar", 39)))


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

敏捷教练

敏捷教练

[英] Rachel Davies、[英] Liz Sedley / 徐毅、袁店明 / 清华大学出版社 / 2013-7 / 49.00元

《敏捷教练:如何打造优秀的敏捷团队》取材于国际知名敏捷教练的真实经历,展示了他们在辅导团队进行敏捷实践过程中所积累的辅导技巧,凝聚着他们在对敏捷辅导的真知灼见,每章还针对特定主题总结了在转型过程中教练和团队可能面对的障碍及其应对方案。 《敏捷教练:如何打造优秀的敏捷团队》具有较强的实用性和指导性,适合项目经理、技术总监和敏捷团队的所有成员阅读与参考。一起来看看 《敏捷教练》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具