Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Отобразить ход действия цикла.


Автор: vvadim 19.9.2006, 13:38
Собственно хочется очень простой вещи, что бы во время выполнения цикла отображался номер итерации в одну строку. 
Код

import time
for i in range(10):
    print i,
    time.sleep(1)

В результате получаем нужный вывод, но весь сразу и через 10 секунд, а хотелось бы как в этом примере, но в одну строку.
Код

import time
for i in range(10):
    print i
    time.sleep(1)

В питоне начинающий, но крышу от такой простой задачи уже сносит.....
Не дайте погибнуть молодым  smile 

Автор: setq 19.9.2006, 14:05
В IDLE не воспроизвелось. Но может быть вставить 
Код

import time, sys  # <-- подключить sys
for i in range(10):
    print i,
    sys.stdout.flush()  # <-- сбросить буфер
    time.sleep(1)

Хуже во всяком случае не будет)

Или будет? (Ушёл задумавшись)

Автор: Artemios 19.9.2006, 14:45
У меня вот это сработало:
Код

import sys
import time
for i in range(10):
    sys.stdout.write("%i "%i)
    time.sleep(1)


Только попробовал потом твой первоначальный пример - и он сработал точно так же...
Возможно, от ОС-и зависит (у мня линукс, проверял в idle)

Автор: Vach 19.9.2006, 14:59
У меня таже проблема была (в смысле с time) (это не тоже самое что в vb doevents - как я понял)
но без time попробуй так
Код
print 'start'

for a in xrange(125000):
    s = str(a)
    l = len(s)
    print s+'\r'*l,

print ''
print 'stop'

зы может кто знает аналог "doevents"?

Автор: J2A 19.9.2006, 15:17
Хорошь уже вопросы задавать "Как в Python сделать аналогично как я делал при помощи A в X". Чтобы ответить на такой вопрос, нужно знать и Python, и X, и A. Подробно опиши вопрос и, возможно, будет достаточно лишь знания Python.

Что касательно "проблемы":

1. stdout буферизируется Это значит, что пока не наберется одн сстрока, на экран ничего выводится не будет. Как вариант, не одна строка, а размер буфера.
2. Чтобы вывести неполную строку на экран нужно сбросить буфер. Т.е. sys.stdout.flush()
3. stderr не буферизируется
4. В idle вывод в python shell и вывод скрипта в консоль -- разные вещи (напр. pyshell в idle не понимает \r)

Автор: Artemios 19.9.2006, 15:27
Цитата(J2A @  19.9.2006,  15:17 Найти цитируемый пост)
В idle вывод в python shell и вывод скрипта в консоль -- разные вещи (напр. pyshell в idle не понимает \r)

Действительно, в консоли не прошло.

Автор: vvadim 19.9.2006, 16:46
Цитата(setq @ 19.9.2006,  14:05)
В IDLE не воспроизвелось. Но может быть вставить 
Код

import time, sys  # <-- подключить sys
for i in range(10):
    print i,
    sys.stdout.flush()  # <-- сбросить буфер
    time.sleep(1)

Хуже во всяком случае не будет)

Или будет? (Ушёл задумавшись)

Все получилось, спасибо большое!

Добавлено @ 16:55 
Цитата(J2A @ 19.9.2006,  15:17)
Хорошь уже вопросы задавать "Как в Python сделать аналогично как я делал при помощи A в X". Чтобы ответить на такой вопрос, нужно знать и Python, и X, и A. Подробно опиши вопрос и, возможно, будет достаточно лишь знания Python.

Что касательно "проблемы":

1. stdout буферизируется Это значит, что пока не наберется одн сстрока, на экран ничего выводится не будет. Как вариант, не одна строка, а размер буфера.
2. Чтобы вывести неполную строку на экран нужно сбросить буфер. Т.е. sys.stdout.flush()
3. stderr не буферизируется
4. В idle вывод в python shell и вывод скрипта в консоль -- разные вещи (напр. pyshell в idle не понимает \r)

Очень интерестная информация на счет sys.stdout, что можно покурить на эту тему еще?
Или может посоветуйте что-нибудь для начала в питоне... Из опыта программирования есть только институтский курс паскаля....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)