หากตัวสร้างของคุณบริสุทธิ์ในแง่ที่ว่าเอาต์พุตนั้นขึ้นอยู่กับอาร์กิวเมนต์ที่ส่งผ่านและหมายเลขขั้นตอนเท่านั้นและคุณต้องการให้ตัวสร้างผลลัพธ์เริ่มต้นใหม่ได้นี่เป็นตัวอย่างข้อมูลเรียงลำดับที่อาจเป็นประโยชน์:
import copy
def generator(i):
    yield from range(i)
g = generator(10)
print(list(g))
print(list(g))
class GeneratorRestartHandler(object):
    def __init__(self, gen_func, argv, kwargv):
        self.gen_func = gen_func
        self.argv = copy.copy(argv)
        self.kwargv = copy.copy(kwargv)
        self.local_copy = iter(self)
    def __iter__(self):
        return self.gen_func(*self.argv, **self.kwargv)
    def __next__(self):
        return next(self.local_copy)
def restartable(g_func: callable) -> callable:
    def tmp(*argv, **kwargv):
        return GeneratorRestartHandler(g_func, argv, kwargv)
    return tmp
@restartable
def generator2(i):
    yield from range(i)
g = generator2(10)
print(next(g))
print(list(g))
print(list(g))
print(next(g))
เอาท์พุท:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[]
0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1
               
              
y = list(y)กับส่วนที่เหลือของรหัสของคุณไม่เปลี่ยนแปลง