【问题标题】:What is "generator object" in django?django 中的“生成器对象”是什么?
【发布时间】:2009-04-22 07:41:35
【问题描述】:

我正在使用 Django 投票包,当我在 shell 中使用 get_top() 方法时,它返回类似 "generator object at 0x022f7AD0 的东西,我以前从未见过这样的东西,怎么办你访问它,它是什么?

我的代码:

v=Vote.objects.get_top(myModel, limit=10, reversed=False)
print v
<generator object at 0x022f7AD0>

注意:我认为 get_top 只会返回一个不错的 myModel 列表,我可以执行类似 v.name 等操作

【问题讨论】:

    标签: python generator


    【解决方案1】:

    如果你想要一个列表,只需在你的生成器对象上调用 list()。

    python 中的生成器对象类似于惰性列表。只有在您迭代它们时才会评估这些元素。 (因此它的调用列表会评估所有这些。)

    例如你可以这样做:

    >>> def f(x):
    ...  print "yay!"
    ...  return 2 * x
    >>> g = (f(i) for i in xrange(3))    # generator comprehension syntax
    >>> g
    <generator object <genexpr> at 0x37b6c0>
    
    >>> for j in g: print j
    ... 
    yay!
    0
    yay!
    2
    yay!
    4
    

    只有在迭代 f 时才能查看 f 是如何计算的。你可以在这里找到关于这个主题的优秀材料:http://www.dabeaz.com/generators/

    【讨论】:

      【解决方案2】:

      生成器是一种迭代器。迭代器是一种可迭代对象,与任何其他可迭代对象一样,

      您可以使用 for 循环遍历每个项目:

      for vote in Vote.objects.get_top(myModel, limit=10, reversed=False):
          print v.name, vote
      

      如果需要按索引访问项目,可以将其转换为列表:

      top_votes = list(Vote.objects.get_top(myModel, limit=10, reversed=False))
      print top_votes[0]
      

      但是,您只能对迭代器的特定实例进行一次迭代(与更通用的可迭代对象不同,如列表):

      >>> top_votes_generator = Vote.objects.get_top(myModel, limit=3)
      >>> top_votes_generator
      <generator object at 0x022f7AD0>
      >>> list(top_votes_generator)
      [<Vote: a>, <Vote: b>, <Vote: c>]
      >>> list(top_votes_generator)
      []
      

      有关创建自己的生成器的更多信息,请参阅http://docs.python.org/tutorial/classes.html#generators

      【讨论】:

        【解决方案3】:

        嗯嗯

        我已经阅读了thisthis,现在一切都很清楚了;

        实际上我可以通过这样做将生成器转换为列表

        mylist=list(myGenerator)
        

        【讨论】:

        • 但是不推荐这种方案,因为我们失去了发电机的任何高效优势。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 2020-07-26
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        相关资源
        最近更新 更多