小编典典

如何 len(generator())

all

Python
生成器
非常有用。与返回列表的函数相比,它们具有优势。但是,您可以len(list_returning_function()).
有办法len(generator_function())吗?

更新:
当然len(list(generator_function()))会工作.....
我正在尝试使用我在我正在创建的新生成器中创建的生成器。作为新生成器计算的一部分,它需要知道旧生成器的长度。但是,我想将它们与生成器相同的属性保持在一起,特别是
- 不要将整个列表保留在内存中,因为它可能 长。

更新 2:
假设生成器从第一步开始就 知道它的目标长度。 此外,没有理由维护len()语法。示例 - 如果 Python
中的函数是对象,我不能将长度分配给新生成器可以访问的该对象的变量吗?


阅读 83

收藏
2022-09-02

共1个答案

小编典典

生成器没有长度,毕竟它们不是集合。

生成器是 具有内部状态
(和花哨语法)的函数。您可以重复调用它们以获取一系列值,因此您可以在循环中使用它们。但是它们不包含任何元素,因此询问生成器的长度就像询问函数的长度一样。

如果 Python 中的函数是对象,我不能将长度分配给新生成器可以访问的该对象的变量吗?

函数是对象,但您不能为它们分配新属性。原因可能是为了使这样的基本对象尽可能高效。

但是,您可以简单地从函数中返回(generator, length)对,或者将生成器包装在一个简单的对象中,如下所示:

class GeneratorLen(object):
    def __init__(self, gen, length):
        self.gen = gen
        self.length = length

    def __len__(self): 
        return self.length

    def __iter__(self):
        return self.gen

g = some_generator()
h = GeneratorLen(g, 1)
print len(h), list(h)
2022-09-02