[python] Comprehension, Generator / iterator VS iterable / itertools
List Comprehension
- 확실히 일반 for문 보다 속도 우위가 있다.
- reduce 사용한 코드와 비교해서 더 깔끔한 것으로 선택하면 될 듯. map filter도 마찬가지
- 보통 reduce를 사용해야 하는 경우라면 list comprehension이 더 깔끔한 경우가 많기는 하다.
- 순서가 보장된다. https://stackoverflow.com/questions/1286167/is-the-order-of-results-coming-from-a-list-comprehension-guaranteed
`` result``를 `` a`` 리스트의 요소들 중 짝수인 요소들만 골라 `` *3`` 한 값들로 채우려면
```python
result = [num * 3 for num in a if num % 2 == 0]
```
``python for``문은 위에서 부터 걸린다.
```python
[표현식 for 항목1 in 반복가능객체1 if 조건1
for 항목2 in 반복가능객체2 if 조건2]
```
Dictionary Comprehension, Set Comprehension
```python
dict = {key_expr : value_expr for expr in iterable}
_set = {entry[0] for entry in data}
```
list와 iterator의 차이
iterator는 ``next()`` 메소드로 데이터를 순차적으로 호출할 수 있는 객체를 말한다.
iterable은 그냥 for문 같은데 넣어서 반복할 수 있는 속성을 말한다.
그래서 list는 iterable하지만 iterator는 아니다.
``next()``에 list를 인자로 넘기면 iterator가 아니라는 에러가 발생한다.
``next()``를 사용해 끝까지 순회하면 ``StopIteration``이 발생한다.
iterator는 한번 사용하고 나면 소모되어 버린다.
list 보다는 iterator를 사용하는 편이 메모리 효율이 좋다.
Generator
iterator를 직접 구현하려면 `` __iter__``과 `` __next__()``를 구현해야 하고 ``raise StopIteration``해야 하는 등 이래저래 귀찮다.
그래서 파이썬에서는 generator function을 사용해 쉽게 iterator를 구현할 수 있도록 지원한다.
generator function에서는 ``yield``를 이용해 iterator를 리턴하며, 이렇게 generator function에 의해 만들어진 iterator를 generator라고 부른다.
Generator Expression
list comprehension의 경우 slow_func가 1000번 실행되어 리스트를 전부 채울 때 까지 저 문장에서 블록된다.
그러나 generator expression은 g의 next()가 호출될 때 마다(실제로 next()를 호출하든, for문의 iterator로 들어가서 자동으로 호출되든) slow_func()를 한번 씩 호출하게 된다.
즉 실제로 generator 값이 필요한 순간에 연산을 진행하게 된다.
itertools
이거랑 반대로 [1, 2], ('a', 'b')를 (1, 'a')와 (2, 'b')로 반환받고 싶다면 `` zip``을 써야한다.
'Languages & Frameworks > Python' 카테고리의 다른 글
[python] directory parse / glob / pathlib (0) | 2017.07.02 |
---|---|
[python] 람다(lambda), 함수형 fileter / map / reduce (2) | 2017.07.02 |
[python] binary data와 16진수 / struct.pack (0) | 2017.05.09 |
[python] 출력 관련 : 문자열, str <> bytes, bytearray (2) | 2017.05.09 |
[python] Jupyter notebook (2) | 2017.04.16 |