生成函数的无法描述的结果

时间:2018-07-21 21:06:48

标签: python

我具有生成器函数,并且该函数可以与第一个函数的结果一起工作。例如:

tr

我遇到错误“'gen()'不可写” 如何解决它并使用func的结果?

2 个答案:

答案 0 :(得分:0)

您在这里有两个问题。


首先,生成器对象不是序列,而是迭代器。通过像[1]这样的下标,您无法像对序列一样对迭代器进行索引。您可以使用for语句或理解来遍历它们,或者在它们完成之前手动对其调用next,但是不能[1]

这就是为什么您会收到一条错误消息,指出生成器对象不可下标。


第二,您还是不想下标生成器。您的生成器产生多个可迭代的对象。它只发生一次yield,但这与其中只有一对的序列没有什么不同-它仍然与一对不是同一回事。

考虑最接近的序列等效项:

def seq():
    a = 2
    b = 3
    return [(a, b)]

显然,seq()[0]将成为元组(2, 3),而seq()[1]将成为IndexError。因此,即使您可以下标生成器,您的代码也没有意义。


您实际上想 要做的是要么选择第一对,要么遍历所有对(我不确定是哪一对)。然后,您可以对这对/每对进行[0][1]

那么,要么:

def func():
    for pair in gen():
        c = pair[0]
        d = pair[1]

…或这个

def func():
    pair = next(gen())
    c = pair[0]
    d = pair[1]

或者,如果您确实出于某种原因想要两次调用它,这是

def func():
    for pair in gen():
        c = pair[0]
    for pair in gen():
        d = pair[1]

…或这个

def func():
    c = next(gen())[0]
    d = next(gen())pair[1]

答案 1 :(得分:0)

您要执行的操作是在iterating上获得第一个和第二个元素,而没有iterator。您需要iterate来获取它的值,例如-

for i in gen():
    c, d = i # you need this because you are returning a tuple

您可以浏览this帖子以了解有关iteratorsgenerators的更多信息