我有一个返回元组的函数:
def gradiant(params, data):
Q1 = params[0]
Q2 = params[1]
dQ1 = sum(2*(y_i - Q1*x_i - Q2)*(x_i) for x_i, y_i in data)
dQ2 = sum(-2*(y-i - Q1*x_i - Q2) for x_i, y_i in data)
return (dQ1, dQ2)
我试图打印返回的值:
grad = gradiant(params, Data)
for x in grad: print(x)
输出:
<generator object <genexpr> at 0x7fdfe009adc0>
<generator object <genexpr> at 0x7fdfe009a5f0>
如何打印整数值?
答案 0 :(得分:1)
您有y-i
而不是y_i
。它为我制作了NameError
。我修正了错字并且工作正常(我认为,无论如何 - 它打印了两个数字)。
然而,更有趣的问题是如何在生成器表达式中处理错误(因为拼写错误是您发送到sum()
的生成器表达式的一部分)。我有一个NameError
,但你有生成器表达式对象。使用包含TypeError
:
>>> print(*(''.join(item2) for item2 in range(3)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: print() argument after * must be a sequence, not generator
现在让我们通过打印实际对象看看我们得到了什么:
>>> print(''.join(item2) for item2 in range(3))
<generator object <genexpr> at 0x00000000028945E8>
这是有道理的,因为生成器被懒惰地评估并且从未实际调用过。但是,让我们看看当我们将它发送给list()
时会发生什么,这应该强制进行评估:
>>> print(list(''.join(item2) for item2 in range(3)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
TypeError: can only join an iterable
有预期的错误。
包含无效生成器的有效生成器怎么样?
>>> print(*(list(''.join(item2) for item2 in range(3)) for i in range(1)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: print() argument after * must be a sequence, not generator
同样无意义的错误。
如果我们使用list
理解而不是生成器表达式会怎样?
>>> print(*[''.join(item2) for item2 in range(3)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
TypeError: can only join an iterable
我们得到了我们期待的信息性错误。
不幸的是,我不知道为什么会发生这种情况,但要小心使用生成器表达式。