1

I want to make a script which will type string letters one by one

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)

the error is: list index out of range how do i fix it?

4

7 回答 7

7

列表的长度是列表中元素的数量。但是,列表从 index 开始0,因此它们将在 index 结束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"为字符串 - 它已经是一个。

于 2013-07-22T17:31:45.237 回答
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(),因为否则无法保证您会定期看到输出(它可以写入缓冲区但直到很久以后才会刷新到屏幕) .

于 2013-07-22T17:31:56.863 回答
2

您的脚本非常不符合pythonic。这是可以做同样的事情。字符串是可迭代的,所以:

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)

这就是你所需要的。

于 2013-07-22T17:39:27.660 回答
0

列表是零索引的,所以最后一个元素是 at len(info)-1

要解决此问题,您需要从计数中减去 1:

i = int(count) - 1
于 2013-07-22T17:31:37.983 回答
0

这是“制作一个将逐个键入字符串字母的脚本”的代码

print info

如果您需要的是连续键入字符串中的字母,则无需重新发明轮子。

很可能,您的问题未详细说明。

于 2013-07-22T19:13:08.963 回答
0

单调但简明扼要:

import time
import sys

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

autotype("hello world")

上述代码的主要问题是,如果您不关心它们的返回值,通常不使用元组对两个函数进行排序。

于 2013-07-22T17:48:53.110 回答
0

索引从零开始计数...如果列表中有 5 个项目,则索引为 0,1,2,3,4

您在此行中设置索引超出范围:

i = int(count)

如果计数为 5,则最大索引为 4。要解决此问题,请将该行更改为:

i = int(count) - 1

接下来,您将不会打印第一个字符。修复该更改一行:

while i>0:

进入:

while i>=0:

顺便说一句,您的所有字符都向后打印。

于 2013-07-22T17:31:59.657 回答