[求解惑] [求原理] Python 中如何实现 goto 语句?

搜着玩,无意中发现了这个项目。
从以前偶尔需要写爬虫,到一些各种小功能,老大常常找我用 python 实现。
但由于工作岗位不属于开发类(我只是个会点 python 的数据分析……),一直对 python 没有太深的研究。

只是,这实在是,少见的完全看不懂的项目。。。
https://github.com/snoack/python-goto

求大神来解惑,他是如何在 python 下实现 goto 这样的功能的?
[求解惑] [求原理] Python 中如何实现 goto 语句?


2 回复

Python没有内置的goto语句,因为它的设计理念强调代码的可读性和结构化。不过,我们可以通过一些技巧来模拟类似的功能。

一种常见的方法是使用while循环和break/continue语句来控制流程。例如,我们可以用标签和条件判断来模拟跳转:

def simulate_goto():
    i = 0
    start_label = 0
    
    while True:
        if start_label == 0:
            print("Start")
            start_label = 1
            continue
        elif start_label == 1:
            i += 1
            print(f"Loop {i}")
            if i < 5:
                start_label = 1
                continue
            else:
                start_label = 2
                continue
        elif start_label == 2:
            print("End")
            break

simulate_goto()

另一种更高级的方法是使用异常处理。我们可以定义自定义异常,并在需要跳转的地方抛出它们:

class GotoLabel(Exception):
    def __init__(self, label):
        self.label = label
        super().__init__()

def goto_simulation():
    try:
        print("Start")
        raise GotoLabel("loop")
    except GotoLabel as e:
        if e.label == "loop":
            for i in range(5):
                print(f"Loop {i+1}")
            raise GotoLabel("end")
        elif e.label == "end":
            print("End")

try:
    goto_simulation()
except GotoLabel:
    pass

还可以使用生成器函数来模拟状态机,这实际上是一种更结构化的流程控制方式:

def state_machine():
    yield "start"
    for i in range(5):
        yield f"loop_{i+1}"
    yield "end"

sm = state_machine()
for state in sm:
    print(state.capitalize())

虽然这些方法可以模拟goto,但我建议尽量避免使用这种模式。Python的循环、条件语句和函数调用已经提供了足够的表达能力。如果你发现需要goto,通常意味着代码结构需要重新设计。考虑使用函数分解、状态模式或有限状态机来替代。

一句话建议:用结构化编程替代goto。


惨淡的无人问津。。

回到顶部