Information*/알면도움됨

How to break out of multiple loops in python?

ch4rli3kop 2021. 10. 21. 00:01
반응형

How to break out of multiple loops in python?

원래 C 코드 상에서 반복문이 여러 개로 겹쳐있을 때, 어떻게 하면 반복문들을 효율적으로 break할 수 있는지 찾아보다가 python 코드 상에서의 질문을 보게되었다.

코드가 더러워지지만 조건문을 사용하자는 파 vs 이럴 때 쓰라고 goto가 아직까지 남아있는 것이다라는 파, 두 파의 대립을 보게되었다. 참고로 나는 goto에 마음이 갔다. 코드도 예쁘고 어차피 어셈상에서 보면 다 똑같은 jmp 명령어가 아닌가.

어쨋든 python에서 여러 반복문 탈출에 대한 다음 질문을 살펴보면 예시로 든 multiple loop는 다음과 같다.

while True:
    #snip: print out current state
    while True:
        ok = get_input("Is this ok? (y/n)")
        if ok.lower() == "y": break 2 #this doesn't work :(
        if ok.lower() == "n": break
    #do more processing with menus and stuff

문제의 요지는 위의 y 조건에서 한 번에 두 반복문을 탈출할 수 있는 예쁜 방법을 찾는 것이었는데, 나온 방법들은 다음과 같다.

  • Flag를 이용한 방법
  • Function를 이용한 방법
  • else를 이용한 방법 <-제일 신박했음
특정 조건을 만족했을 때 loop 문마다 Flag를 사용하여 break함
Flag = False
while True:
    #snip: print out current state
    while True:
        ok = get_input("Is this ok? (y/n)")
        if ok.lower() == "y": 
            Flag = True
            break
        if ok.lower() == "n": break

    if Flag:
        break
    #do more processing with menus and stuff
Function의 return을 이용함
def foo():
    while True:
        #snip: print out current state
        while True:
            ok = get_input("Is this ok? (y/n)")
            if ok.lower() == "y": return 1
            if ok.lower() == "n": break
else를 이용함

사실 이거 때문에 이 글을 쓴다. 반복문에 else를 쓸 수 있다는 걸 처음 알았다... else 문은 반복문 내에서 break를 만나지 않고 반복문이 종료되었을 때 실행된다. 사실 위 사례에서는 break가 y일 때 유일한 게 아니라서 아주 적합한 것은 아니지만, multiple loop일 때 else를 사용할 수 있다는 것에 의의를 두자.

while True:
    #snip: print out current state
    while True:
        ok = get_input("Is this ok? (y/n)")
        if ok.lower() == "y": break
    else:
        continue
    break
    #do more processing with menus and stuff

for else

else에 관하여 다시 살펴보면, 예를들어 다음과 같은 코드가 있을 때, else 문은 동작하지 않는다.

for i in range(10):
    if i == 2:
        break
else:        
    print('zzzzzzz')

그러나 다음과 같은 코드에서는 else 문이 동작한다.

for i in range(10):
    if i == 12:
        break
else:        
    print('zzzzzzz')

참고로 else는 for, while, try 문 등에 사용할 수 있다.

다양한 else에 관련된 논의는 링크에서 확인할 수 있다.

Reference

반응형