【流畅的python】系列——python数据结构之序列2

文章内容接上篇

三、切片

《流畅的python》的第2章中,对于切片的简单用法,只是一带而过:

在 Python 里,像列表(list)、元组(tuple)和字符串(str)这类序列类型都支持切片操作,但是实际上切片操作比人们所想象的要强大很多。

文中,主要讲了切片的3个方面:

1.为什么在python中,切片和区间会忽略最后一个元素(即左闭右开)

2.对象的切片

3.给切片赋值

另外,还提及了多维切片和省略

3.1、为什么在python中,切片和区间会忽略最后一个元素(即左闭右开)

在切片和区间操作里不包含区间范围的最后一个元素是 Python 的风格,这个习惯符合Python、C 和其他语言里以 0 作为起始下标的传统。这样做带来的好处如下。
1.当只有最后一个位置信息时,我们也可以快速看出切片和区间里有几个元素:range(3) 和 my_list[:3] 都返回 3 个元素。
2.当起止位置信息都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去第一个下标(stop - start)即可。
3.这样做也让我们可以利用任意一个下标来把序列分割成不重叠的两部分,只要写成my_list[:x] 和 my_list[x:] 就可以了

3.2、对对象切片

我们还可以用 s[a:b:c] 的形式对 s 在 a 和 b 之间以 c 为间隔取值。c 的值还可以为负,负值意味着反向取值。

也就是说,c为步长。

>>> s = ‘bicycle‘
>>> s[::3]
‘bye‘
>>> s[::-1]
‘elcycib‘
>>> s[::-2]
‘eccb‘

3.3、给切片赋值

如果把切片放在赋值语句的左边,或把它作为 del 操作的对象,我们就可以对序列进行嫁接、切除或就地修改操作。

>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[2:5] = [20, 30]
>>> l
[0, 1, 20, 30, 5, 6, 7, 8, 9]
>>> del l[5:7]
>>> l
[0, 1, 20, 30, 5, 8, 9]
>>> l[3::2] = [11, 22]
>>> l
[0, 1, 20, 11, 5, 22, 9]
>>> l[2:5] = 100
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> l[2:5] = [100]
>>> l
[0, 1, 100, 22, 9]

四、对序列使用+和*

Python 程序员会默认序列是支持 + 和 * 操作的。通常 + 号两侧的序列由相同类型的数据所构成,在拼接的过程中,两个被操作的序列都不会被修改,Python 会新建一个包含同样类型数据的序列来作为拼接的结果。

划重点就是:

+ 和 * 都遵循这个规律,不修改原有的操作对象,而是构建一个全新的

>>> l = [1, 2, 3]
>>> l * 5
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> 5 * ‘abcd‘
‘abcdabcdabcdabcdabcd‘

五、序列的增量赋值

增量赋值运算符 += 和 *= 的表现取决于它们的第一个操作对象。简单起见,我们把讨论集中在增量加法(+=)上,但是这些概念对 *= 和其他增量运算符来说都是一样的。
+= 背后的特殊方法是 __iadd__ (用于“就地加法”)。但是如果一个类没有实现这个方法的话,Python 会退一步调用 __add__ 。考虑下面这个简单的表达式:

>>> a += b

如果 a 实现了 __iadd__ 方法,就会调用这个方法。同时对可变序列(例如list、bytearray 和 array.array)来说,a 会就地改动,就像调用了 a.extend(b)一样。但是如果 a 没有实现 __iadd__ 的话,a += b 这个表达式的效果就变得跟 a = a+ b 一样了:首先计算 a + b,得到一个新的对象,然后赋值给 a。也就是说,在这个表达式中,变量名会不会被关联到新的对象,完全取决于这个类型有没有实 __iadd__ 这个方法。
总体来讲,可变序列一般都实现 __iadd__ 方法,因此 += 是就地加法。而不可变序列根本就不支持这个操作,对这个方法的实现也就无从谈起。
上面所说的这些关于 += 的概念也适用于 *=,不同的是,后者相对应的是 __imul__。关于 __iadd__ 和 __imul__,第 13 章中会再次提及。

书中的这段原话,揭示了在python中,a += b 和 a = a + b 是有区别的。

六、 排序

list.sort 方法会就地排序列表,也就是说不会把原列表复制一份。

内置函数 sorted,它会新建一个列表作为返回值。这个方法可以接受任何形式的可迭代对象作为参数,甚至包括不可变序列或生成器(见第 14 章)。而不管 sorted 接受的是怎样的参数,它最后都会返回一个列表

两个可选的参数

reverse 和key

reverse这个参数的默认值是False,但如果你把它设置成True,那么,就会以降序的形式输出。

key这个参数表示以什么标准来排序,比如,可以是 key = str.lower,也可以是key = len 等等

七、用bisect来管理已排序的

这个小节没看懂,就不多说了

八、array.array ,memoryview,numpy,collections.deque

array用来存放数字,比list更高效,因为 array.array在底层存储的是字节表述。

另外,数组还提供从文件读取和存入文件的更快的方法,如 .frombytes 和 .tofile。

