内置itertools.cycle函数在While True循环中无法迭代下一个元素的问题
问题分析与解决
你的问题核心出在modification函数的逻辑上:while True循环里的return语句会直接终止函数,导致cycle对象只执行了一次next()就退出,根本没机会进入下一次循环迭代。
修正方案
把return改成yield,让函数变成生成器,这样就能保留cycle对象的状态,每次调用时返回下一个元素:
import collections import itertools def cycle_(deq_): deq = collections.deque(['D', 'E', 'L']) idx = deq.index(deq_) deq.rotate(-idx) cycle = itertools.cycle(deq) return cycle def modification(data): dump = cycle_(data['position']) while True: yield {'position': next(dump)}
使用示例
data = {'position': 'D'} pos_generator = modification(data) # 每次调用next()获取下一个元素 print(next(pos_generator)) # {'position': 'D'} print(next(pos_generator)) # {'position': 'E'} print(next(pos_generator)) # {'position': 'L'} print(next(pos_generator)) # {'position': 'D'} # 开始循环
原理说明
yield不会终止函数,而是暂停函数执行并返回当前值,下次调用next()时会从暂停的位置继续执行循环。itertools.cycle返回的迭代器状态会被生成器保留,每次调用next(dump)都会拿到下一个循环元素。
内容的提问来源于stack exchange,提问作者Նարեկ Չինայ</think_never_used_51bce0c785ca2f68081bfa7d91973934>
相关产品推荐
相关产品推荐

