소수 찾기 문제를 해결하면서 for문을 탈출하기 위한 방법을 찾다가 파이썬에만 존재하는 for ~ else 구문을 알게 되어 정리해보려 한다.
아래 코드는 i가 소수인지 아닌지 판별하는 코드임을 3줄만 읽어도 모두가 알 것이다.
for 문을 돌면서, i가 소수가 아닐 때도 어떤 action을 하고 싶어서 if ~ else 구문을 작성해 주었다.
for i in range(2, 11):
for j in range(2, i):
if i % j == 0:
print(f'{i}는 소수 아님')
break
else:
print(f'{i}는 소수')
break
하지만 이 코드는 우리가 원하는 대로 결과를 출력하지 않는다.
우리는 i가 소수이면 'i는 소수'를, 소수가 아니면 'i는 소수 아님'을 출력하길 원한다.
하지만, i=2일 때는 두 번째 for문의 range 범위 자체가 불가능하기 때문에 어떠한 출력도 되지 않고 i=3으로 넘어갔다.
그럼 어떻게 코드를 고쳐야 우리가 원하는 대로 2를 포함하여 모든 값이 소수인지, 소수가 아닌지 출력할 수 있을까?
for i in range(2, 11):
for j in range(2, i):
if i % j == 0:
print(f'{i}는 소수 아님')
break
else:
print(f'{i}는 소수')
위와 같이 코드를 고쳐보았다. 달라진 점은 보통 if문과 함께 쓰이는 else를 for문과 함께 사용했다는 점이다.
어떻게 작동하는지 직접 코드를 실행시켜 보면 우리가 원하는 결과가 출력되었음을 알 수 있다.
for ~ else 문은 어떤 흐름으로 작동된 것일지 살펴보자.
else는 for문이 break 되지 않고 정상적으로 작동했을 때 실행된다.
위 코드에서 if문을 가지고 있는 두 번째 for문이 break 되지 않았으면 else문을 실행하는 것이다.
i가 2일 때 처음에는 어떠한 출력도 되지 않았다. 하지만 for~else문을 사용했을 때는 정상적으로 출력되었다.
이는, i가 2일 때 두 번째 for문이 break 되지 않았기 때문에 else문으로 넘어간 것이다.
만약, if문에 break가 없었으면 어떻게 되었을까?
for문을 멈추지 않았기 때문에 i가 소수일 때에도 if 아래에 있는 else문이 항상 실행된다.
else의 입장에서는 for문이 break 되지 않았을 때 실행되는 것이고
if의 입장에서는 break를 했기 때문에 하위 코드인 else를 실행하지 않는 것으로 볼 수 있다.
어떨 때 for~else문을 쓸 수 있는지 생각해 보면 다음과 같다.
for문 안에 if 조건에 따라 break를 해야 하는 경우, break를 하지 않는 때(=조건에 만족하지 않는 때)에 필요한 action이 있으면 else를 사용할 수 있다.