【问题标题】:Python : simple code gives "generator object", why? [duplicate]Python:简单的代码给出了“生成器对象”,为什么? [复制]
【发布时间】:2021-11-28 18:00:25
【问题描述】:

我正在尝试以“pythonic 方式”学习编码。

原始代码正在运行,结果并显示预期结果。 新代码给出:“”。那为什么?

原码:

a={
    'AA':-5,
    'BB':-8,
    'C':15,
    'D':-85,
    'E':24
}

for i in a.values():
    if i<0:
        print(i)

新代码:

a={
    'AA':-5,
    'BB':-8,
    'C':15,
    'D':-85,
    'E':24
}
        
print(i for i in a.values() if i<0 )

谢谢!

【问题讨论】:

  • 因为括号之间的代码是生成器表达式:python.org/dev/peps/pep-0289
  • 谢谢你们!
  • 为什么你认为它应该提供其他东西?您是从哪里学习到这种语法的,它告诉您它是如何工作的?

标签: python


【解决方案1】:

i for i in a.values() if i&lt;0 是一个生成器——它不会解析为一系列值,除非有东西对其进行迭代。出于解析原因,如果不将生成器括在分组括号中,则不能单独使用生成器

>>> i for i in a.values() if i<0
  File "<stdin>", line 1
    i for i in a.values() if i<0
      ^
SyntaxError: invalid syntax
>>> (i for i in a.values() if i<0)
<generator object <genexpr> at 0x7f2a54b3ac80>

print 只接受对象的字符串表示。它不会尝试迭代它们。所以,你得到了生成器本身的字符串表示。其他对象则不同 - 例如列表和元组,确实迭代它们的初始化值。

>>> list(i for i in a.values() if i<0)
[-5, -8, -85]
>>> tuple(i for i in a.values() if i<0)
(-5, -8, -85)

列表推导式做同样的事情 - 使用相同的生成器语义构建列表

>>> [i for i in a.values() if i<0]
[-5, -8, -85]

【讨论】:

  • 非常感谢!我正在寻找这个解决方案列表:ist(i for i in a.values() if i
【解决方案2】:

在您的打印语句中写入的表达式是generator expression。在您的原始代码中,您遍历字典中的每个键值对并打​​印该值。在您的新代码中,您尝试打印该表达式的结果,该表达式是一个对象,而不是一系列打印语句。

【讨论】:

  • 非常感谢!
【解决方案3】:

要打印出由换行符分隔的生成器的值,您可以使用.join 方法,该方法将通过将生成器的每个元素与换行符连接起来来创建一个字符串(请注意,生成器中的值必须是字符串(在这种情况下,它们需要显式转换)):

print('\n'.join(str(i) for i in a.values() if i < 0))

【讨论】:

  • print(*(i for i in a.values() if i &lt; 0), sep="\n")
  • 列表理解也是一个不错的选择吗?这是我倾向于做的,因为它看起来更干净/更简单:[print(i) for i in a.values() if i
  • @Mandias 没有意义,它只是创建了一个包含一堆 None 元素的列表,授予它还将执行打印功能并打印i,但这不是列表理解的方式应该使用,然后坚持常规for loop
  • @Mandias 这行得通,但是如果值的数量对于打印列表中每个项目的简单操作来说很大,那么列表可能会变得不必要地大(从而使其变慢)。打印后,python 会丢弃大量您一开始不需要创建的 (None) 值。
  • @AlanBagel 对第一条评论:是的,这也是可能的,但是,我感觉它有点慢;对于第二条评论:该列表可能会立即收集垃圾,因此如果以这种方式使用它,我不会太担心空间(虽然它会暂时占用很多空间),更多的是它不是应该使用,而且由于多个print,它会更慢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2016-12-25
  • 2018-12-18
  • 2016-11-09
  • 1970-01-01
相关资源
最近更新 更多