Computer Science/파이썬(Python)

Python if comprehension

_빌런 2023. 3. 28. 16:02
def func():
    if (condition_1):
        if (condition_2):
            if (condition_3):
                # Code
            else:
                # Code
        else:
            # Code
    else:
        #Code

이런 식의 if문 중첩 코드를 본 적이 있고 초심자라면 누구나 한 번은 작성해 보았을 것이다.

하지만 이렇게 작성하면 가독성도 떨어질 뿐더러, 나중에 다시 보면 기억이 나지 않는다. 주석의 중요성

이런 경우에 사용하는 코드 최적화 기법은 아니지만, 유용했던 if문 one-liners 기법을 정리한다.

(위의 코드를 최적화하기 위해서는 not을 사용해서 코드를 정리해야 한다.)

 

이제 정리할 One-Liners 기법은 간단한 if문을 정리하는 방법이다.

if, if-else, if-elif-else의 경우에 따라 간단하게 정리했다.

(One-Liners  기법에는 if만 있지는 않다. comprehension 같은 것도 전부 One-Liners라고 부른다.)

 

# General Code
if a == 1:
    print(a)


# One-line Code
if a == 1: print(a)

예외가 없는 단일 if문은 일반적인 방법이나 One-line이나 크게 차이가 없다.

마치 C에서 if문 단일 문장은 중괄호 { }를 사용하지 않고 바로 옆에 적는 것과 비슷한 느낌이다.

단지 저런 간단한 if를 여러 줄에 걸쳐 작성할 필요가 없다는 거다.

 

# General Code
if a == 1:
    print(1)
else:
    print(0)

# One-line Code: <결과> = A if <조건식> else B
print(1) if a == 1 else print(0)

"<결과> = A if <조건식> else B"라고 거창하게 적어놓았지만 이렇게까지 쓸 필요도 없다.
print(1) if a == 1 else print(0)

위의 코드를 읽어보자.

1을 출력해라, 만약 a가 1이라면, 아니라면 0을 출력해라.

너무나 자연스러운 읽기 방식 그대로 적용되었다. 차이점이라고는 if 뒤에 콜론(:)이 없다는 것.

 

주의할 점은 break, continue, pass, retrun과 같은 명령어를 사용하려면 One-line으로는 안 된다.

가령 break if a == 0 else continue라는 식이 있다고 가정해보자.

인터프리터가 break를 보는 순간 뒤의 코드는 해석하지 않고 곧바로 종료할 것이다.

이런 경우에는 여러 줄에 걸쳐서 작성해주자.

 

# General Code
a = -1
if a == 1:
    print(1)
elif a == -1:
    print(-1)
else:
    print(0)
    
    
# One-line Code
a = -1
print(1) if a == 1 else print(-1) if a == -1 else print(0)

조건(elif) 개수가 많은 식이라면, 그리고 그냥 if-elif-else라면 일반적으로 적는 것이 가독성이 더 좋다.

개인적으로 if-else의 One-Line은 즐겨쓰지만, if-elif-else는 잘 사용하지는 않는다.

 

천천히 읽어보면 그렇게 어렵지 않다. 약간 Excel에서 다중 if문을 사용하는 느낌이 든다.

print(1) if a == 1 else print(-1) if a== -1 else print(0)

1을 출력해라, a가 1이라면, 아니면 -1을 출력해라 a가 -1이라면 그것도 아니라면 0을 출력해라.

elif가 사라지고 if else if else 형식으로 변한 것이 특징이다.

 

이런 One-line은 의미가 있나 싶다.

하지만 그건 내 생각이고 의미가 있기에 존재할 것이라 생각한다.

하지만 이러한 것도 있다하고 알아는 둬야 한다고 생각한다.

(실제로는 사용하지 않고, Code Refactoring할 때 사용할지도?)