如何重置并重新打乱next迭代器以循环生成随机角度?
实现循环迭代并重复打乱的角度生成器
你可以通过自定义生成器函数来实现需求,生成器会在每一轮360个角度耗尽后,自动重新打乱列表并继续生成元素,满足无限循环输出不重复打乱序列的要求。
方案1:使用生成器函数(推荐)
这种方式代码简洁、逻辑清晰,适合长期复用:
import random def infinite_shuffled_angles(): while True: # 每次循环重新创建角度列表并打乱 angles = list(range(-180, 180)) random.shuffle(angles) # 逐个返回打乱后的元素 yield from angles
使用示例:
n_list = [] # 初始化生成器 angle_gen = infinite_shuffled_angles() for _ in range(1000): n_list.append(next(angle_gen)) print(len(n_list)) # 输出:1000
生成器工作逻辑:
while True构建无限循环,确保可持续生成角度- 每一轮循环都会重新创建完整角度列表并打乱,保证每轮序列都是全新乱序
yield from angles逐个返回当前打乱列表的元素,列表耗尽后自动进入下一轮循环
方案2:手动捕获迭代器耗尽异常
如果不想定义额外函数,也可以在循环中手动检查迭代器状态,捕获StopIteration异常重置迭代器:
import random all_angles = list(range(-180, 180)) random.shuffle(all_angles) next_angle = iter(all_angles) n_list = [] for _ in range(1000): try: current_angle = next(next_angle) except StopIteration: # 迭代器耗尽,重新打乱并创建新迭代器 random.shuffle(all_angles) next_angle = iter(all_angles) current_angle = next(next_angle) n_list.append(current_angle) print(len(n_list)) # 输出:1000
这种方式直接在原逻辑上修改,适合快速适配简单场景,但代码可读性不如生成器方案。
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

