回顾列表切片
listslice = [1,2,3,4,5,6,7,8,9,0]
print(listslice[1])
print(listslice[2:6])
print(listslice[2:6:2])
"""
2
[3, 4, 5, 6]
[3, 5]
"""
如上所示,列表中的数据可以通过下标的方式进行查找,可以查找指定下标范围内的数据,并且可以指定步进长度。
列表切片是如何实现的
列表切片在python3还是使用的getitem方法,所以在getitem方法里面还需要其它处理。要通过什么判断呢?
在“ __getitem__(self, item)”示例时,在只get一个数字的时候,返回值为整型,但是如果是由3个冒号分开的就不是整形了。
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self, item):
print(item,type(item))
return item
obj = Foo("Elon Musk",38)
obj[100]
obj[100:110:2]
"""
100 <class 'int'>
slice(100, 110, 2) <class 'slice'>
"""
可以看到,如果只是1个值,类型为“int”整型的,但是如果是用冒号隔开的3个值,则类型为“slice”切片型
其实相当于将这3个值封封装到一个对象里边了,然后将对象当成参数传入进类里边。
判断类型,指定操作
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self, item):
if type(item) == slice:
print("为切片类型,需要切片处理")
else:
print("非切片类型,直接下标索引处理")
obj = Foo("Elon Musk",38)
obj[100]
obj[100:110:2]
"""
非切片类型,直接下标索引处理
为切片类型,需要切片处理
"""
slice的类型的源码分析
class slice(object):
"""
slice(stop)
slice(start, stop[, step])
Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).
"""
......省略......省略......省略......省略......省略......省略......省略......省略......省略......
start = property(lambda self: 0)
""":type: int"""
step = property(lambda self: 0)
""":type: int"""
stop = property(lambda self: 0)
""":type: int"""
__hash__ = None
别的先不看,单看这个类是用于3个属性“start,step,stop”来定位切片的开始,结束与步进长度
使用__getitem__()实现切片的思路
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self, item):
if type(item) == slice:
print("为切片类型,需要切片处理")
print(item.start)
print(item.stop)
print(item.step)
else:
print(item.start)
print(item.stop)
print(item.step)
print("非切片类型,直接下标索引处理")
class Slice:
def __init__(self,start,stop,step):
self.start = start
self.stop = stop
self.step = step
obj = Slice(1,4,2)
obj1 = Foo("Elon Musk",38)
obj1[obj]
"""
1
4
2
非切片类型,直接下标索引处理
"""
更高级的玩法可以展开思路继续写