检测生成器函数是否为空,否则对其进行迭代
Detect if generator function is empty, otherwise iterate over it
假设我们有一个生成器函数gen()
,我们不知道它是否为空。
如果为空,我们想执行一个特殊函数foo()
,否则我们想对迭代器的每个元素执行一个函数bar(elem)
.
我可以这样做:
is_empty = True
for elem in gen():
is_empty = False
bar(elem)
if is_empty: foo()
但这感觉不是很pythonic。还有其他方法吗?
您无法直接判断生成器是否为空。这是设计使然。生成器背后的一个关键原则是它们不会在内存中保存生成序列的所有项目。
但是你可以这样做:
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)
有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)
您仍然需要查看生成器,但您可以干净地完成它。
假设我们有一个生成器函数gen()
,我们不知道它是否为空。
如果为空,我们想执行一个特殊函数foo()
,否则我们想对迭代器的每个元素执行一个函数bar(elem)
.
我可以这样做:
is_empty = True
for elem in gen():
is_empty = False
bar(elem)
if is_empty: foo()
但这感觉不是很pythonic。还有其他方法吗?
您无法直接判断生成器是否为空。这是设计使然。生成器背后的一个关键原则是它们不会在内存中保存生成序列的所有项目。
但是你可以这样做:
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)
有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)
您仍然需要查看生成器,但您可以干净地完成它。