欢迎光临散文网 会员登陆 & 注册

Fluent Python —— 神奇的元组(tuple)

2023-03-15 18:07 作者:Mor_pheus  | 我要投稿

在Python中,基本类型大致可以归为三类:序列映射集合

而在内置序列数据中,又可以更细分为容器序列扁平序列

这节,我们来了解同为容器序列的元组(tuple)。

当我们打算去使用元组中存储的元素信息时,我们需要对其进行先拆分再分别获取,这一个过程便称之为【元组拆包】,同样的,这一个概念可以应用到所有的可迭代对象上(如列表、字典等)。元组拆包的方式有很多种:平行赋值、星号、占位符等。

  • 平行赋值

  • 星号

  • 占位符(可能会与国际化gettext别名冲突)

需要注意的是:被可迭代对象中的元素数量一定要和接受这些元素的元组的空档数一致。

接下来引入【具名元组】。

通过具名元组构造的实例和元组相比,所消耗的内存一样,但是具名元组赋予了元组中存放内容的名字,更加便于我们管理。

  • 具名元组的构造

  • 具名元组特有属性与方法

聊聊切片与增量赋值

切片,顾名思义。就是通过控制下标的范围,来获取序列类型中我们所需要的这一部分,就好比吃汉堡的时候,你想先吃中间的肉饼而不是两端的面包片那样,切片,也有两把无形的刀来控制着这样的范围。这节,主要来了解切片的一些特性。


为什么切片或者区间的会忽略最后一个元素?

不知道大家有没有注意过,在Python中不论是切片还是循环时的区间,都默认是忽略最后一个元素。这是为什么呢?

Dijkstra老爷子给出了过这样一篇论证:Why numbering start at zero?

如果下端为开区间:那么如果需要取自然数序列,我们还需要引入-1,不美观。

如果上端为闭区间:那么下一个子序列取开头的时候,就重复了,也不美观。

总结:不美观。

关于增量赋值

如果对不可变序列使用重复拼接操作,那么效率会很低,因为每次都有一个新对象,而解释器需要把原来对象中的元素先复制到新的对象里,然后再追加新的元素。

str的拼接是一个例外,因为对字符串作拼接太普遍了,所以CPython对此作了优化

一道选择题:

答案选d,因为增量赋值并不是原子操作!

所以最好不要将可变对象放入元组中。

当列表不再是首选时...

  • 数据array

    用于浮点数的存储和计算

  • 内存视图memoryview

    内存视图实际上就是泛化的,去数学化的Numpy数组,我们可以通过改变数组中的一个字节来更新数组的值,如下图所示,注意在内存中,数值的存储方式是补码。

  • 队列家族

    deque、LiFoQueue、PriorityQueue

    deque如果满员,新增元素会挤占旧元素的空间

    - 而Queue、LifoQueue、PriorityQueue,这些类不会扔掉旧的元素来腾出位置,如果队列满了,它将会锁住,直到另外的线程移除了某个元素而腾出了位置,因此这个特性十分适合用来控制活跃线程的数量。

下一节,我们将进入集合与字典。

Fluent Python —— 神奇的元组(tuple)的评论 (共 条)

分享到微博请遵守国家法律