代码之家  ›  专栏  ›  技术社区  ›  Jsevillamol

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

  •  2
  • Jsevillamol  · 技术社区  · 6 年前

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

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

    我可以这样做:

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

    但那感觉不太像蟒蛇。还有其他方法吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   jpp    6 年前

    你不能直接判断发电机是否是空的。这是按设计的。生成器背后的一个关键原则是,它们不在内存中保存生成序列的所有项。

    但是你可以这样做:

    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
  •  2
  •   cs95 abhishek58g    6 年前

    这里有 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)
    

    你仍然需要窥视发电机,但你可以做得很干净。