【Python 3这件小事】2.内置数据类型(二)——列表和元组
(接上文)
2.4 列表
Python 中的列表更像 Java 中的数组(尽管可以把列表当做生命中所需要的一切来使用)。一个更好的比喻可能是 ArrayList
类,该类可以容纳任何对象,并可在添加新元素时进行动态拓展。
在布尔类型上下文环境中,空列表为假值。任何至少包含一个以上元素的列表为真值。
2.4.1 创建列表
1.列表是元素的有序集合,用【】将各个元素括起来。
2.列表的首个元素为list[0]。
3.使用负索引值可从列表的尾部向前计数访问元素。如list[-1]就表示列表的倒数第一个元素。
4.如果负数令你混淆,可将其视为如下方式: a_list[-n] == a_list[len(a_list) - n]
。因此在此列表中, a_list[-3] == a_list[5 - 3] == a_list[2]
。
2.4.2 列表切片
1.通过指定两个索引值,可以从列表中获取称作“切片”的某个部分。返回值是一个新列表,它包含列表中所有元素,按顺序从第一个切片索引开始(本例中为 a_list[1]
),截止但不包含第二个切片索引。换句话说,第二个索引值是第一个不想到达的索引。
2.如果左切片索引为零,可以将其留空而将零隐去。因此 a_list[:3]
与 a_list[0:3]
是完全相同的,因为起点 0 被隐去了。
3.如果两个切片索引都留空,那么将包括列表所有的元素。但该返回值与最初的 a_list 变量并不一样。它是一个新列表,只不过恰好拥有完全相同的元素而已。a_list[:]
是对列表进行复制的一条捷径。
2.4.3 向列表中新增项
有四种方法可以完成向列表中新增项的工作:
1.+ 运算符: 连接列表以创建一个新列表。列表可包含任何数量的元素;没有大小限制(除了可用内存的限制)。
2.append()
方法:向列表的尾部添加一个新的元素。
3.extend()
方法:只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。
4.insert()
方法:将单个元素插入到列表中。第一个参数是列表中将被顶离原位的第一个元素的位置索引。如:a_list.insert(0,'Ω')
注意:
1.列表中的元素并不一定要是唯一的。
2.append()方法和extend()方法的区别:append方法接受的参数可以是任意类型,并把这个接受的参数当作一个元素插入到列表中,extend方法接受的参数必须是列表,并且将参数列表中的每个元素添加到原来的列表中去,这就是“加入”和“扩展”的区别。
2.4.4 在列表中检索值
1. count()
方法:返回了列表中某个特定值出现的次数。
2.in
运算符:判断某个值是否在列表中出现,返回 True
或 False
;它不会告诉你该值出现在什么位置。
3. index()
方法:返回某个值在列表中的精确位置。尽管可以通过第二个参数(以 0 为基点的)索引值来指定起点,通过第三个参数(以 0 基点的)索引来指定搜索终点,但缺省情况下它将搜索整个列表。
4.index()
方法将查找某值在列表中的第一次出现。在该情况下,'new'
在列表中出现了两次,分别为 a_list[2]
和 a_list[4]
,但 index()
方法将只返回第一次出现的位置索引值。
5.如果在列表中没有找到该值,index()
方法将会引发一个例外。有别于其他的一些语言(如Java),它不会返回一个值如-1.
2.4.5 从列表中删除元素
也有几种方法可从列表中删除元素。
1.del语句:可使用 del
语句从列表中删除某个特定元素。如:del list[1]。删除索引 1
之后再访问索引 1
将 不会 导致错误。被删除元素之后的所有元素将移动它们的位置以“填补”被删除元素所产生的“缝隙”。
2.remove()
方法:通过值而不是索引删除元素(del 语句通过索引,remove方法通过值)。remove()
方法接受一个 value 参数,并删除列表中该值的第一次出现。
3.pop():如果不带参数调用, pop()
列表方法将删除列表中最后的元素,并返回所删除的值。相当于出栈操作。可以从列表中 pop[弹出]任何元素。只需传给 pop()
方法一个位置索引值。对空列表调用 pop()
将会引发一个例外。
2.5 元组
元组 是不可变的列表。一旦创建之后,用任何方法都不可以修改元素。
在布尔类型上下文环境中,空元组为假值。任何至少包含一个上元素的元组为真值。元素的值无关紧要。
1.元组的定义方式和列表相同,除了整个元素的集合都用圆括号(),而不是方括号【】闭合。对比列表和元组:【】和()。
2.元组和列表的主要区别是元组不能进行修改。其余的如index、切片等操作都是一致的。
那么元组有什么好处呢?
- 元组的速度比列表更快。如果定义了一系列常量值,而所需做的仅是对它进行遍历,那么请使用元组替代列表。
- 对不需要改变的数据进行“写保护”将使得代码更加安全。使用元组替代列表就像是有一条隐含的
assert
语句显示该数据是常量,特别的想法(及特别的功能)必须重写。 - 一些元组可用作字典键(特别是包含字符串、数值和其它元组这样的不可变数据的元组)。列表永远不能当做字典键使用,因为列表不是不可变的。
元组的特殊操作:同时赋多个值
>>> v = ('a', 2, True) >>> (x, y, z) = v >>> x 'a' >>> y 2 >>> z True
v 是一个三元素的元组,而 (x, y, z)
是包含三个变量的元组。将其中一个赋值给另一个将会把 v 中的每个值按顺序赋值给每一个变量。