序列类型函数2—切片索引的扩展

来源:互联网 发布:新倩女幽魂在mac上玩 编辑:程序博客网 时间:2024/06/05 02:44
有这么一个问题:有一个字符串,我们想通过一个循环按照这样的形式显示它:每次都把
位于最后的一个字符砍掉,下面是实现这个要求的一种方法:
>>> s = 'abcde'
>>> i = -1
>>> for i in range(-1, -len(s), -1):
... print s[:i]
... abcd

abc

ab
a
可是,该如何在第一次迭代的时候显示整个字符串呢?是否有一种方法可以不用在整个循环之前加入一个额外的print 语句呢?我们该如何定义一个索引,来代表整个的序列呢?事实上在个以负数作为索引的例子里是没有一个真正能解决这个问题的方法的,因为-1 已经是“最小”的索引了.我们不可能用0 来作为索引值,因为这会切片到第一个元素之前而什么都不会显示:
>>> s[:0]
''
我们的方案是使用另一个小技巧:用None 作为索引值,这样一来就可以满足你的需要,比如说,在你想用一个变量作为索引来从第一个到遍历最后一个元素的时候:

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

现在这个程序符合我们的要求了。在进行下面的内容之前,必须指出,似乎还可以先创建一个只包含None 的列表,然后用extend()函数把range()的输出添加到这个列表,或者先建立range()输出组成的列表然后再把None 插入到这个列表的最前面,然后对这个列表进行遍历,但是可变对象的内建函数extend()根本就没有返回值,所以这个方法是行不通的:
>>> for i in [None].extend(range(-1, -len(s), -1)):
... print s[:i]
...
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: iteration over non-sequence

这个错误发生的原因是[None].extend(...)函数返回None , None 既不是序列类型也不是可迭代对象. 这种情况下使用上面提到的的列表连接操作来实现是唯一不需要添加额外代码的方法.

当然不用上述方法如此麻烦,正的索引可以到len(s)可以采用以下方法:

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

原创粉丝点击