Python中是否有相关的没有长度的迭代?

在 Luciano Ramalho 的Fluent Python 中,可迭代对象被定义为在其中实现__iter__方法的对象,没有附加特征。

我目前正在为外行编写一个教程,其中我试图将 Python 的核心概念分块,以使编程对新手来说更易于管理。

当我将这些对象与“大小”的概念(因此也是length)联系起来时,我发现更容易解释可迭代对象及其对这些人的效用。通过说“可迭代对象是具有长度的对象”并因此与len函数相关联,我能够自然地使用常用类型(例如标准库listdicttuplestr以及numpy.ndarraypandas.Series和 )演化循环和迭代的概念pandas.DataFrame

但是,由于现在我知道该__iter__方法的唯一必要性,因此可能会出现与 类比len失败的情况。Ramalho 甚至在他的书中提供了一个即兴的例子:

import re
import reprlib

RE_WORD = re.compile(r'w+')


class Sentence:

    def __init__(self, text):
        self.text = text

    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)

    def __iter__(self):
        for match in RE_WORD.finditer(self.text):
            yield match.group()

正如预期的那样, 的任何实例Sentence都是可迭代的(我可以使用for循环),但len(Sentence('an example'))会引发TypeError.

由于上述所有对象都是可迭代对象__len__实现了一个方法,我想知道 Python 中是否有相关对象是可迭代对象 ( __iter__),但没有长度 ( __len__) 所以如果我能确定我是否只是在我的教程或制定一个不同的类比。

回答

文件没有长度:

>>> with open("test") as f:
...    print(len(f))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type '_io.TextIOWrapper' has no len()

像在 open 中那样遍历文件会遍历行,即由换行符分隔的文本块。要知道有多少行,必须完全读取文件,然后进行迭代——这取决于文件的大小,这可能需要很长时间,否则计算机可能会耗尽 RAM。


以上是Python中是否有相关的没有长度的迭代?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>