Python切片如何,我知道Python切片,但我怎么可以使用内置的切片对象呢?

内置函数slice什么用处,我该如何使用它?
Pythonic切片的直接方式我知道 – l1[start:stop:step] 。 我想知道如果我有一个切片对象,那么我如何使用它?

你可以通过调用slice来创build一个slice,如果你使用[start:end:step]表示法,你可以使用相同的字段:

 sl = slice(0,4) 

要使用切片,只需将它作为索引传递给列表或string即可:

 >>> s = "ABCDEFGHIJKL" >>> sl = slice(0,4) >>> print s[sl] 'ABCD' 

假设您有一个固定长度的文本字段的文件。 您可以定义切片列表,以便轻松从该文件中的每个“logging”中提取值。

 data = """\ 0010GEORGE JETSON 12345 SPACESHIP ST HOUSTON TX 0020WILE E COYOTE 312 ACME BLVD TUCSON AZ 0030FRED FLINTSTONE 246 GRANITE LANE BEDROCK CA 0040JONNY QUEST 31416 SCIENCE AVE PALO ALTO CA""".splitlines() fieldslices = [slice(*fielddef) for fielddef in [ (0,4), (4, 21), (21,42), (42,56), (56,58), ]] fields = "id name address city state".split() for rec in data: for field,sl in zip(fields, fieldslices): print field, ':', rec[sl] print 

打印:

 id : 0010 name : GEORGE JETSON address : 12345 SPACESHIP ST city : HOUSTON state : TX id : 0020 name : WILE E COYOTE address : 312 ACME BLVD city : TUCSON state : AZ id : 0030 name : FRED FLINTSTONE address : 246 GRANITE LANE city : BEDROCK state : CA id : 0040 name : JONNY QUEST address : 31416 SCIENCE AVE city : PALO ALTO state : CA 

顺序后的方括号表示索引或切片,取决于括号内的内容:

 >>> "Python rocks"[1] # index 'y' >>> "Python rocks"[1:10:2] # slice 'yhnrc' 

这两种情况都由序列的__getitem__()方法处理(或者如果在等号的左侧,则为__setitem__() )。索引或切片作为单个parameter passing给方法,Python执行此操作的方式是通过将切片符号(在这种情况下为1:10:2 )转换为切片对象: slice(1,10,2)

所以,如果你正在定义你自己的序列类或重写另一个类的__getitem____setitem____delitem__方法,你需要testing索引参数来确定它是一个int还是一个slice ,并相应地处理:

 def __getitem__(self, index): if isinstance(index, int): ... # process index as an integer elif isinstance(index, slice): start, stop, step = index.indices(len(self)) # index is a slice ... # process slice else: raise TypeError("index must be int or slice") 

一个slice对象有三个属性: startstopstep ,以及一个方法: indices ,它采用一个参数,对象的长度,并返回一个三元组:( (start, stop, step)

 >>> class sl: ... def __getitem__(self, *keys): print keys ... >>> s = sl() >>> s[1:3:5] (slice(1, 3, 5),) >>> s[1:2:3, 1, 4:5] ((slice(1, 2, 3), 1, slice(4, 5, None)),) >>> 

slice函数返回切片对象 。 切片对象是Python的内部types之一,它为读取性能而优化 – 它们的所有属性都是只读的。

如果希望更改默认行为,则更改slice可能会很有用。 例如, lxml使用切片符号来访问DOM元素(但是,我还没有证实他们自己是如何做的)。