memoryview能让用户在不复制内容的情况下操作同一个数组的不同切片。是一个内置类

numpy库是一个非常优秀的第三方库,是学习pandas库的基础。

第二章就简单的到这里了,有些知识点我也没怎么看懂,可能将来用到了才会懂吧

原文地址:https://www.cnblogs.com/tianyafu/p/10227286.html

时间: 2024-08-29 23:41:56

【流畅的python】系列——python数据结构之序列2的相关文章

Python语言之数据结构1(序列--列表,元组,字符串)

0.序列 列表,元组,字符串都是序列. 序列有两个特点:索引操作符和切片操作符.索引操作符让我们可以从序列中抓取一个特定项目.切片操作符让我们能够获取序列的一个切片,即一部分序列. 以字符串为例: 1 str="01 3456 89?" 2 3 print( str[0] ) #'0',索引 4 print( str[1:5] ) #'1 34 ',切片 5 print( str[5:1:-1] ) #'543 ' 6 print( str[1:5:-1] ) #output a '\

Python系列-python内置函数

abs(x) 返回数字的绝对值,参数可以是整数.也可以是浮点数.如果是复数,则返回它的大小 all(iterable) 对参数中的所有元素进行迭代,如果所有的元素都是True,则返回True,函数等价于 def any(iterable): for element in iterable: if element: return True return False any(iterable) 对参数中的所有元素进行迭代判断,只要一个元素为真,函数返回True.函数等价于 def any(itera

Python数据结构之序列

在Python中,最基本的数据结构为序列(sequence).序列中的每个元素都有编号,即其位置或索引,其中第一个元素的索引为0,第二个元素的索引为1,依此类推. Python包含6种内建的序列:字符串,Unicode字符串,列表,元组,buffer对象和xrang对象. 有几种操作适用于所有序列,包括索引.切片.相加.相乘和成员资格检查.另外,Python还提供了一些内置函数,可用于确定序列的长度以及找出序列中最大和最小的元素. 迭代. 原文地址:https://www.cnblogs.com

Python数据结构之序列及其操作

数据结构是计算机存储,组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 在Python中,最基本的数据结构为序列(sequence).序列中的每个元素都有编号:从0开始递增,即其位置或索引,其中第一个元素的索引为0,第二个元素的索引为1,依此类推.最后一个元素的位置为-1. Python包含6种内建的序列:字符串,Unicode字符串,列表,元组,buffer对象和xrang对象. 字符串 与数字一样,字符串也是值,用单引号或双引号括起来.'Hello world!'

Python系列教程大汇总

Python初级教程 Python快速教程 (手册) Python基础01 Hello World! Python基础02 基本数据类型 Python基础03 序列 Python基础04 运算 Python基础05 缩进和选择 Python基础06 循环 Python基础07 函数 Python基础08 面向对象的基本概念 Python基础09 面向对象的进一步拓展 Python基础10 反过头来看看 Python补充01 序列的方法 Python中级教程 Python进阶01 词典 Pytho

Python的核心数据结构

数据结构 例子 数字 1234,3.1415,3+4j 字符串 'spam'."grace's" 列表 [1,[2,'three'],4] 字典 {'food':'spam','taste':'yum'} 元组 (1,'spam',43,'AB') 文件 file = open('eggs','r') 集合 set('abc'),{'a','b','c'} 其他类型 None,布尔型 数字 数字类型: 整数:没有小数部分的整数 浮点数:后面有小数部分的数字 其他:有虚部的复数.固定精度

Python基础之数据结构

Python中最基本的数据结构是序列,包括6种内建的序列,列表.元祖.字符串.Unicode字符串.buffer对象.xrange对象. 而列表和元组的主要区别在于,列表可以修改而元组不能修改. 通用的序列操作: 索引 实验一: a = 'nihao' 则a[0] 输出 'n' a[-1] 则输出'o' 索引0指向第一个元素,索引可以是负数,索引-1则指向倒数第一个元素 分片 和索引是类似的,索引是访问单个元素,分片则可以访问一定范围的元素.分片通过冒号隔开的两个索引实现,两个索引代表边界元素,

Python系列英文原版电子书

[专题推荐]Python系列英文原版电子书 http://down.51cto.com/zt/104 python简明教程(CHM) http://down.51cto.com/data/49213 Linux黑客的python编程之道[pdf]推荐 http://down.51cto.com/data/417453 python编程实例 http://down.51cto.com/data/132975 python标准库中文版PDF(带章节书签) http://down.51cto.com/

Python基础(3) 序列和词典

Python中最基本的数据结构是序列,序列中的每个元素被分配了一个序号即元素位置,也叫索引(从0开始),最后一个元素也可以标记位-1. 序列的元素可以是之前讲的所有基础数据类型,也可以是另一个序列,还可以是对象(后面介绍). 最常用的序列有两类:元素(tuple)和列表(list).两者的区别:列表可修改而元组不行. 1 列表 1.1 访问列表 通过下标,格式:[idx1][idx2][idx3] animal = ['Dog', 'Cat', 'Pig', ['Duck', 'Chicken'