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.start
、x.stop
和 x.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 什么都没有的列表(相反,您必须手动处理一个索引为负的情况)。
我想知道下面的伪代码是否可行:
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.start
、x.stop
和 x.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 什么都没有的列表(相反,您必须手动处理一个索引为负的情况)。