Python:为什么在迭代时忽略序列的_len__;()呢?
我想创建一个自定义的元素序列。迭代时,忽略序列的长度。下面是一个简单的代码示例:Python:为什么在迭代时忽略序列的_len__;()呢?,python,loops,sequence,Python,Loops,Sequence,我想创建一个自定义的元素序列。迭代时,忽略序列的长度。下面是一个简单的代码示例: class Test(): def __init__(self): pass def __len__(self): return 5 def __getitem__(self, idx): return idx t = Test() for i, x in enumerate(t): print(i, x) 我希望只打印出0 0
class Test():
def __init__(self):
pass
def __len__(self):
return 5
def __getitem__(self, idx):
return idx
t = Test()
for i, x in enumerate(t):
print(i, x)
我希望只打印出0 0
到4
。事实上,循环的行为就像一个无限长的序列,并持续不断len(t)
按预期返回5
我遗漏了什么?Python希望
\uuuu getitem\uuuu()
在请求超出可能范围的索引时引发索引器,如中所述:
注意对于
循环,将针对非法索引引发索引器
,以允许正确检测序列的结尾
这样做的好处是,您不必实现\uu len\uu()
,这意味着基于索引的iterable可能是惰性的,这意味着未知长度或无限长度是可能的
这反映了Python中for循环的工作方式-它们继续请求值,直到出现异常为止(StopIteration
,对于迭代器),这使得实现更容易-iter()
只需使用一个递增索引的循环进行包装,直到遇到异常为止。您必须检查自己,如果钥匙在界外<代码>\uuuu len\uuuu
仅用于两个目的。为了能够调用len(obj)并使用它,如果没有\uuu bool\uuuu
方法来确定对象在条件下的计算结果是否为真。您的回答没有解释如何解决问题-“您必须检查自己”,然后用这些信息做什么?