2021년 1월 14일
[파이썬] 컴프리헨션(Comprehension)
컴프리헨션(Comprehension)
- 수학의 집합에서 특정 수식을 사용하는 방식처럼 파이썬에서 간단한 표현식을 작성하는 기법
- 리터럴 표기법으로 원소를 나열하여 객체 생성 시 원소가 많으면 모두 나열하기 어려우므로 간단한 표현식으로 작성
I. 리스트 컴프리헨션
- 리스트 객체 생성 시 원소 나열 방식으로 리터럴 표기법 사용
- 객체의 원소가 많은 경우 대괄호 안에 표현식을 작성하여 원소를 나열
- [예제] map함수에 대한 리스트 컴프리헨션
list1 = [1,2,3,4,5] m = map(lambda x : x * x, list1) print(m) # 클래스를 객체로 만들어서 반환 print([*m]) # map 객체에 별표를 붙이면 원소를 변환하여 리스트 내 표시 ### 위 클래스로 작성한 것을 아래 컴프리헨션으로 간단히 작성 ### ch = [x * x for x in list1] # 원소를 하나씩 처리하기 위해 인라인으로 for 문 사용 print(ch) [결과] <map object at 0x02FE1FD0> [1, 4, 9, 16, 25] [1, 4, 9, 16, 25]
II. 딕셔너리와 집합 컴프리헨션
- 딕셔너리(dict)와 집합(set)도 리스트 컴프리헨션과 유사한 표기법 사용
- 딕셔너리와 집합은 중괄호를 사용하여 원소가 하나인지 쌍인지 구별
- [예제] 딕셔너리와 집합 컴프리헨션
set1 = {1,2,3,4,5} m = map(lambda x : x * x, set1) # 집합을 map에 넣어 처리 가능 print({*m}) list1 = [('a', 1), ('b', 2)] def func1(x) : # 함수 생성 x = list(x) # 인자로 전달된 튜플을 리스트로 변환 x[1] = x[1] * x[1] # 첫 번째 원소를 곱 연산하여 첫 번째 원소에 할당 x = tuple(x) # 다시 튜플로 변환 return x m2 = map(lambda x : func1(x), list1) # 리스트 전달 시 함수의 변환을 람다 함수로 표시 시 정의된 함수를 표현식에 넣어 실행 print([*m2]) print({x : y * y for x, y in list1}) # 딕셔너리 컴프리헨션으로 두 값을 곱 연산하도록 별도 함수 없이 처리 [결과] {1, 4, 9, 16, 25} [('a', 1), ('b', 4)] {'a': 1, 'b': 4}
III. 컴프리헨션 처리 시 고려사항
가. 컴프리헨션 지역변수 외부 사용 불가
- 컴프리헨션은 함수처럼 지역 이름공간을 사용하므로 컴프리헨션에 정의된 변수는 외부 사용 불가
- [예제] 컴프리헨션 지역변수 외부 사용
list1 = [x for x in range(10)] # 리스트 컴프리헨션 사용 변수는 지역 이름공간으로 처리 print(list1) print(x) # 리스트 컴프리헨션 사용 변수 확인(에러 발생) [결과] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Traceback (most recent call last): File "c:\python.py", line 3, in <module> print(x) NameError: name 'x' is not defined
나. 동적 반복자는 내부 원소 처리
- 반복자 클래스로 객체 생성 후 그 객체로 내부 원소 처리해야 함
[참고]
- 잇플, “한 권으로 개발자가 원하던 파이썬 심화 A to Z”, 2019.11