본문으로 바로가기

Python: Comprehension

category Programming/Python 2021. 1. 5. 16:10
반응형

파이썬에 대한 내용을 정리하면서, 참 재미난 언어라는 생각을 갖게 만든 장본인이 Comprehension이다.
처음에는 컴프리헨션이라는 단어의 뜻으로 '이해'만 알고 있어서, 왜 컴프리헨션이라는 이름이 붙게 되었을까 라는 생각을 가졌었다. '포함' 또는 '함축'이라는 뜻도 함께 가지고 있다는 것을 알고난 다음에는 이런 의문이 사라지긴 했지만... ㅎㅎ
컴프리헨션은 데이터 타입이라기 보다는 데이터 타입을 만드는 컴팩트한 방법이라고 할 수 있다.

프로그램을 작성하는 과정에서 1에서 5 사이의 정수값으로 구성된 리스트 하나가 필요하다고 가정해보자. 위 그림과 같이 1에서 5까지의 정수값을 직접 정의하는 방식으로 리스트를 만들어줄 수 있다.
1에서 5 사이의 정수이기 때문에 직접 정의하는 방법도 나쁘지 않다. 하지만, 극단적으로 늘어나는 범위의 원소를 갖는 리스트의 정의가 필요할 때, 위 그림과 같은 방법은 결코 좋은 방법이 될 수 없다.

이런 경우에 생각할 수 있는 가장 간단한 방법은 위 그림과 같이 range 함수의 반환 결과를 리스트로 변경하는 방법일 것이다.
그럼 여기서, 주어진 범위 안의 값 중 홀수의 값만 원소로 갖는 리스트를 생성한다는 조건을 추가해보자.

이것 역시 위 그림과 같이 range 함수의 매개 변수를 적당히 조절하여 생성할 수 있지만,

위 그림과 같이 약간의 프로그램 코드를 이용하여 생성할 수도 있다. 얻는 결과만 놓고 본다면 range 함수의 매개 변수를 조절하는 전자의 방식이 유리하고 현명해 보일 수 있지만, 더욱 복잡하고 다양한 조건이 가미되는 상황에서는 후자의 경우가 더욱 매력적으로 다가온다. 하지만, 프로그램 코드를 이용하는 방식은 필요로 하는 데이터 타입이 많아질수록 코드의 전체적인 길이가 길어지는 등의 단점도 함께 가지고 있다.
그럼 range 함수를 사용했을 때와 같이 코드의 길이가 짧으면서 다양한 조건을 처리할 수 있는 형태가 있다면 최상의 선택지가 되지 않을까?????

위 그림은 앞에서의 프로그램과 같은 결과를 보다 함축적인 방식으로 구현한 프로그램이다. 이렇게 리스트나 셋, 그리고 딕셔너리와 같은 순회 가능 개체를 정의할 때, 함축된 한 줄의 코드 라인으로 요구되는 여러 조건들이 반영된 데이터를 추출하는 방식을 컴프리헨션이라고 한다.

지금까지의 예만으로는 컴프리헨션을 양날의 검이라고 생각할 수도 있다. 파이썬만이 가지고 있는 이런 기발한 프로그래밍 기법이 하루가 멀다하고 새로운 프로그래밍 언어들이 탄생하는 현 시대에서는 오히려 개발자에게 독이 될 수 있다고 나 역시도 생각했었다.

하지만, 위의 예를 한번 보자. 단 한 줄의 코드만으로 문자열을 구성하고 있는 문자의 갯수를 하나의 딕셔너리 타입으로 정의하고 있다. 파이썬에서는 이렇게 순회 가능 개체를 컴프리헨션이라는 기발한 방식으로 간단히 정의하고 사용할 수 있다. (튜플은 약간 결이 다르므로, 잠시 논외로...)
다시 말해, 여러 프로그래밍 언어를 접할 수 밖에 없는 현 시대에는 이런 특정 언어의 유니크함이 반대로 독이 될 수도 있지만, 그것이 주는 효과가 무시하기에 너무 크다면, 받아들이는 것이 현명하지 않겠냐는 의미이고, 그런 관점에서 파이썬을 참 재미나게 만들어주기에 컴프리헨션이 가지고 있는 지분은 상당하다고 생각한다는 것이다.

그럼, 튜플은 왜 결이 다른가?? 라는 부분에 대한 내용도 살펴볼 필요가 있다. 위 그림은 홀수 값을 원소로 갖는 리스트 컴프리헨션의 내용을 튜플에 적용했을 때의 결과를 보여주고 있다. 1, 3, 5의 원소가 소괄호에 묶인 튜플을 기대했으나, 전혀 엉뚱한 문장이 출력으로 반환되었고, 이것을 제네레이터 객체라고 부른다.

위 그림을 보면, 소괄호 안에 컴프리헨션을 구성하면서 제네레이터 객체가 생성되었지만, 리스트와 같은 다른 순회 가능 개체 타입으로 변환했을 때, 원하는 데이터가 추출되었다는 것을 간접적으로 확인할 수 있다. 다시 말해, 컴프리헨션만으로 튜플을 정의할 수는 없지만, 생성된 제네레이터 객체를 튜플로 변환하는 것은 가능하다는 의미이다. (그래서 결이 다르다고 표현하였다.)

 

반응형

'Programming > Python' 카테고리의 다른 글

Python: Function (2)  (0) 2021.01.15
Python: Function (1)  (0) 2021.01.12
Python: Dictionary  (0) 2021.01.03
Python: Set  (0) 2021.01.02
Python: Tuple  (0) 2021.01.01