【问题标题】:Get an error: <generator object <genexpr> at 0x0000000002731828> using PyDev得到一个错误:<generator object <genexpr> at 0x0000000002731828> 使用 PyDev
【发布时间】:2018-05-11 00:00:14
【问题描述】:

我收到一个简单打印语句的错误,可能是什么错误,已更改为浮动并尝试但仍然存在错误。

if __name__ == '__main__':
    print (i*i for i in range(5))

错误:

<generator object <genexpr> at 0x0000000002731828>

提前谢谢...

【问题讨论】:

  • 不是我的朋友,只有这个“ at 0x0000000002731828>”
  • 这是不是错误。该语句返回一个生成器。你想做什么?
  • 在 Windows 64 位操作系统上使用 Python 3.3
  • 您将对象表示与异常混淆了。这是 Python 告诉你你刚刚创建了一个generator expression
  • 我怎样才能看到这样的结果 [0 1 4 9 16]?谢谢

标签: python pydev


【解决方案1】:

没有错误。我认为您只是想打印一个列表。使用[] 获取列表而不是生成器:

if __name__ == '__main__':
    print([i*i for i in range(5)])

输出:

[0, 1, 4, 9, 16]

要在单独的行上打印,您可以:

if __name__ == '__main__':
    print('\n'.join([str(i*i) for i in range(5)]))

这使用'delimiter'.join(list) 方法将列表的所有元素与指定的分隔符连接起来(在本例中为换行符:\n

输出:

0
1
4
9
16

或者按照@MartijnPieters 的建议(仅适用于 python3),您也可以这样做:

print(*(i*i for i in range(5)), sep='\n')

【讨论】:

  • @MartijnPieters,对。太感谢了。很难跟踪小但重要的错误:)
  • 另一个提示:您也可以使用print(*(i*i for i in range(5)), sep='\n') 来获得相同的输出。
  • 你的加入版本将工作,但是,如果不添加str()调用:print('\n'.join([str(i*i) for i in range(5)]))
  • @MartijnPieters,是的,python3 打印风格。谢谢你。我已经根据两个 cmets 更新了答案。
  • 感谢@MartijnPieters 最近从 XP 到 64 位 windows 安装了一个新系统,所以安装了 Python 3.3,这就是所有混乱的原因,现在我必须学习最新版本的 Python 语法......谢谢你的时间...
【解决方案2】:

在 Python 3 中,print() 是一个函数,而不是语句。

生成器表达式类似于列表推导式,除了它创建的对象在您迭代它时产生结果,而不是在您创建它时。例如,

[i*i for i in range(5)]

产生一个列表 [0, 1, 4, 9, 16],而

(i*i for i in range(5))

生成一个生成器对象,当您对其进行迭代时将生成这些数字。

如果你只给一个函数一个参数并且它是一个生成器表达式,你可以省略生成器表达式周围的括号,这样你就不必执行 myfunc((i + 1 for i in something))。

所以你正在创建一个生成器对象,并将它传递给 print() 函数,该函数打印它的表示。它正在做你所要求的,而不是你想要的。

您可以从生成器表达式初始化列表:

print(list(i*i for i in range(5)))

但使用列表推导更容易:

print([i*i for i in range(5)])

如何使用生成器对象的一个​​简单示例是:

for value in (i * i for i in range(5)):
    print value

虽然在那个简单的例子中它显然更容易编写:

for i in range(5):
    print i * i

【讨论】:

  • Python 2 会产生相同的输出; print 是语句还是函数在这里并不重要,真的。
  • 没错,print(list(i*i for i in range(5))) 中括号的语义在 Python 2 和 3 中是不同的(无论是属于 print 函数还是属于生成器表达式),但结果是一样的。
猜你喜欢
  • 2020-01-11
  • 1970-01-01
  • 2016-04-29
  • 2013-04-28
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
相关资源
最近更新 更多