精简版:
我刚刚阅读了扩展切片并了解到可以将切片元组传递给__getitem__
:
a[::3, 1::3]
尽管如此,您不能将切片传递给任意函数(如果我错了,请纠正我),因此这将失败:
f(::3, 1::3)
有点麻烦的解决方法是调用slice
:
f(slice(None, None, 3), slice(1, None, 3))
1. 是否有像[]
列表、{}
字典和集合或()
生成器和元组这样的切片文字(理解)?(也许<start, end, step>
或其他)
2. 是否可以在整洁的切片符号中将切片传递给任意函数?
长版(TL;DR):
如果我想合并列表的不同切片,即找到这些切片的第一个不计算结果的元素,False
如果我可以将众所周知且非常简洁的切片表示法传递给这个函数,那就太好了。现在解决方案可能如下,但我不确定这是否不明智:
#! /usr/bin/python3.3
class Array(list):
class Coalescer:
def __init__(self, array):
self.array = array
def __getitem__(self, slices):
if not isinstance(slices, tuple):
slices = (slices,)
for s in slices:
for e in self.array[s]:
if e: return e
return None
@property
def coalesce(self):
return Array.Coalescer(self)
a = Array ([0, 0, 2, 0, 3, 4, 0, 5, 6])
print(a.coalesce[:]) #2
print(a.coalesce[::3]) #None
print(a.coalesce[1::3]) #3
print(a.coalesce[::3, 1::3]) #3
a [6] = 42
print(a.coalesce[::3, 1::3]) #42
恕我直言,这比a.coalesce(slice(None, None, 3), slice(1, None, 3))
甚至更具可读性coalesce(a, slice(None, None, 3), slice(1, None, 3))
。
3. 这是一个可行的选择还是如何不使用的坏例子__getitem__
?
4. 是否有 PEP 或其他文件提供指导何时以及如何覆盖__getitem__
,更重要的是何时不覆盖以及如何不覆盖?
5. 在您看来,哪种方法最适合实现一个合并有序切片列表的函数?
非常感谢。