gpt4 book ai didi

python - 我如何检测python中的无限循环

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:52 27 4
gpt4 key购买 nike

我正在学习 Python 3 并正在做一个练习,该练习要求编写一个模拟/读取 BASIC 程序作为输入的 Python 程序。我坚持编写应该检测无限循环的 Python 程序部分。这是我到目前为止的代码:

def execute(prog):
while True:
location = 0
if prog[location] == len(prog) - 1:
break
return "success"
getT = prog[location].split()
T = len(getT) - 1
location = findLine(prog, T)
visited = [False] * len(prog)

此处,prog 是包含 BASIC 程序的字符串列表(字符串的形式为 5 GOTO 30、10 GOTO 20 等)。

T是prog[location]中指示的目标字符串。

如果 BASIC 程序有死循环,那么我的 Python 程序也会有死循环。我知道如果任何一行被访问两次,那么它将永远循环,我的程序应该返回“无限循环”。

教程助手给出的提示是“初始化一个列表 visited = [False] * len(prog) 并在访问 prog[i] 时将 visited[i] 更改为 True。每次循环,一个值更新在 visited[] 中。考虑如何更改列表中的单个值。然后考虑如何确定 visited[] 中的哪个值需要更改。”

所以这是我坚持的部分。如何跟踪 prog 中的哪些字符串已被访问/循环?

最佳答案

我不确定我是否同意访问一行两次证明是一个无限循环。请参阅问题下的评论。但我可以回答实际问题。

提示如下:

A hint given by the tutorial assistant says "initialize a list visited = [False] * len(prog) and change visited[i] to True when prog[i] is visited. Each time through the loop, one value updates in visited[]. Think about how you change a single value in a list. Then think about how you identify which value in visited[] needs to change."

这是说你应该有两个列表,一个包含程序,一个包含真/假标志。第二个将被命名为 visited 并且最初包含 False 值。

Python代码就像提示说的那样:

visited = [False] * len(prog)

这使用 * 列表运算符“列表重复”来重复长度为 1 的列表并创建一个更长的新列表。

要将 visited[i] 更改为 True 很简单:

visited[i] = True

然后你可以这样做:

if visited[i]:
print("We have already visited line {}".format(i))
print("Infinite loop? Exiting.")
sys.exit(1)

请注意,我们通过简单地说 if visited[i]:

来测试 True

我们也可以这样写 if visited[i] == True: 但更短的形式就足够了并且在 Python 社区中是习惯的。这个和其他习惯用语记录在这里:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

对于这么小的程序,保留两个这样的列表也不错。对于更大、更复杂的程序,我更喜欢将所有内容放在一个地方。这将使用您可能还没有学过的“类”。像这样:

class ProgramCode(object):
def __init__(self, statement):
self.code = statement
self.visited = False

prog = []
with open(input_basic_program_file, "rt") as f:
for line in f:
prog.append(ProgramCode(line))

现在我们有一个列表,而不是两个列表,其中每个项目都是一些 BASIC 代码和一个 visited 标志。

附言上面显示了一个明确的 for 循环,它重复使用 .append() 添加到列表中。经验丰富的 Python 开发人员可能会改用“列表理解”,但我想让它尽可能易于理解。

这是列表理解。如果现在看起来很奇怪,请不要担心;你的类(class)最终会教给你这个。

with open(input_basic_program_file, "rt") as f:
prog = [ProgramCode(line) for line in f]

关于python - 我如何检测python中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com