[python] 파이썬에 레이블 / 고토가 있습니까?

거기에 goto파이썬 또는 이와 동등한 코드의 특정 라인으로 이동 할 수 있도록은?



답변

아니요, 파이썬은 레이블과 이동을 지원하지 않습니다. 그것은 (높은) 구조화 된 프로그래밍 언어입니다.


답변

파이썬은 일류 함수를 사용하여 goto로 할 수있는 일을 할 수있는 기능을 제공합니다. 예를 들면 다음과 같습니다.

void somefunc(int a)
{
    if (a == 1)
        goto label1;
    if (a == 2)
        goto label2;

    label1:
        ...
    label2:
        ...
}

파이썬에서 다음과 같이 할 수 있습니다 :

def func1():
    ...

def func2():
    ...

funcmap = {1 : func1, 2 : func2}

def somefunc(a):
    funcmap[a]()  #Ugly!  But it works.

물론, 그것은 goto를 대체하는 가장 좋은 방법은 아닙니다. 그러나 goto로 무엇을하려고하는지 정확히 알지 못하면 구체적인 조언을하기가 어렵습니다.

@ 아스코 볼 :

최선의 방법은 함수로 묶거나 예외를 사용하는 것입니다. 기능의 경우 :

def loopfunc():
    while 1:
        while 1:
            if condition:
                return

예외 :

try:
    while 1:
        while 1:
            raise BreakoutException #Not a real exception, invent your own
except BreakoutException:
    pass

다른 프로그래밍 언어에서 온 경우 예외를 사용하여 이와 같은 작업을 수행하는 것은 약간 어색 할 수 있습니다. 그러나 예외를 사용하는 것을 싫어하면 파이썬이 당신의 언어가 아니라고 주장합니다. 🙂


답변

최근 에 파이썬에서 가능하게 하는 함수 데코레이터작성했습니다goto .

from goto import with_goto

@with_goto
def range(start, stop):
    i = start
    result = []

    label .begin
    if i == stop:
        goto .end

    result.append(i)
    i += 1
    goto .begin

    label .end
    return result

왜 그런 식으로 뭔가를하고 싶은지 잘 모르겠습니다. 즉, 나는 그것에 대해 너무 심각하지 않습니다. 그러나 이런 종류의 메타 프로그래밍은 적어도 CPython과 PyPy에서 파이썬에서 실제로 가능하며 다른 사람이 했던 것처럼 디버거 API를 오용하는 것만이 아니라고 지적하고 싶습니다 . 그래도 바이트 코드를 엉망으로 만들어야합니다.


답변

나는 공식적인 파이썬 디자인 및 역사 FAQ 에서 이것을 발견했다 .

왜 고토가 없습니까?

예외를 사용하여 함수 호출에서도 작동하는 “구조화 된 이동”을 제공 할 수 있습니다. 많은 사람들은 예외가 C, Fortran 및 기타 언어의 “go”또는 “goto”구문을 합리적으로 사용하는 것을 편리하게 모방 할 수 있다고 생각합니다. 예를 들면 다음과 같습니다.

class label(Exception): pass  # declare a label

try:
    ...
    if condition: raise label()  # goto label
    ...
except label:  # where to goto
    pass
... 

이것은 당신이 루프의 한가운데로 뛰어들 수는 없지만, 어쨌든 goto의 남용으로 간주됩니다. 드물게 사용하십시오.

공식 FAQ에 언급되어 있으며 훌륭한 솔루션 샘플이 제공되어 매우 기쁩니다. 나는 커뮤니티가 이것 goto처럼 취급하기 때문에 파이썬을 정말로 좋아 합니다.)


답변

의견에서의 제안을 사용하여 @ascobol의 질문에 대답하려면 @bobince:

for i in range(5000):
    for j in range(3000):
        if should_terminate_the_loop:
           break
    else:
        continue # no break encountered
    break

else블록 의 들여 쓰기 가 정확합니다. else루프 파이썬 구문 후에 코드가 모호하게 사용 됩니다. 파이썬이 for 및 while 루프 후에 왜 ‘else’를 사용합니까?를 참조하십시오 .


답변

http://entrian.com/goto/ 작업 버전이 만들어졌습니다 .

참고 : 만우절 농담으로 제공되었습니다. (하지만 작동)

# Example 1: Breaking out from a deeply nested loop:
from goto import goto, label

for i in range(1, 10):
    for j in range(1, 20):
        for k in range(1, 30):
            print i, j, k
            if k == 3:
                goto .end
label .end
print "Finished\n"

말할 필요없이. 예, 재미 있지만 사용하지 마십시오.


답변

레이블 break과는 continue제안 된 PEP 3136 2007 년에 다시 있지만 거부되었습니다. 제안서 의 동기 부여 섹션은 break파이썬으로 분류 된 모방을위한 몇 가지 일반적인 (우아한 경우) 방법을 보여줍니다 .