【问题标题】:Detect if generator function is empty, otherwise iterate over it检测生成器函数是否为空,否则迭代它
【发布时间】:2019-05-23 18:12:57
【问题描述】:

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

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

我可以这样做:

is_empty = True
for elem in gen():
    is_empty = False
    bar(elem)
if is_empty: foo()

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

【问题讨论】:

  • 你的方法并不糟糕,顺便说一句。这已经够pythonic了。通常,您不应该关心迭代器是否为空,或者更确切地说,这应该通过迭代它的结果来知道。

标签: python python-3.x generator iterable


【解决方案1】:

您无法直接判断生成器是否为空。这是设计使然。生成器背后的一个关键原则是它们不会将生成序列的所有项目都保存在内存中。

但你可以这样做:

from itertools import chain

def 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)

【讨论】:

    【解决方案2】:

    还有peek 函数:

    import itertools
    def 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)
    

    你仍然需要窥视生成器,但你可以干净利落地做。

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 2013-05-21
      • 2018-11-08
      • 1970-01-01
      • 2018-05-16
      • 2020-03-10
      • 1970-01-01
      • 2020-11-22
      • 2016-06-30
      相关资源
      最近更新 更多