2010-01-15 6 views
54

if 절을 조기에 종료하려면 어떤 종류의 메서드가 있습니까?if 절을 종료하는 방법

코드를 작성할 때 break 문을 if 절 안에 넣고 자 할 때만 루프 용으로 만 사용할 수 있다는 것을 기억해야합니다. 문이 큰 다른 블록에 남아있는 코드를 포장하는 경우 출구의 경우 중첩 내에서 발생 가정 :

if some_condition: 
    ... 
    if condition_a: 
     # do something 
     # and then exit the outer if block 
    ... 
    if condition_b: 
     # do something 
     # and then exit the outer if block 
    # more code here 

내가 이렇게하는 한 가지 방법을 생각할 수 있습니다

를 예로 들어 다음과 같은 코드를 취할 수 있습니다. 예 :

if some_condition: 
    ... 
    if condition_a: 
     # do something 
     # and then exit the outer if block 
    else: 
     ... 
     if condition_b: 
      # do something 
      # and then exit the outer if block 
     else: 
      # more code here 

이 문제는 출구 위치가 많을수록 중첩/들여 쓰기 코드가 더 많다는 것을 의미합니다.

또는 if 절을 최대한 작게 만들고 종료가 필요하지 않도록 코드를 작성할 수 있습니다.

아무도 if 절을 종료하는 좋은/좋은 방법을 알고 있습니까?

else-if 및 else 절과 관련된 항목이있는 경우 종료하면 해당 항목을 건너 뛸 것이라고 생각합니다.

+1

'엘프 '에 대해 아십니까? –

+0

"또는 if 절이 가능한 작고 종료가 필요하지 않도록 코드를 작성할 수 있습니다." - 물론 이것이 최선의 행동 방침이 될 것입니다. :-) –

+1

@Craig McQueen : 그렇지만 조건문 사이에서 코드를 실행하고 싶다고 말하고 싶습니다. 예 : 'if a : #stuff; #stuff_inbetween; if b : #stuff;'inbetween 코드는'not a'에 의존하지만'b'에 의존하지 않습니다. – Roman

답변

53

이 방법은 if, 여러 개의 중첩 루프 및 다른 구조에서 쉽게 사용할 수 없습니다 (break).

코드를 자체 기능으로 묶습니다. break 대신 return.

+0

아, 저 아이디어가 마음에 들어요. 그것은 느린 것의 단점을 가지고있는 것처럼 보입니다. PythonWiki 성능 팁 페이지는 "Python에서 함수 호출 오버 헤드가 상대적으로 높습니다"라고 말합니다. (http://wiki.python.org/moin/PythonSpeed/PerformanceTips) – Roman

+4

프로그래머의 트릭을 작성해 주셔서 감사합니다. 내 경험상,이 접근법은 앞으로 움직이는 고토를 사용하려고 할 때마다 거의 효과가 있습니다. (그리고 하나의 함수가 너무 커지는 상황을 암시하고 말합니다.) –

+2

이상적으로는 두 가지를 모두 달성 할 수 있지만 좋은 성능을 위해 좋은 코드를 교환해야하는 경우가 있습니다. 그 시간은 드문 경우입니다. 특히 Python을 사용할 때 고려하십시오. 즉, 함수 호출 오버 헤드에 대해 그렇게 걱정하지 마십시오. – ephemient

3

수도 있습니다.

+1

예, 작동 할 수 있습니다. 내가이 글을 쓰는 동안 'elif'에 내 마음이 비어 있다고 생각한다. 이 코드는 중첩 된 if 문 사이에서 코드를 실행하려는 상황에서는 작동하지 않을 것이라고 생각합니다. – Roman

1

효과적으로 설명하는 것은 goto 문입니다. 일반적으로 꽤 많이 사용됩니다. 두 번째 예제는 훨씬 이해하기 쉽습니다.

그러나

, 청소기는 여전히 다음과 같습니다

if some_condition: 
    ... 
    if condition_a: 
     your_function1() 
    else: 
     your_function2() 

... 

def your_function2(): 
    if condition_b: 
     # do something 
     # and then exit the outer if block 
    else: 
     # more code here 
30
 
from goto import goto, label 

if some_condition: 
    ... 
    if condition_a: 
     # do something 
     # and then exit the outer if block 
     goto .end 
    ... 
    if condition_b: 
     # do something 
     # and then exit the outer if block 
     goto .end 
    # more code here 

label .end 

가 (실제로이 제발 사용하지 마십시오.)

+16

+1이 재미 있기 때문에 +1. Google 검색에 의하면 이것이 April Fool의 농담 모듈이라고 나에게 밝혀졌습니다. – Roman

+2

나는 그것도 연결했다. 첫 번째 'goto'를 클릭하십시오. – ephemient

+0

이것은 모든 종류의 분기 코드를 생각 나게합니다. – phunehehe

7

당신은 예외 고토의 기능을 에뮬레이션 할 수 있습니다 :

try: 
    # blah, blah ... 
    # raise MyFunkyException as soon as you want out 
except MyFunkyException: 
    pass 

면책 조항 : 당신의 관심을 끌기 위해 가능성을 이런 식으로 일을하는 동안, 정상적인 상황에서 합리적인 것으로 나는 그것을지지하지 않습니다. 질문에 대한 언급에서 언급했듯이, 비잔틴 제 조건을 피하기 위해 코드를 구조화하는 것이 훨씬 더 바람직합니다. :-)

