【问题标题】:python: return list method takes index as argumentspython:返回列表方法将索引作为参数
【发布时间】:2015-11-18 21:48:31
【问题描述】:

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

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]

显然我遇到了 SyntaxError。

该方法在类中用于返回一个私有列表。

我知道下面的例子是可能的,而且它可能更正确(更容易阅读/理解代码),但是因为我有做第一个例子的想法,所以我不太可能好奇知道如何使第一个示例工作。

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]

【问题讨论】:

  • 这在函数头中是不可能的,你可以将开始和结束参数传递给你的函数。getLst(start,end)
  • c[a:b] 如果c.index[a] == c.index[b]c.index[a] > c.index[b] 你得到了[ ] 的答案

标签: python list function methods arguments


【解决方案1】:

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),这对于一个不会返回任何内容的列表来说是无意义的(相反,您必须手动处理一个索引为负数的情况。

【讨论】:

  • 似乎不可能让它完全按照我的意愿工作。但我认为你的回复是最好的答案——至少我已经获得了一些使用 slice、callgetitemlen 的经验。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 2021-12-17
  • 2021-04-19
  • 2020-12-30
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多