猿问

检测生成器函数是否为空,否则对其进行迭代

假设我们有一个生成器函数gen(),我们不知道它是否为空。


如果它是空的,我们想执行一个特殊的函数foo(),否则我们想在迭代器的每个元素上执行一个函数bar(elem)。


我可以这样做:


is_empty = True

for elem in gen():

    is_empty = False

    bar(elem)

if is_empty: foo()

但这感觉不是很pythonic。还有其他方法吗?


大话西游666
浏览 214回答 2
2回答

喵喵时光机

有这个peek功能:import itertoolsdef peek(iterable):    try:        first = next(iterable)    except StopIteration:        return None    return first, itertools.chain([first], iterable)res = peek(gen())if not res:    foo()else:    for elem in res[1]:        bar(elem)您仍然需要窥视生成器,但您可以做到干净利落。

翻翻过去那场雪

您无法直接判断生成器是否为空。这是设计使然。生成器背后的一个关键原则是它们不会在内存中保存生成序列的所有项目。但是你可以做这样的事情:from itertools import chaindef check_first_and_iterate(iterable):    try:        first = next(iterable)        for item in chain([first], item):            bar(item)    except StopIteration:        foo()check_first_and_iterate(iterable)
随时随地看视频慕课网APP

相关分类

Python
我要回答