为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

大话西游666 2021-09-25 14:41:09
假设我们有一个生成器函数gen(),我们不知道它是否为空。如果它是空的,我们想执行一个特殊的函数foo(),否则我们想在迭代器的每个元素上执行一个函数bar(elem)。我可以这样做:is_empty = Truefor elem in gen():    is_empty = False    bar(elem)if is_empty: foo()但这感觉不是很pythonic。还有其他方法吗?
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-09-25
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

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


但是你可以做这样的事情:


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)


查看完整回答
反对 回复 2021-09-25
  • 2 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信