+0

하하, 나는이 창조적 인 해결책을 좋아한다. 면책 조항을 준수하고 펑키 코드를 사용하지 않겠습니다. – Roman

+0

@Roman : Shmoopty와 함께 또 다른 트릭을 추가하는 것을 기쁘게 생각합니다. ;-) –

2

일반적으로 말하면 안됩니다. "ifs"를 중첩시키고 그들로부터 이탈한다면, 당신은 그것을 잘못하고 있습니다.

그러나, 다음을 수행해야합니다

if condition_a: 
    def condition_a_fun(): 
     do_stuff() 
     if we_wanna_escape: 
      return 
    condition_a_fun() 
if condition_b: 
    def condition_b_fun(): 
     do_more_stuff() 
     if we_wanna_get_out_again: 
      return 
    condition_b_fun() 

참고, 기능, 그들은 사전에 선언 할 수있는 if 문에서 선언 할 필요가 없습니다)이 그것 때문에 더 나은 선택이 될 것입니다 나중에 추악한 부분을 리팩터링 할 필요가 없다.

+0

답변 주셔서 감사합니다.'중첩 루프'가 무슨 뜻인지 잘 모르겠습니다. 키워드 '중단'에 대한 언급을 언급하는 경우, 루프 이탈의 존재와 비교하여 if-exit에 대한 내 검색에 동기를 부여하려고했습니다. 또한, 내 예제에서'if condition_a'와'if condition_b'가'if some_condition' 내에 중첩되어 있기 때문에 코드가 어떻게 해결되는지 확신 할 수 없습니다. 'if some_condition'에서 벗어나고 싶습니다. – Roman

-1

저는이 방법으로 코드를 구조화한다는 아이디어를 좋아하지 않습니다. 나는 이것이 goto 문장을 사용하는 것과 같은 문제로 이어질까 봐 걱정한다. (운좋게도 파이썬은 goto 문을 사용하지 않았다.) 실제로 요청이 있었는지에 대한

+0

나는 약간 혼란 스럽다. 어느쪽으로? 일찍 'if'를 종료하려고했거나 답변 중 하나에 응답하고 있습니까? – Roman

11
while some_condition: 
    ... 
    if condition_a: 
     # do something 
     break 
    ... 
    if condition_b: 
     # do something 
     break 
    # more code here 
    break 
+2

아,이 아이디어가 정말 마음에 들어요. 나는 이것이 내 원래의 욕망을 정확하게 해결한다고 생각한다. 그러나, 나는 이것이 좋은 연습이 아니라고 잔소리하는듯한 느낌을 가지고있다. (그리고 그 이유 때문에, 나는 좋은 코딩 스타일을 촉진하기 때문에 현재 받아 들여진 대답을 유지할 것이다.) – Roman

+2

원본을 그대로두고 전체 내용을'while True :'로 감쌀 수 있습니다. 마지막에'break' 문을 넣어야합니다! do-while 구문을 사용하는 언어의 경우 do do (조건부로 나올 수있는 코드) while (false); –

2

, 내 방법은 한 루프 루프 내에서

while (True): 
    if (some_condition): 
     ... 
     if (condition_a): 
      # do something 
      # and then exit the outer if block 
      break 
     ... 
     if (condition_b): 
      # do something 
      # and then exit the outer if block 
      break 
     # more code here 
    # make sure it is looped once 
    break 

테스트를하는 if의를 배치하는 것입니다 그것은 : 두 번째 코드 sample--를 들어

conditions = [True,False] 
some_condition = True 

for condition_a in conditions: 
    for condition_b in conditions: 
     print("\n") 
     print("with condition_a", condition_a) 
     print("with condition_b", condition_b) 
     while (True): 
      if (some_condition): 
       print("checkpoint 1") 
       if (condition_a): 
        # do something 
        # and then exit the outer if block 
        print("checkpoint 2") 
        break 
       print ("checkpoint 3") 
       if (condition_b): 
        # do something 
        # and then exit the outer if block 
        print("checkpoint 4") 
        break 
       print ("checkpoint 5") 
       # more code here 
      # make sure it is looped once 
      break 
관련 문제