从生成器中提取元素而不实际使用它的优雅方法?

2024-04-26 13:20:53 发布

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

我在Python中使用了很多生成器,通常我需要从生成器中获取一个并且只有一个对象,但我不希望它跳过这个对象,只是为了能够查看它(例如,如果它是一个字典,就可以查看它的键)。你知道吗

import random
def get_generator():
    for i in range(0, 10):
        d = {'id': i, value: random.random()}
        yield d

g = get_generator()
fields = g.the_function_im_looking_for().keys()
print "this generator will offer " + str(len(fields)) + " fields in each item. "\
      "I know this information but I still can iterate over it"

for v in g:
    print g

请不要在回答中解释解决方法(比如测试循环中的第一个元素),我正在寻找一种“干净”的方法来实现这一点。你知道吗


Tags: 对象方法inimportidfieldsforget
3条回答

我相信这可以用itertools.tee公司(): http://docs.python.org/3/library/itertools.html#itertools.tee

但是,存储需求可能会变得很大。你知道吗

你知道吗itertools.tee公司()允许从一个迭代器创建两个迭代器。你知道吗

您可以创建一个包装生成器,允许您“窥视”下一个值:

_sentinel = object()

class PeekingGenerator(object):
    def __init__(self, it):
        self.it = it
        self.peeked = _sentinel

    def __iter__(self):
        return self

    def next(self):
        if self.peeked is not _sentinel:
            nextval, self.peeked = self.peeked, _sentinel
        else:
            nextval = next(self.it)
        return nextval

    def peek(self):
        if self.peeked is _sentinel:
            self.peeked = next(self.it)
        return self.peeked

这允许您使用.peek()方法查看下一个值;注意:如果没有下一个值可查看,则调用.peek()可以引发StopIteration。你知道吗

如果不推进发电机,就不可能从发电机中获取元件。发电机就是这样工作的。您可以使用技巧来存储元素,以便稍后再次使用它(您似乎已经知道)。您还可以编写一个类,提供用peek方法包装生成器的行为。但是你必须在发电机的外部做这些。当你得到一个元素时,没有任何方法可以使生成器本身不前进。你知道吗

相关问题 更多 >