pythonic 한 코드에서 꼭 볼 수 있는 문법 중 하나가 comprehension 이 아닌가 싶다. 뜬금없는 고백이지만 나는 comprehension을 너무나 사랑한다. 코드가 간결해짐과 동시에 속도까지 단순 for문보다 미세하게 빠르니 너무 맘에 든다. 조건문과 중첩 for문 등이 필요하지 않다면, 오히려 단순한 반복문은 comprehension 으로 사용하려는 편인 것 같다. 내가 사랑하는 List, Dict의 Comprehension 과 Tuple 과 Comprehension 문법을 결합했을 때 정의되는 Generator 에 대해 정리하고자 한다
- 반복문을 Python에서 한줄로 표현 가능하고, 성능도 미세하지만 빠르다.
- Map, Filter와 함께 쓸 경우, 연산 속도를 더욱 줄일 수 있다
# List Comprehension
list1 = [ord(s) for s in chars if ord(s) > 40]
# List Comprehension + filter + map
list2 = list(filter(lambda x : x > 40, map(ord, chars)))
# Dictionary Comprehension
alphabets = ['a', 'b', 'c']
dict1 = {char:idx for idx, char in enumerate(alphabets)}
print(list1)
print(list2)
print(dict1)
"""
Outputs:
[43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]
[43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]
{'a':0, 'b':1, 'c':2}
"""
- Tuple을 Comprehension 문법으로 작성하면 generator를 정의할 수 있다.
- generator는 Iterator 객체로서 한번에 모든 원소값을 메모리에 할당하지 않고, 실행마다 원소 하나씩을 반환하고, 다음 실행할 위치를 저장하는 방식으로 작동한다. 따라서 메모리 사용 효율성이 비교적 좋다
그렇다면 Iterator 객체는 무엇인가. __next__를 가진 객체로서, next method를 통해 원소를 순서대로 하나씩 반환한다. Iterator 객체는 Iterable 하다고도 할 수 있다. Iterable하다는 것은 __iter__를 가짐으로써 for문에 사용할 수 있는 객체를 의미한다. Iterator 객체 또한 for문에서 사용가능하므로 Iterable 하다고도 할 수 있다. 그러나 주의할 것은 Iterable한 객체들이 모두 Iterator는 아니다. 왜냐하면 __next__ method를 반드시 정의해서 사용하는 것은 아니기 때문이다
# Generator : 한 번에 한 개의 항목을 생성 (메모리 유지X)
tuple_g = (ord(s) for s in chars)
print(tuple_g)
"""
Outputs:
<generator object <genexpr> at 0x000001FD21F09F20>
"""
List Comprehension을 사용하여 효율적이고 pythonic하게 NameTuple 객체를 생성할 수 있다
numbers = [str(n) for n in range(1, 21)]
ranks = 'A B C D'.split()
# NamedTuple 선언
Classes = namedtuple('Classes', ['rank', 'number'])
# List Comprehension으로 NamedTuple 객체 생성
students = [Classes(rank, number) for rank in ranks for number in numbers]
set, set comprehension, frozen set (0) | 2022.04.27 |
---|---|
dict와 hash, defaultdict 와 frozendict (0) | 2022.04.26 |
NamedTuple (0) | 2022.04.20 |
Python 자료구조의 category (Sequence, Container, Flat, Mutable, Immutable) (0) | 2022.04.17 |
Magic Method (4) - __bool__ (0) | 2022.04.16 |
댓글 영역