如何len(generator())

发布于 2021-01-29 19:36:03

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

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

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

关注者
0
被浏览
204
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    生成器是 具有内部状态 (和精美语法)的 函数
    。您可以反复调用它们以获得值序列,因此可以循环使用它们。但是它们不包含任何元素,因此,要求生成器的长度就像要求函数的长度一样。

    如果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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看