티스토리 뷰
파이썬에서는 다른 언어에서는 찾아볼 수 없는 독특한 문법을 가능한 경우가 많은데, 이번 글에 소개할 반복문 제어인 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(2, 10): 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(2, 10): 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문이 쓰이면, 대다수의 파이썬 사용자들은 이런 세 가지 반응을 보이는 경우가 대다수이다.
- 저기 혼자 떨어져 있는 'else'문은 다른 'if'문에서 떨어져 나왔거나, 들여쓰기 실수로 보인다!
- 'for-else'문은 for문이 아예 실행되지 않을 때 'else'문이 실행된다!
- 'for-else'문이 'break'와 연관되어 있는건 맞는데... 실행될때 else문이 실행되나 break되지 않을 때 else문이 실행되는지 헷갈린다!
사용자에게 혼란을 줄 수 있는 문법은 없느니만 못하다.
정확히 for-else문과 while-else문에서 else문이 작동되는 순간은, loop이 아예 실행되지 않을 경우를 포함하여 loop이 모두 제대로 돌았을 때 실행된다. (다른 말로, for loop이 예외를 raise하거나, return이 존재할 경우, else문은 실행되지 않는다.)
논쟁이 많았던 주제이므로 별개의 포스팅으로 다루겠다. 이 글의 목적은 for-else, while-else라는 문법이 존재한다는 것을 소개하는 글이다.
그래도, for-else문은 코드를 간결하고 가독성을 높여주는 문법이며, 혹여나 이 문법을 마주쳤을 때 당황하지 않았으면 한다.
도움이 되었다면 지나가는 길에 하트 하나 눌러주세요, 양질의 글을 쓰는데 하나의 동기부여가 됩니다😍
지적이나 오타 수정 댓글 환영합니다!!
'Python' 카테고리의 다른 글
[Python] "100000000000000000 in range(100000000000000001)"이 0.1초 이상 걸린다고 생각하면 들어오세요. (0) | 2022.05.06 |
---|---|
[Python] 드디어 파이썬에서도 switch-case문이? match-case문에 대하여 알아보자! (0) | 2022.04.23 |
[Python] else문에 관한 깊은 고찰 (if-else vs. for-else / while-else를 중심으로) (0) | 2022.04.22 |
[Python] for문의 친구 range에 관한 모든 것 (0) | 2022.04.22 |
[Python] 정렬 메서드 sort()에 관한 모든 것 (0) | 2022.04.21 |
- Total
- Today
- Yesterday
- Python
- 시간복잡도
- 백준
- Network
- CSAPP
- effective async
- 함수
- 헤더
- equal
- Proactor
- C
- docker
- 알고리즘
- react
- Max
- C++
- BOJ
- GDSC
- 사칙연산
- 제어문
- 수학
- for
- 구현
- BRONZE
- MIN
- JS
- 프로그래밍
- bomblab
- 문자열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |