文章目录
-
Py常用序列有列表、元组、字典、字符串、集合(虽然有人并不主张把字典和集合看作序列,但这不重要)
-
如图3-1。
-
生成器对象和 range、map、 enumerate、 filter、zip等对象的
某些用法类似序列,尽管这些对象更大的特点是惰性求值。 -
列表、元组、字符串等有序序列及range均支持双向索引,第一个元素下标为0,第二个元素下标为1,;
- 如果用负数作索引,则最后一个元素下标-1,
- 倒数第二个元素下标为-2
3.1列表:打了激素的数组
- 列表(list): 包含若干元素的有序连续内存空间。
- 列表增加或删除元素,自动进行内存的扩展或收缩,
- 从而保证相邻元素之间没缝隙。
- 内存自动管理功能可以大幅度减少程序员的负担,
- 但插入和删除非尾部元素时涉及列表中大量元素的移动,
- 严重影响效率。
- 在非尾部位置插入和删除元素时会改变该位置后面的元素在列表中的索引,这对于某些操作可能会导致意外的错误结果。
- 尽量从列表尾部进行元素的追加与删除
- 同一个列表中元素的数据类型可以各不相同,可以同时包含整数、实数、字符串等基本类型的元素,也可含列表、元组、字典、集合、函数以及其他任意对象。
- 如果只有一对方括号而没有任何元素则表示空列表。
- Python基于值的自动内存管理模式,变量并不直接存储值,而是存储值的引用或内存地址,这也是 python中变量可以随时改变类型的重要原因。
- Python列表中的元素也是值的引用,
- 所以列表中各元素可以是不同类型的数据。
- 列表的功能强大,但负担重,开销较大,
- 实际开发中,最好根据实际的问题选择一种合适的数据类型,尽量避免过多用列表
3.1.1列表创建与勵除
- list()函数把元组、 range对象、字符串、字典、集合或其他可迭代对象转换为列表。
- 字典转换为列表时默认将字典的“键”转换为列表,
- 如果想把字典的元素转换为列表,需用字典对象的Items()说明,
- 也可使用 values()说明要把字典的“值”转换为列表。
- 列表不再用,del将其删除,这一点适用于所有类型的Python对象
3.1.2 列表元素访问
3.1.3列表常用方法
- 列表、元组、字典、集合、字符串等序列有很多操作通用的,而不同类型的序列又有一些特有的方法或者支持某些特有的运算符和内置函数。
1. append()、 insert()、 extend()
- append()向列表尾部追加,
- Insert()向列表任意指定位置插入ー个元素,
- extend()将另一个列表中的所有元素追加至当前列表的尾部。
- 都原地操作,不影响列表对象在内存中的起始地址。
- 对长列表而言,Insert()在列表首部或中间位置插人元素时效率低
- 如果确实要在首部按序插入多个元素,
- 可先在尾部追加,然后用reverse()翻转,
- 或用标准库collections中的双端队列deque对象提供的appendleft()
2.pop()、 remove()、 clear()
- pop()用于删除并返回指定位置(默认最后一个)上的元素,如果指定的位置不是合法的索引则抛出异常,对空列表调用pop()方
也抛异常; - remove()删除列表中第一个值与指定值相等的元素,如果列表中
不存在该元素则抛出异常; - clear()用于清空列表中的所有元素。
- 这3也属原地操作,不影响列表对象的内存地址。
- del删除列表中指定位置的元素,也属于原地操作。
- 列表内存自动收缩和扩张,在列表中间位置插入或删除元素时,不仅效率较低,且该位置后面所有元素在列表中的索引也会发生变化,必须牢
牢记住这一点。
3. count()、 index()
- count()返回列表中指定元素出现的次数;
- index()返回指定元素在列表中首次出现的位置,如果该元素不在列表中则抛出异常。
- 列表对象的很多方法在特殊情况下会抛出异常,出现异常,整个程序就会崩溃。
- 为避免引发异常而导致程序崩溃,两种方法:①
- 用选择结构确保列表中存在指定元素再调用有关的方法
- 用异常处理结构。
- 用异常处理结构保证用户输人的是三位数,然后使用关键字in来测试用户输入的数字是否在列表中,如果存在则输出其索引,否则提示不
存在。
4.Sort()、 reverse()
- sort()按照指定的规则对所有元素排序,默认是从小到大升序
- reverse()将列表所有元素逆序或翻转
- 列表对象的sort()和 reverse()对列表原地排序(in- place sorting)和逆序,没有返回值。用处理后的数据替换原来的数据,列表首地址不变,列表中元素原来的顺序全部丢失。
- 如果不想丢失原来的顺序,可使用2.4.4节介绍的内置函数 sorted()和reversed()。
- 内置sorted()返回排序后的新列表
- 内置reversed()返回一个逆序后的 reversed对象。
5 copy()
- copy()返回列表的浅复制。
- 浅复制指生成一个新的列表,
- 且把原列表中所有元素的引用都复制到新列表中。
- 如果原列表中只包含整数、实数、复数等基本类型或元组、字符串这样的不可变类型的数据,一般是没有问题的。
- 但如果原列表中包含列表之类的可变数据类型,
- 由于浅复制时只是把子列表的引用复制到新列表中,于是修改任何一个都会影响另外一个。
here
3.1.7切片的强大功能
- 切片除适用于列表之外,还适用于元组、字符串、range
- 但列表的切片操作有最强大的功能
- 用切片来截取列表中的任何部分返回得到一个新列表
- 也可通过切片来修改和删除列表中部分元素
- 甚至可通过切片为列表对象增加元素
- start切片开始的位置,默认0
- end表示切片截止(但不包含)的位置(默认列表长度)
- step表示切片的步长(默认1)
- 当start为0时可省略,当end为列表长度时可省略,
- step为1时可省略,省略步长时还可同时省略最后一个冒号
- step为负整数时,表示反向切片,
- 这时start应在end右侧
1.使用切片获取列表的部分元素
- 切片返回列表中部分元素组成的新列表
- 与用索引作为下标访问列表元素不同,
- 切片不会因为下标越界而异常,
- 而简单在列表尾部截断或返回一个空列表
- 代码更健壮
2.使用切片为列表增加元素
- 用切片操作在列表任意位置插新元素,不影响列表对象的内存地址,属原地操作。
3.使用切片替换和修改列表中的元素
4.使用切片删除列表中的元素
- 也可用del与切片结合来删除列表中的部分元素,且切片元素可
不连续
5.切片得到的是列表的浅复制
- 3.1.3介绍列表的copy()时提到,切片返回的是列表元素的浅复制,
- 与列表对象的直接赋值并不一样,
- 和3.1.3介绍的深复制也有本质不同