티스토리 뷰

반응형

파이썬에서는 다른 언어에서는 찾아볼 수 없는 독특한 문법을 가능한 경우가 많은데, 이번 글에 소개할 반복문 제어인 for-else문 / while-else문도 그 한 가지이다.

 

바로 본론으로 들어가보자.

thumbnail
for-else, while-else에 대하여 알아보자.


1. for - else

일반적으로 for문을 활용하면 break, continue, pass과 같은 제어문 문법을 활용한다.

 

여기에 else문을 추가할 수 있다는 것을 아는가? 모르는 사람들이 대다수일 것이다.

 

다음과 같은 코드가 작성되어 있다고 작성하자.

 

이 코드는 2부터 9까지 각 수가 소수인지 아닌지 판단하는 간단한 코드이다. 만약 소수일 경우 'num is a prime number'가 출력되고, 아닐 경우 그 수를 두 수의 곱으로 출력하는 코드이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
# -*- coding: utf-8 -*-
for num in range(210):
    num_is_prime = True
    for i in range(2, num):
        if (num % i == 0):
        # 만약 소수가 아닐 경우
            num_is_prime = False
            print(num, 'equals', i, '*', num//i)
            break
    if num_is_prime:
    # 만약 소수일 경우
        print(num, 'is a prime number')
cs

 

그러나, 이를 for-else문을 이용하면 색다르게 코드를 작성할 수 있다.

 

대다수의 for-else 문에서의 else의 역할은, 만약 for문 안의 'break'문이 실행되지 않을 때 실행된다. 위의 코드의 경우 어떤 수로도 나누어 떨어지지 않아 'break'문이 실행되지 않을 경우 else문이 실행된다.

 

위 코드를 for-else문으로 수정하면 다음과 같이 작성할 수 있다. 코드가 훨씬 간결해졌다. 이 경우 else가 if와 대응되는 것이 아닌, for문과 대응되고 있다는 것을 확인할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
# -*- coding: utf-8 -*-
for num in range(210):
    for i in range(2, num):
        if (num % i == 0):
        # 만약 소수가 아닐 경우
            print(num, 'equals', i, '*', num//i)
            break
    else:
    # 만약 소수일 경우
        print(num, 'is a prime number')
cs

 

위 경우 (num%i == 0)일 경우 break문이 발동하기에, 모든 i에 대하여 num이 나누어떨어지지 않으면 else문이 실행되는 구조이다.


2. while - else

while-else도 for-else와 같은 맥락으로 이해하면 쉽다. 다만, while문은 조건이 만족하지 않을 때 else문이 실행된다.

 

다음과 같이 while - else의 예제 코드를 살펴보자.

 

1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*-
num = 2
while num < 10:
    print(num)
    num += 1
else:
    # num이 10 이상일 경우
    print(num, 'is not smaller than 10')
cs

 

위의 예제에서 num을 2부터 증가시키는데 조건인 (num < 10)이 True가 아니라면 else문이 실행되게 된다.

 

따라서, 위 코드의 출력은 다음과 같다.

 

1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
10 is not smaller than 10
cs

3. 필요할까?

논란이 많은 주제이다. 이러한 syntax 혼란은 else에서 기인하는데, else에 관한 이야기는 다른 포스팅에서 다루겠다.

 

이 단락에서는 for-else를 위주로 다루겠다. while-else도 같은 맥락으로 이해하면 될 것 같다.

 

먼저, 두 코드를 비교해보자. 위 코드는 for-else문을 사용하지 않았을 때이고, 아래 코드는 for-else문을 사용했을 때이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -*- coding: utf-8 -*-
# not using for-else
flag = False
for i in some_list:
    if i == condition:
        flag = True
        break
    do_something(i)
if not flag:
    raise ValueError("Error")
 
# ---------------------------------
 
# using for-else
for i in some_list:
    if i == condition:
        break
    do_something(i)
else:
    raise ValueError("Error")
cs

 

for-else문을 사용하였을 시 외부 변수인 flag를 사용하지 않았고, raise가 for-else문과 연결되어 있어 더 보기 간결하다. 이처럼 for-else문은 여러 장점을 지니고 있다.

 

그러나, for-else가 많은 파이썬 사용자들에게 공감을 얻지 못하는 것은 사실이다.

 

for-else문이 쓰이면, 대다수의 파이썬 사용자들은 이런 세 가지 반응을 보이는 경우가 대다수이다.

 

  1. 저기 혼자 떨어져 있는 'else'문은 다른 'if'문에서 떨어져 나왔거나, 들여쓰기 실수로 보인다!
  2. 'for-else'문은 for문이 아예 실행되지 않을 때 'else'문이 실행된다!
  3. 'for-else'문이 'break'와 연관되어 있는건 맞는데... 실행될때 else문이 실행되나 break되지 않을 때 else문이 실행되는지 헷갈린다!

 

사용자에게 혼란을 줄 수 있는 문법은 없느니만 못하다.

 

정확히 for-else문과 while-else문에서 else문이 작동되는 순간은, loop이 아예 실행되지 않을 경우를 포함하여 loop이 모두 제대로 돌았을 때 실행된다. (다른 말로, for loop이 예외를 raise하거나, return이 존재할 경우, else문은 실행되지 않는다.)

 

논쟁이 많았던 주제이므로 별개의 포스팅으로 다루겠다. 이 글의 목적은 for-else, while-else라는 문법이 존재한다는 것을 소개하는 글이다.

 

그래도, for-else문은 코드를 간결하고 가독성을 높여주는 문법이며, 혹여나 이 문법을 마주쳤을 때 당황하지 않았으면 한다.


도움이 되었다면 지나가는 길에 하트 하나 눌러주세요, 양질의 글을 쓰는데 하나의 동기부여가 됩니다😍

지적이나 오타 수정 댓글 환영합니다!!

 

 

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함