Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:为什么在迭代时忽略序列的_len__;()呢?_Python_Loops_Sequence - Fatal编程技术网

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
方法来确定对象在条件下的计算结果是否为真。

您的回答没有解释如何解决问题-“您必须检查自己”,然后用这些信息做什么?