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

2024-06-01 04:02:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

我正在尝试打印返回值:

^{pr2}$

输出:

<generator object <genexpr> at 0x7fdfe009adc0>
<generator object <genexpr> at 0x7fdfe009a5f0>

如何打印整数值?在


Tags: 函数infordataobjectparamsgeneratorat
1条回答
网友
1楼 · 发布于 2024-06-01 04:02:55

您有一个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

现在让我们看看通过打印实际对象可以得到什么:

^{pr2}$

这在一定程度上是有道理的,因为生成器是懒洋洋地评估的,而且它从未真正被调用过。但是让我们看看当我们将它发送到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

我们得到了预期的信息错误。在

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

相关问题 更多 >