2. 조건문과 반복문


조건문과 반복문이 반복되면 가독성이 떨어지고, 실수할 상황이 발생합니다. 이런 문제를 해결하기 위해 조건문과 반복문에서 할 수 있는 몇 가지 팁을 공유합니다.

2-1. 조건문

함수의 설계에서 조건문은 다음과 같은 방법으로 쓸 수 있습니다.

def process():
    if state :
        return True
    else :
        return False

이 방식을 다르게 쓰면 다음과 같습니다.

def process():
    if state : return True
    return False

if문 등을 통해서 이미 return을 했다면, elifelse를 굳이 사용하지 않아도 됩니다.

함수를 설계하며 가장 중요한 점은 return을 하는 순간 함수의 생명은 끝이라는 것입니다. 이런 return의 특징 때문에 함수 종료를 위해 return을 사용하는 경우도 있습니다. 굳이 이미 끝난 함수의 반복문이나 남은 프로세스를 break 등으로 끊지 않아도 탈출할 수 있다는 것입니다.

그 다음은 3항 연산자를 사용하는 방법이 있습니다. C++에서는 state?True:False와 같은 간결한 표현으로 작성되고, python은 좀 더 직관적입니다.

def process():
    return True if state else False

조건문이 참일 때는 앞의 항을 선택하고, 거짓이면 뒤의 항을 선택합니다. 같은 함수의 표현식이지만 간결한 정도가 다른 것을 알 수 있습니다.

조건문도 여러가지 트릭을 사용하면 쉽게 풀 수 있는 문제가 많습니다. 다음 문제를 풀어보며 왜 clean code가 필요한지 살펴봅시다.

그리고 파이썬의 비교연산은 연속으로 할 수 있습니다. 이를 꼭 잘 활용하도록 합시다.

print(1 < 2 and 2 < 3)
print(1 < 2 < 3)

2-2. 반복문

N by N, 즉 2중 반복문을 돌릴 때의 코드는 다음과 같습니다.

for i in range(N):
    for j in range(N):
        pass

코드의 indent가 적당히 존재하는 경우, 가독성이 뛰어나지만 indent가 3, 4, 5개 늘어나는 순간부터 가독성은 매우 떨어집니다. 이런 경우, 시간에 엄청 큰 영향은 받지 않고 다음과 같은 과정을 거칠 수 있습니다.

for ij in range(N*N):
    i, j = ij//N, ij%N
    pass

i, j가 늘어나고 줄어드는 주기를 사용하면 위의 방식처럼 사용할 수 있습니다. 많이 사용하는 트릭은 아니지만 알아두면 좋습니다. (나중에는 from itertools import product로 더 좋게 사용할 수 있습니다.)

또한 반복문과 조건문이 있을 때는 가독성이 떨어지기 쉽습니다. 예를 들면 다음과 같은 상황이 있습니다.

for i in range(N):
    if state :
        process()

이렇게 반복문과 조건문이 함께가 되는 경우, indent가 계속 늘어날 수 있습니다. 이런 경우에는 조금 바꿔 생각하면 다음과 같이 작성할 수 있습니다.

for i in range(N):
    if not state : continue
    process()

조건문이 참일 때 실행하라가 아닌 조건문이 거짓이면 넘어가라 라고 바꾼 것입니다.