Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 11, 2012 09:02:45

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

Всем доброго дня!
Допустим есть цикл, в котором перебирается 10 объектов с большим интервалом.
При запуске скрипта, он всегда начинается с первой позиции. Как проще всего организовать продолжение выполнения цикла, после перезапуска скрипта? Думал сохранять в файл, но может есть способы проще?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

#2 Сен. 11, 2012 09:07:02

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

Как вариант, сделать класс, в котором будет атрибут-счетчик и сериализовать объект этого класса по выходу из программы.



Офлайн

#3 Сен. 11, 2012 09:08:04

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

Спасибо! Но я до классов еще не дорос…



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

#4 Сен. 11, 2012 09:39:33

masterito
От:
Зарегистрирован: 2011-06-13
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

Проще способов нет. Вам в любом случае нужно сохранять это число во внешнем хранилище. А уж в каком виде и что это будет за хранилище - решать вам.



Офлайн

#5 Сен. 11, 2012 09:42:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

Как то так, доработай напильником

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



Офлайн

#6 Сен. 12, 2012 02:48:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9749
Репутация: +  843  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

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



Офлайн

#7 Сен. 12, 2012 07:56:40

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

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)



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Сен. 12, 2012 08:16:48)

Офлайн

#8 Сен. 12, 2012 09:15:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9749
Репутация: +  843  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

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

N = 10
 
i = load()
while i < N:
    process(obj[i])
    i += 1
    save(i)



Отредактировано py.user.next (Сен. 12, 2012 09:17:51)

Офлайн

#9 Сен. 12, 2012 09:47:12

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

Спасибо!
Но я что-то никак догнать не могу как мне далее сделать бесконечный цикл

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…



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

#10 Сен. 12, 2012 09:48:09

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Сохранение позиции в цикле

Спасибо!
Но я что-то никак догнать не могу как мне далее сделать бесконечный цикл

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

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



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version