Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的代码在执行while循环时不工作_Python_For Loop_While Loop - Fatal编程技术网

Python 为什么我的代码在执行while循环时不工作

Python 为什么我的代码在执行while循环时不工作,python,for-loop,while-loop,Python,For Loop,While Loop,代码如下 def stringtofind(masterstring, startchar, endchar): result = [] current_pos = masterstring.find(startchar) while current_pos != -1: end_pos = masterstring.find(endchar) result.append(masterstring[current_pos:end

代码如下

def stringtofind(masterstring, startchar, endchar):
    result = []
    current_pos = masterstring.find(startchar) 
    while current_pos != -1:     
        end_pos = masterstring.find(endchar)
        result.append(masterstring[current_pos:end_pos]) 
    return result
stringtofind("ABCDEABA", "C", "A")
代码是无限循环的,不会抛出任何输出

预期输出为
['CDEA','CDEABA']


是否有任何替代方法来执行此操作,如对范围内的i执行
(len(masterstring))

当前位置
结束位置
始终设置为相同的值,因此while条件始终为

实际上,分配给它们的第一个值是
current_pos=2
end_pos=0
,这将导致在
结果中附加相同的空列表

以下是输出日志:

current_pos=2, end_pos = 0
result=['']
current_pos=2, end_pos = 0
result=['', '']
current_pos=2, end_pos = 0
result=['', '', '']
current_pos=2, end_pos = 0
result=['', '', '', '']
current_pos=2, end_pos = 0
result=['', '', '', '', '']
...

看看这些值是如何保持不变的,它们永远不会使while循环停止。此外,每次结果都会追加
主字符串[2:0]
,即空字符串

这里,您基于代码的方法:

def stringtofind(masterstring, startchar, endchar):
    result = []
    current_pos = masterstring.find(startchar) 
    for i in range(current_pos,len(masterstring)+1):
        if(masterstring[i] != endchar): return
        result.append(masterstring[current_pos:i]) 
    return result
stringtofind("ABCDEABA", "C", "A")

在我看来,这是一个简单的解决办法。时间复杂度O(n^2)


您从不修改当前位置,因此循环将永远不会结束。首先,此逻辑似乎存在一些问题,在第三行中您找到了位置的位置,然后在第五行中找到了endchar的位置,但实际上您没有检查end\u pos是否大于当前位置,您需要确保end_pos始终大于current_pos,否则第6行上指示的字符串将不会返回itI的子字符串。如果您希望一步一步地了解代码在做什么(或学习调试器!),则建议您使用regex轻松解决此问题,而且效率更高!!
def stringtofind(masterstring, startchar, endchar):
    result = []
    start_ids = []
    n = len(masterstring)
    for i in range(n):
        if masterstring[i] == startchar:
            start_ids.append(i)
        if masterstring[i] == endchar:
            for j in start_ids:
                result.append(masterstring[j:i+1])
    return(result)

print(stringtofind("ABCDEABA", "C", "A"))