Продолжение итерации, после прерывания программы

274 просмотра
0

Добрый день, задался вопросом, а как можно возобновить итерацию с генератора, если мы завершим процесс, а потом захотим его продолжить?

Вот типа такого

# ------------- file 1 -------------
import pickle
import itertools
 
def test(sym, L):
    return (''.join(q) for q in itertools.chain.from_iterable(itertools.product(sym, repeat=i)for i in range(1, L + 1)))
 
h = test("1234567890",4)
f = open("test.pickle", "wb")
 
for i in range(1000):
    next(h)
 
print(next(h)) # 901
pickle.dump(h, f) # TypeError: can't pickle generator objects
 
# PC shutdown
 
# ------------- file 2 -------------
import pickle
import itertools
 
def test(sym, L):
    return (''.join(q) for q in itertools.chain.from_iterable(itertools.product(sym, repeat=i)for i in range(1, L + 1)))
 
h = test("1234567890",2)
 
f = open("test.pickle", "rb")
 
pickle.load(f)
print(next(h)) # 902???

Можно и в одном файле, но сути это особо не изменит. И вообще возможно ли такое сохранить на диске в виде дампа?


Добавить комментарий

1 Ответы

Python Опубликовано 10.12.2018
0

#! coding: utf-8
import string
 
CharacterData  = string.digits + string.ascii_lowercase + string.ascii_uppercase# + string.punctuation
#CharacterData += "абвгдеёжзийклмнопрстуфхцчшщъыьэюя" + "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
 
N_dict = {n:c for n,c in zip([n for n in range(len(CharacterData))], [c for c in CharacterData])}
N_dict_r = {j:i for i, j in N_dict.items()}
 
def converter_in(Int, N = len(N_dict)):
    if Int < N:
        return N_dict[Int]
    Int_ = ""
    while True:
        a, b = divmod(Int, N)
        if a < b:
            Int_ += N_dict[b]
            break
        else:
            Int_ += N_dict[b]
            Int = a
    if N_dict[a] == "0":
        return Int_[::-1]
    else:
        return N_dict[a] + Int_[::-1]
 
def converter_out(iNT):
    return sum([n * (len(N_dict) ** m) for n, m in zip([N_dict_r[j] for j in iNT[::-1]], [i for i in range(len(iNT))])])
 
i = -1
while True:
    i += 1
    print(converter_in(i))

Вот и другой алгоритм для решения этой задачи. Сохранить значение в файле тут гораздо проще, чем делать дамп. И меня просто реализация интересовала этого, а не использования в каких-то плохих целях. Очень красивое решение для задачи. Если будут ещё интересные решения, то с удовольствием посмотрел, как реализуете.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up