保存 itertools 产品循环值,然后从上次结果恢复

Save itertools product loop value and then resume from the last result

我正在使用这段代码来破解一个简单的密码 mycubana,但我想 "pause" itertools 循环,以便在一段时间后我可以恢复循环从最后保存的 itertools.product 值开始。有什么方法可以在不更改大量代码的情况下做到这一点吗?

代码:

import string
from itertools import chain, product

def bruteforce(charset, minlenght, maxlenght):
    return(''.join(candidate) 
          for candidate in chain.from_iterable(product(charset, repeat = i)
          for i in range(minlenght, maxlenght)))

contador = 0
for attempt in bruteforce(string.ascii_lowercase, 8, 9):
    codigo = 'mycubana'
    contador+=1
    if attempt==codigo:
        print(attempt)
        contador=0

是的,其实很简单。使用您的环境和 bruteforce 的定义,以下代码将对生成的序列执行两次运行,每次运行 10 个候选对象:

bf26_8 = bruteforce(string.ascii_lowercase, 8, 9)

count = 0

for c in bf26_8:
    count += 1
    print(c)
    if count == 10:
        break

print("======== PAUSED ========")

for c in bf26_8:
    count += 1
    print(c)
    if count == 20:
        break

"trick"是将bruteforce的结果存储在一个变量中。该结果是 generator,因此如果您对其进行迭代,但不要耗尽它(即,打破迭代循环),一旦您再次开始迭代,它将为您提供延续值。