Python - 序列


序列包括:字符串(普通字符串和 unicode 字符串)、列表和元组类型。

1. 序列类型操作符

1.1 成员关系操作符(in、not in)

成员关系操作符用来判断一个元素是否属于一个序列的。

  • 序列类型操作符

1.2 用步长索引来进行扩展的切片操作

>>> s = "abcdefgh"
>>> s[::-2]
'hfdb'
>>> s[::-1]  # 可以视作“翻转”操作
'hgfedcba'
>>> s[::2] # 隔一个取一个的操作
'aceg'
>>> s[-1] # 倒数第一个元素
'h'
>>> s[-len(s)] # 正数第一个元素
'a'

1.3 切片索引的更多内容

  • 开始和结束索引值可以超过序列的长度
>>> ('day','month','year')[-100:100]
('day', 'month', 'year')
  • 字符串切片输出问题

一个字符串,我们想通过一个循环,每次都把位于最后的一个字符砍掉。

>>> s = 'abcde'
>>> i = -1
>>> for i in range(-1,-len(s),-1):
...     print s[:i]
... 
abcd
abc
ab
a

上述方法,无法在第一次迭代时显示整个字符串,因为 -1 已经是“最小”的索引了,不可能用 0 作为索引值,因为这会到第一个元素之前而什么都不会显示。

>>> s[:0]
''

另一个技巧:用 None 作为索引值。

>>> s = 'abcdefgh'
>>> for i in [None] + range(-1,-len(s),-1):
...     print s[:i]
... 
abcde
abcd
abc
ab
a

看到这里,似乎还可以创建一个只包含 None 的列表,然后用 extend() 函数把 range() 的输出添加到这个列表里,然后对这个列表进行遍历。但是可变对象的内建函数 extend() 根本没有返回值,所以这个方法行不通:

>>> s = 'abcdefgh'
>>> for i in [None].extend(range(-1,-len(s),-1)):
...     print s[:i]
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

这个错误发生的原因是[None].extend(...)函数返回 None,None 既不是序列类型也不是可迭代对象。

>>> type(range(10))
<type 'list'>
>>> type([None] + range(0,10,2))
<type 'list'>
>>> type([None].extend(range(0,10,2)))
<type 'NoneType'>

2. 内建函数(BIF)

2.1 类型转换

内建函数 list()、str()和 tuple()被用做在各种序列类型之间转换。但实际上并没有进行任何的转换。这些转换实际上是工厂函数,将对象作为参数,并将其内容(浅)拷贝到新生成的对象中。

a = [1,2,[3,4],5]
c = tuple(a)
print a,c

a[2][1] = 7
print a,c

a[0] = 8
print a,c

print id(a),id(c)

输出结果:
[1, 2, [3, 4], 5] (1, 2, [3, 4], 5)
[1, 2, [3, 7], 5] (1, 2, [3, 7], 5)
[8, 2, [3, 7], 5] (1, 2, [3, 7], 5)
139781837486560 139781837769024
b  = (1,2,[3,4],5)
e = list(b)
print b,e

e[2][1] = 7
print b,e

e[0] = 8
print b,e
print id(b),id(e)

输出结果:
(1, 2, [3, 4], 5) [1, 2, [3, 4], 5]
(1, 2, [3, 7], 5) [1, 2, [3, 7], 5]
(1, 2, [3, 7], 5) [8, 2, [3, 7], 5]
139781837570480 139781837530608

因为一单一个 Python 的对象被建立,我们就不能更改其身份或类型了,所以不能简单的把一个对象转换成另一个对象。如果把一个列表对象传给list()函数,便会创建这个对象的一个浅拷贝,然后将其插入新的列表中。在做连接操作和重复操作时,也会这样处理。
浅拷贝就是只拷贝了对对象的索引,而不是重新建立了一个对象。

2.2 可操作性

下图为序列类型可用的内建函数。len()、reversed()和 sum()函数只能接受序列类型对象作为参数,剩下的还可以接受可迭代对象作为参数。max()和min()函数也可以接受一个参数列表。

[参考文献]

  1. 《Python 核心编程(第二版)》
posted @ 2020-03-11 00:41  SXISZERO  阅读(364)  评论(0编辑  收藏  举报