如何有效地将发电机对象的数值与浮点数值进行比较而不出错?

时间:2017-03-25 04:55:54

标签: python-3.x error-handling syntax-error generator typeerror

我正在尝试对值进行比较,其中y是值列表。

if max(y) > 1 or max(y) == 1:
    ydel = 0.5
elif max(y) < 1:
    ydel = 0.005

运行时,上面代码的第一行会产生错误。

>> TypeError: unorderable types: generator() > int()

由于max()显然是一个动态生成对象的内置生成器,我想我应该将值存储在一个名为peak的变量中。

peak = max(y)
if peak > 1:
    ydel = 0.5
else:
    ydel = 0.005

运行此操作会产生与以前相同的错误。所以,我试过

peak = float(max(y))
if peak > 1:
    ydel = 0.5
else:
    ydel = 0.005

float也是一个生成器对象(就像int);这会产生错误

>> TypeError: float() argument must be a string or a number, not 'generator'

我考虑过定义一个返回包含生成器对象的变量的函数,但我认为它不会起作用,因为在变量peak中存储生成器对象不起作用。我还考虑过试图迭代地找到最大值但是在我的情况下这是很昂贵的,因为我正在考虑多个分布,每个分布由数千个数据点组成,每个分布都需要优化。

有没有办法在没有生成器的情况下非迭代地执行此操作仍然有效?或者也许更好的方法是将生成器值分配给变量以最大化效率?

1 个答案:

答案 0 :(得分:3)

max返回序列中的单个对象。如果它返回一个生成器,则生成器处于该序列中。 Python 3收紧了比较不同内容的规则。因此,如果您尝试将intgenerator进行比较,则会收到错误消息:

>>> mygen > 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: generator() > int()

同样适用于没有自然顺序的事情

>>> mygen > mygen
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: generator() > generator()

如果序列是单个生成器,则获得生成器。如果它有生成器和其他任何东西,则会出错。

>>> mygen = (i for i in range(3))
>>> max([mygen])
<generator object <genexpr> at 0x7f5a79668240>
>>> max([1,mygen])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: generator() > int()

最后,您的问题只有两种可能的解释。要么y在其中有一个生成器,要么max被完全不同的函数遮蔽。