2013-07-22 3 views
1

Я хочу сделать скрипт, который будет тип строки буквы один за другимПеребор строку в Python

def autotype(info): 
    count = len(info) #Countign number of letters of the string 
    splitlist = list(info) 
    i = int(count) #getting an error on this line! it accept i=int(0) but my loop doesnt work because of this 
    while i>0: 
     sys.stdout.write(splitlist[i]) 
     time.sleep(0.2) 
     i -= 1 

info = str("hello world") 
autotype(info) 

ошибки является: индекс списка из диапазона , как это исправить?

+0

ОП: вы пытаетесь пройти назад через строку? Потому что это то, что делает ваш код. – 2rs2ts

+0

@ 2rs2ts нет, я просто хочу создать скрипт, который будет набирать текст точно так же, как это – Pythonizer

+0

Тогда обязательно пойдите с тем, что я написал изначально. – 2rs2ts

ответ

7

Длина списка является количество элементов в списке. Но, списки начинаются с индекса 0, и поэтому они заканчиваются на индекс length - 1. Итак, чтобы исправить ваш код как есть, он должен быть i = count - 1. (Вам не нужно, чтобы бросить его в int, это уже один.)

еще лучше, а не переборе с использованием счетчика в while цикле, просто использовать for петлю. Вы можете использовать цикл for для перебора символов в строке.

for ch in info: 
    sys.stdout.write(ch) 
    sys.stdout.flush() # as mawimawi suggests, if you don't do this, it will 
         # actually just come out all on one line at once. 
    time.sleep(0.2) 

Вам также не нужно, чтобы бросить "hello world" в строку - это уже один.

+0

Но обратите внимание, что это не будет проходить через строку назад. – Marcin

+1

Да, но действительно ли это действительно нужно? (Я просил его в комментариях.) – 2rs2ts

+0

Отлично! Спасибо! – Pythonizer

0

Списки индексируются нулями, поэтому последний элемент находится в len(info)-1.

Чтобы это исправить, нужно вычесть 1 из подсчета:

i = int(count) - 1 
2

Вы начинаете свою петлю в i=len(info), что является еще одним, чем окончательный индекс в строке. Последний индекс в строке (или другом итерабельном) равен len(string) - 1, так как индексы начинаются с 0.

Обратите внимание, что в Python, вы можете (и рекомендуется) использовать в конструкции языка природных и тот факт, что коллекции являются легко перебрать:

for letter in reversed(info): # Much clearer way to go backwards through a string 
    sys.stdout.write(letter) 

Поскольку вы выяснены в ваших комментариях, что вы действительно хотите перейти вперед через текст, вы можете просто вынуть бит reversed. Код, который вы отправили, будет повторяться в обратном направлении через текст, а не вперед - еще одно преимущество использования стандартных методов итерации заключается в том, что гораздо легче увидеть, сделали ли вы что-то, что вы не хотели делать!

for letter in info: # Very clear that you're going forward through the string 
    sys.stdout.write(letter) 

Наконец, как уже упоминалось, вы должны добавить явный вызов sys.stdout.flush() после каждой записи, так как в противном случае нет никакой гарантии, что вы будете видеть выход через регулярные промежутки времени (это может быть записано в буфер, но не покраснел до экрана намного позже).

+0

Согласен, это питонический путь и его следует использовать. Также нет явных деклараций типа. Я бы также изменил 'sys.stdout.write' для печати. – Darek

+0

@ Dārayavahuštdi Есть ли способ сделать 'print' и очищать буфер каждый раз, чтобы он выглядел так, как будто он набирается? – 2rs2ts

+0

@ Dārayavahuštdi 'print' будет очищать буфер (я думаю), но он также добавляет пробелы перед каждой буквой (без дополнительных манипуляций), которая, по-видимому, не та, что хочет OP. –

0

индексы отсчитываются от нуля ... если у вас есть 5 элементов в списке, то индексы 0,1,2,3,4

вы настраиваете индекс вне границ в этой строке:

i = int(count) 

Если счетчик равен 5, то максимальный показатель равен 4. Чтобы исправить это изменения, которые выстраиваются в линию в:

i = int(count) - 1 

Следующая вещь, вы не будете печатать первый символ. зафиксировать, что изменение строки:

while i>0: 

в:

while i>=0: 

Кстати, все ваши персонажи печатаются в обратном направлении.

2

Ваш сценарий довольно непифонный. Вот что-то, что сделает то же самое. Строки являются итерабельными, поэтому:

def autotype(info): 
    for x in info: 
     sys.stdout.write(x) 
     sys.stdout.flush() # you need this, because otherwise its' buffered! 
     time.sleep(0.2) 

Это все, что вам нужно.

+0

Хороший вызов 'flush()', I ' Я добавлю его к моему (но кредит вам!) – 2rs2ts

0

Unidiomatically, но лаконично:

import time 
import sys 

autotype = lambda instr:map((lambda ch:(sys.stdout.write(ch), time.sleep(0.2))), instr) 

autotype("hello world") 

Основная проблема с выше кода является то, что это не обычная для секвенирования две функции, используя кортеж, если не заботиться о своих возвращаемых значений.

0

Вот код, чтобы «сделать скрипт, который будет тип строки буквы по одному»

print info 

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

Более чем вероятно, ваш вопрос был указан ниже.

Смежные вопросы