我想创建一个逐个输入字符串的脚本
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 :(得分: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"
强制转换为字符串 - 它已经是一个字符串。
答案 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()
的显式调用,因为否则不能保证你会定期看到输出(可以写入缓冲区但不能直到很久以后才冲到屏幕上。)
答案 2 :(得分: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)
这就是你所需要的一切。
答案 3 :(得分:0)
列表为零索引,因此最后一个元素位于len(info)-1
。
要解决此问题,您需要从计数中减去1:
i = int(count) - 1
答案 4 :(得分:0)
索引从零开始计算...如果列表中有5个项目,则索引为0,1,2,3,4
您要在此行中设置索引超出范围:
i = int(count)
如果count为5,则max index为4。 要将此更改修改为:
i = int(count) - 1
接下来,你不会打印第一个角色。 修改一行改为:
while i>0:
成:
while i>=0:
顺便说一下,你的所有角色都是向后打印的。
答案 5 :(得分:0)
一目了然,但简明扼要:
import time
import sys
autotype = lambda instr:map((lambda ch:(sys.stdout.write(ch), time.sleep(0.2))), instr)
autotype("hello world")
上面代码的主要问题是,如果你不关心它们的返回值,那么使用元组排序两个函数是不常见的。
答案 6 :(得分:0)
以下是“制作将逐个输入字符串字母的脚本”的代码
print info
如果您需要连续输入字符串中的字母,则无需重新发明轮子。
很可能,你的问题没有明确说明。