是否有一种简单的方法来测试生成器是否没有项目,比如peek, hasNext, isEmpty之类的?


当前回答

这是一个古老的问题,但之前没有人提出过,下面是这个问题:

for _ in generator:
    break
else:
    print('Empty')

你可以在这里阅读更多

其他回答

我发现只有这个解决方案也适用于空迭代。

def is_generator_empty(generator):
    a, b = itertools.tee(generator)
    try:
        next(a)
    except StopIteration:
        return True, b
    return False, b

is_empty, generator = is_generator_empty(generator)

或者如果你不想使用异常来尝试使用

def is_generator_empty(generator):
    a, b = itertools.tee(generator)
    for item in a:
        return False, b
    return True, b

is_empty, generator = is_generator_empty(generator)

在标记的解决方案中,您不能将其用于空生成器,如

def get_empty_generator():
    while False:
        yield None 

generator = get_empty_generator()

Bool (generator)将返回正确的结果

建议:

def peek(iterable):
    try:
        first = next(iterable)
    except StopIteration:
        return None
    return first, itertools.chain([first], iterable)

用法:

res = peek(mysequence)
if res is None:
    # sequence is empty.  Do stuff.
else:
    first, mysequence = res
    # Do something with first, maybe?
    # Then iterate over the sequence:
    for element in mysequence:
        # etc.

这是一个古老的问题,但之前没有人提出过,下面是这个问题:

for _ in generator:
    break
else:
    print('Empty')

你可以在这里阅读更多

对于这种显而易见的方法,我很抱歉,但最好的方法是:

for item in my_generator:
     print item

现在您已经检测到在使用生成器时它是空的。当然,如果生成器为空,项将永远不会显示。

这可能不完全适合您的代码,但这就是生成器的习惯用法:迭代,所以您可能会稍微改变您的方法,或者根本不使用生成器。