如何在Python中取消引用对象?

时间:2016-01-02 01:51:55

标签: python printing

我有一个返回元组的函数:

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>

如何打印整数值?

1 个答案:

答案 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

我们得到了我们期待的信息性错误。

不幸的是,我不知道为什么会发生这种情况,但要小心使用生成器表达式。