Python数据类型之“序列概述与基本序列类型(Bas(2)

如果i的值比j大,则切片结果为空序列。

>>> s = (0,1,2,3,4,5,6,7,8,9) >>> len(s) 10 >>> s[6:12] (6, 7, 8, 9) >>> s[:5] (0, 1, 2, 3, 4) >>> s[5:] (5, 6, 7, 8, 9) >>> s[9:5] ()

如果步长k被指定,则切片结果中的元素为i,i+k,i+2k,i+3k,...到j的前一个元素停止。k的值不能为0,如果k为None则其值取1。

>>> s[1::2] (1, 3, 5, 7, 9) >>> s[0::2] (0, 2, 4, 6, 8) >>> s[0::0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: slice step cannot be zero

f) 连接不可变序列时总是会导致产生一个新的对象。这意味着通过重复连接构建序列将会在在总序列长度中具有二次运行时成本。要获得线性运行成本,必须切换到以下选项之一:

如果连接str对象,可以构建一个列表,并在结尾使用str.join()方法进行连接;或者写入io.String()实例并在完成时检索其值;

如果连接bytes对象,可以类似地使用bytes.join()方法或io.BytesIO,或者可以使用bytearray对象进行就地连接;bytearray是可以变的,并且具有有效的覆盖分配机制;

如果连接tuple对象,请使用扩展list的方式替代;

对于其他类型,请查看相关类文档;

g) 一些序列类型(例如 range)仅支持遵循特定模式的元素序列,因此不支持序列的连接和重复操作。

h) 对于s.index(x[, i[, j]])操作,当在序列s中找不到x元素时,index会抛出ValueError。另外,附加参数i,j允许对该序列的子序列进行有效的查找,这大致相当于s[i,j].index(x),但是不会拷贝任何数据且返回的索引值是相对于序列的开始位置而不是相对于切片的开始位置。

3.可变序列类支持的型操作

这里来说下可变序列类型支持,而不可变序列类型不支持的操作。在序列通用操作中主要说明的是“查”操作,这里要说的是可变序列的 "增"、“删”、“改”操作。

符号说明:

符号说明
s   表示一个可变序列类型的实例  
t   表示任何一个可迭代对象  
x   表示序列s中满足条件约束的任意类型的元素(例如,bytearray只接受满足0 <= x <=255约束的整型值)  

可变序列支持的操作及结果说明:

操作结果
s[i] = x   将序列s中小标为i的元素用x替换  
s[i:j] = t   将序列s中从i到j的切片用可迭代对象t的内容替换  
s[i:j:k] = t   s[i:j:k]中的元素用可迭代对象t的内容替换  
s *= n   更新序列s为s的n次重复的结果  
del s[i:j]   删除序列s中从i到j的切片,等价于 s[i:j] = []  
del s[i:j:k]   从序列s中删除s[i:j:k]中的元素  
s.pop() / s.pop(i)   获取序列s中下标为i的元素,并从序列s中删除该元素;i默认为-1,即默认删除并返回序列s的最后一个元素  
s.remove(x)   从序列s中移除第一个等于x(即:s[i] == x )的元素;如果x在序列s中不存在,则会抛出ValueError  
s.clear()   移除序列s中的所有元素,等价于 del s[:]  
s.append(x)   将x追加到序列s的末尾,等价于 s[len(s):len(s) = [x]]  
s.extend(t) or s+=t   将可迭代对象t中的元素拼接到序列s的末尾,大部分时候等价于 s[len(s):len(s)] = t  
s.insert(i,x)   在序列s中下标为i的位置插入x  
s.copy()   创建一个序列s的浅拷贝,等价于 s[:]  
s.reverse()   反转序列s中元素的位置,该方法直接对序列s本身做修改(可以节约空间),不会返回被反转后的序列  

注意:

a) 可变序列的clear()和copy()方法实在Python 3.3中新加的方法,是为了与dict、set这些不支持切片操作的容器所提供的接口保持一致性。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24d410b85e7f6a2f658f07e3275ec01d.html