python: return 列表方法以索引作为参数

python: return list method takes index as arguments

我想知道下面的伪代码是否可行:

def getLst(index = :):    
    lst = [1, 2, 3, 4, 5, 6, 7]
    return lst[index]


print getLst()
>> [1, 2, 3, 4, 5, 6, 7]

print getLst(2)
>> 3


print getLst(2:-2)
>> [3, 4, 5]

显然我遇到了语法错误。

该方法正在 class 中用于返回私有列表。

我知道下面的例子是可行的,它可能更正确(更容易 read/understand 代码),但是因为我已经有了做第一个例子的想法,所以这是不可能的我很好奇知道如何使第一个示例工作。

def getLst():    
    lst = [1, 2, 3, 4, 5, 6, 7]
    return lst


print getLst()
>> [1, 2, 3, 4, 5, 6, 7]

print getLst()[2]
>> 3

print getLst()[2:-2]
>> [3, 4, 5]

2:-2 表示法特定于数组订阅(即a[2:-2] 表达式)。如果您想接受该表示法,您可以做的最接近的事情就是实际使用整个表示法。这可以通过重载 __getitem__ 方法来完成(如果你想要负数,你也需要重载 __len__)。

class GetList:
    def __init__(self, l):
        self.l = l

    def __getitem__(self, x):
        return self.l[x]

    def __len__(self):
        return len(self.l)

其实a[2:4]a[slice(2,4,None)]的语法糖,a[2:-2]a[slice(2,len(a)-2,None)]的语法糖。然后,您当然可以使用 x.startx.stopx.step 检查 slice(假设它当然是一个片段)并根据它做任何您想做的事情。

如果您愿意,可以使用装饰器来启用使用订阅符号调用函数:

class subscrfunc:
    def __init__(self, f):
         self.f = f

    def __call__(self, x):
         return self.f(x)

    def __getitem__(self, x):
         return self.f(x)

    def __len__(self):
         return 0

@subscrfunc
def getLst(index):
    lst = [1, 2, 3, 4, 5, 6, 7]
    retur lst[index]

getLst[2:3]

请注意,虽然在切片中允许负数 stop 的黑客攻击是伪造长度为零,这将导致 getLst[2:-2] 将导致参数为 slice(2,-2,None),这是无稽之谈到一个 return 什么都没有的列表(相反,您必须手动处理一个索引为负的情况)。