Найти - Пользователи
Полная версия: Сохранение позиции в цикле
Начало » Python для новичков » Сохранение позиции в цикле
1 2
Seganapa
Всем доброго дня!
Допустим есть цикл, в котором перебирается 10 объектов с большим интервалом.
При запуске скрипта, он всегда начинается с первой позиции. Как проще всего организовать продолжение выполнения цикла, после перезапуска скрипта? Думал сохранять в файл, но может есть способы проще?
FishHook
Как вариант, сделать класс, в котором будет атрибут-счетчик и сериализовать объект этого класса по выходу из программы.
Seganapa
Спасибо! Но я до классов еще не дорос…
masterito
Проще способов нет. Вам в любом случае нужно сохранять это число во внешнем хранилище. А уж в каком виде и что это будет за хранилище - решать вам.
FishHook
Как то так, доработай напильником

import pickle,os,time
file_name='/home/smirnov/dump.dmp'
class CycleWithCounter(object):
    def __init__(self, func, *args, **kw):
        self.counter=0
        self.func=func
        self.args=args
        self.kw=kw
    def __iter__(self):
        for i in self.func(self.counter, *self.args, **self.kw):
            self.counter+=1
            yield i
            file=open(file_name,'w')
            pickle.dump(self, file)
            file.close()
def foo(start,*args, **kw):
    for a in args[start:]:
        yield a
        time.sleep(5)
if not os.path.exists(file_name):
     c_w_c=CycleWithCounter(foo, 1,2,3,4,5,6,7)
else:
    file=open(file_name,'r')
    c_w_c=pickle.load(file)
    file.close()
for i in c_w_c:
    print i
os.remove(file_name)

Первый вызов
1
2
^CTraceback (most recent call last):
  File "test.py", line 47, in <module>
    for i in c_w_c:
  File "test.py", line 26, in __iter__
    for i in self.func(self.counter, *self.args, **self.kw):
  File "test.py", line 37, in foo
    time.sleep(5)
KeyboardInterrupt
Второй вызов
3
4
5
6
7

py.user.next
Seganapa
При запуске скрипта, он всегда начинается с первой позиции. Как проще всего организовать продолжение выполнения цикла, после перезапуска скрипта?
сохрани в файл номер позиции
Seganapa
py.user.next
сохрани в файл номер позиции

А как потом начать выполнение цикла (While) с этой позиции?
Если не трудно киньте пример…

while 1:
    print time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(time.time()))
    attack (52044)
    print time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(time.time()))
    attack (51947)
    print time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(time.time()))
    attack (51685)
    print time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(time.time()))
    attack (51975)

py.user.next
Seganapa
А как потом начать выполнение цикла (While) с этой позиции?
загрузить число из файла в переменную

N = 10
 
i = load()
while i < N:
    process(obj[i])
    i += 1
    save(i)
Seganapa
Спасибо!
Но я что-то никак догнать не могу как мне далее сделать бесконечный цикл

def tor(name):
    print 'Значение', name
names = ['Joe', 'Bill', 'Sara']
i=2
while 1:
   while i<len(names):    
        tor(names[i])
        i+=1

Например, на первом проходе я получаю из файла значение i, т.е. цикл начинается с сохраненной позиции (в данном примере с Sara), затем мне нужно бесконечно повторять функцию Tor, но чтобы туда уже поочередно попали все позиции списка names…
Seganapa
Спасибо!
Но я что-то никак догнать не могу как мне далее сделать бесконечный цикл

def tor(name):
    print 'Значение', name
names = ['Joe', 'Bill', 'Sara']
i=2
while i<len(names):    
        tor(names[i])
        i+=1

Например, на первом проходе я получаю из файла значение i, т.е. цикл начинается с сохраненной позиции (в данном примере с Sara), затем мне нужно бесконечно повторять функцию Tor, но чтобы туда уже поочередно попали все позиции списка names…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB