여느 언어에나 코드 량을 줄이기 위한 다양한 기법들이 존재합니다. 그 중에서 대표적인 것 중 하나인 3 항 연사자를 파이썬에서도 사용가능 합니다. 파이썬 언어의 장점 중에 하나가 타 언어에 비해 훨씬 적은 분량으로 똑같은 코드를 작성할 수 있는 것이기에, 3 항 연산자가 있는건 당연하다 할 수 있습니다. 3 항연산자는 일반적으로 아래와 같이 사용됩니다. (C, Java 등)
result = condition ? when True : when False;
그런데, python 의 경우에는 위처럼 보통의 경우와 3 항 연산자가 조금 다릅니다. 다르기만 할뿐 아니라 3 항 연산자를 처리하는 방법이 한 가지가 아니라 두 가지나 있습니다. 예전에는 파이썬에서도 한 가지 방법(and 와 or)만 있었습니다만, 파이썬 2.5 버전부터 새로운 방법(if 와 else)이 나왔습니다. 한가지 형태의 연산만 있으면 될텐데 굳이 새로운 방법을 만든 이유는 뭘까요? 우선 첫번째 방법 부터 살펴보도록 하죠.
1. and 와 or 를 이용한 3 항 연산자
# result = condition and when True or when False;
a = 10
b = 20
result = a == b and a-b or a+b # 결과는 a+b = 30
삼항 연산자의 condition 이 True 면 and 뒤의 연산이 return 되고, condition 이 False 면 or 뒤의 연산이 return 됩니다. C 나 Java 에서 사용하는 방식과 동일한 형태이지만, 단지 '?'가 'and'가 되고, ':'가 'or'가 되는 것입니다. 이것이 가능한 이유는 그다지 어렵지 않게 이해할 수 있습니다.
파이썬에서 a and b or c 라는 연산이 있습니다. 이 연산을 조금 변형시키면 (a and b) or c 로 바꿀 수 있겠습니다. 그런뒤 파이썬 인터프리터가 실행되면, 인터프리터는 우선 (a and b)의 a 를 확인합니다. a 가 True 면 b 를 확인하고, a 가 False 면 (a and b)가 False 가 되므로 바로 c 를 확인하게 됩니다. 만약 a 가 True 일때 b 가 True 면 c 는 확인할 필요가 없으므로 b 가 리턴됩니다. 반대로 a 가 False 면, 바로 c 를 확인합니다. 이때, c 가 True 든 False 든간에 그 결과값을 무조건 return 하기 때문에 a 가 False 일때는 c 가 리턴된다는 것이죠. 이해가 가실지 모르겠네요(설명이...ㅠㅠ). 파이썬 콘솔로 직접 이것저것 해보시다 보면 아마 이해될거라 생각합니다.
그런데 위 설명을 잘 뜯어보면 어딘가 문제가 있습니다. 어떤 문제인지 확인하기 위해 아래 예제를 살펴보겠습니다.
a = 10
b = 10
result = a == b and a-b or a+b # 결과는 a+b = 20 ???????
a 가 10 이고 b 가 10 일때 a == b 는 True 가 되므로 result 는 당연히 a-b = 10 이 되야 하는데, 결과는 a+b = 20 이 되었습니다. 왜 그런걸까요? 3 항 연산자 공식에 문제는 없어 보이는데 말이죠.
문제는 a and b or c 에서 b 가 0 일때 발생합니다. 무슨말이냐면, 컴퓨터 과학에서 0 이라는 것은 False 를 의미하기도 하죠. 그래서 a 가 True 라고 해도 b 가 0 이 되면 False 로 인지되기 때문에 결국에는 C 를 리턴하게 되는 것입니다. 왜 이런 문제가 발생하도록 3 항 연산자를 만들었는지 모르겠습니다만, 아마도 이 문제를 보완하기 위해서 파이썬 2.5 버전부터 if 와 else 를 사용한 3 항 연산자를 새로 만들게 된것 같습니다.
2. if 와 else 를 이용한 3 항 연산자
# result = when True if condition else when False;
a = 10
b = 20
result = (a-b) if a == b else (a+b) # 결과는 a+b = 30
if 문을 이용한 3 항 연산자는 파이썬 언어의 특징을 잘 보여줍니다. 결과가 먼저 나와 있고, 그 뒤에 조건(condition)이 있습니다. 만약 이 조건이 참이면 그대로 맨처음 연산을 리턴하고, 거짓이면 마지막 else 뒤의 연산을 리턴하게 됩니다. 이해하기 어렵지는 않습니다만, 처음 파이썬을 접한 사람들에게는 조금 생소한 코드 형태일 수도 있는데요. 일반적으로 사용하는 3 항 연산자와 구조가 달라서 그럴지도 모릅니다. 하지만 파이썬에 익숙해지다 보면, 금방 익숙해 질 수 있습니다.
이러한 형태의 코드는 for 문을 사용하여 list 를 만들때도 비슷하게 적용할 수 있는데요.
list = [ idx for idx in range(10)]
# list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
루프의 결과를 맨앞에 나열하고 그 뒤에 조건이나 for 문을 나열하여 여러 줄로 만들어야 할 코드를 한줄로 만들어 버렸습니다. 보통 다른 언어에서는 두줄내지 세줄은 할애해야 할텐데 파이썬에서는 단 1 줄로 쉽게 처리할 수 있습니다. 아마 이러한 코드가 파이썬이 추구하는 형태의 코드 스타일이 아닐까 생각합니다. 이 외에도 튜플을 만들때나 두 변수간의 값을 교환할 때도 다른 언어와는 다르게 훨씬 간단하게 처리할 수 있습니다(직접 찾아보시길).
결론 :
and 와 or 를 이용한 3 항연산자는 가급적 지양하고, if 와 else 를 이용한 3 항 연산자에 익숙해지자!