【发布时间】:2021-12-13 07:19:07
【问题描述】:
我在函数 alternate_all(*args) 中有一个生成器列表,它在列表中的每个生成器之间交替打印它们的第一项、第二项……等等,直到所有生成器都用完。
我的代码在生成器耗尽之前一直工作,一旦发生 StopIteration,它就会停止打印,当我希望它继续使用其余生成器并忽略耗尽的生成器时:
def alternate_all(*args):
iter_list = []
for iterable in args:
iter_list.append(iter(iterable))
try:
while True:
for iterable in iter_list:
val = next(iter_list[0])
iter_list.append(iter_list.pop(0))
yield val
except StopIteration:
pass
if __name__ == '__main__':
for i in alternate_all('abcde','fg','hijk'):
print(i,end='')
我的输出是:
afhbgic
什么时候应该:
afhbgicjdke
我怎样才能让它忽略耗尽的发电机?我宁愿不使用 itertools 并保持相同的结构。
【问题讨论】:
-
您有什么理由不想使用
itertools.zip_longest? -
如果迭代器已用尽,您将在
next(iter_list[0])中收到StopIteration异常。你应该抓住它并处理它。 -
我正在学习生成器,并试图在不使用 itertools 简化解决方案的情况下理解它们。这是作业要求
-
对不起,我应该更具体一些。您应该在
while循环内处理它,以便它保持yielding。然后,您应该实现在所有迭代器都用尽时退出的逻辑。 -
@tdelaney 使用推导式当然更传统,尽管我个人更喜欢将
map与命名函数一起使用。老实说,我不明白 Guido 讨厌map()。