如果我初始化j,我不明白为什么这超出了范围。
此扩展迭代斜杠的所有前面的字符,当与空格结合时,它会相乘。
即
5</ --> 5<5<
5<// --> 5<5<5<
5</ / --> 5<5< 5<5<
另外,这是完成任务的最佳方式吗?
def ttExpand( program ) :
"""
expand the string manipulation symbols in program into
a TinyTurtle language program.
program -- a TinyTurtle string, possibly with string manipulation symbols
Returns -- a TinyTurtle string after expansion
"""
new_program = ''
array = []
i = 0
j = 0
for ch in program: #while program.index(ch) != len(program) - 1:
if ch == '/':
array.append(program.index(ch))
i += 1
if len(array) == 0:
return program
while j <= len(array):
new_program += (program[:array[j]])
j += 1
return new_program
答案 0 :(得分:1)
这不会产生正确的结果,但它确实做了尝试做的事情:
#while j <= len(array):
for i in array:
new_program += program[:i] #(program[:array[j]])
出现这种方法实际上可以实现你想要的东西:
def tt_expand(program):
'''
expand string manip symbols
Example:
>>> tt_expand('5</')
'5<5<'
>>> tt_expand('5<//')
'5<5<5<'
>>> tt_expand('5</ /')
'5<5< 5<5<'
'''
seen = ''
new_program = ''
prev_token = None
for i, token in enumerate(program):
if token == '/':
if prev_token == ' ':
new_program += new_program.rstrip()
else:
new_program += seen
else:
new_program += token
seen += token
prev_token = token
return new_program
if __name__ == '__main__':
import doctest
doctest.testmod()
答案 1 :(得分:1)
直接原因是使用while j <= len(array):
然后使用array
索引j
;序列的索引从0
开始,结束len(array) - 1
(通常描述为从0(包括)到len(array)
(不包括))。
保留大部分代码的简单修补方法是更改为while j < len(array)
,以便停在array
中的最后一个可用索引处。也就是说,你的编码就像你刚刚来自C,索引而不是迭代。
如果您发现自己的循环结构如下:
i = 0
while i < len(someseq):
item = someseq[i] # or equivalent, where you only use the value retrieved by indexing, not the index itself
你真正想要的是:
for item in someseq:
在极少数情况下,您可能还需要索引(在分配回原始序列时),在这种情况下您需要:
for i, item in enumerate(someseq):
其中任何一个都比重新发明C风格的for
循环明显更快更简单(重新检查每次传递的长度,索引与直接迭代相比增加了惊人的开销)。
答案 2 :(得分:0)
你必须这样做:
while j <= len(array) - 1