[Python] Lazy evaluation / map / filter
Lazy evaluation
-
연산을 늦춘다.
-
필요할 때 값을 순차적으로 전달받을 수 있다.
iterable & iterator
iter(x)
→ iterable 를 iterator 로 변환
x는 iterable 객체
iterable
-
list
,tuple
,dict
,set
… -
next
함수를 사용하여 순차적으로 호출이 불가
iterator
-
map
,filter
,list_iterator
,tuple_iterator
… -
next
함수로 요소를 순차적으로 호출이 가능 -
호출이 모두 끝나면
StopIteration
에러 반환 -
호출이 모두 끝나면 재활용 불가
Example
a = [1,2,3]
k = iter(a)
type(k)
>>> list_iterator
k
라는 변수에 [1,2,3]
를 list_iterator
로 변환시킨 자료를 대입시켰다.
이제 next
함수를 통해 원할 때마다 순차적으로 값을 전달받을 수 있다.
next(k)
>>> 1
next(k)
>>> 2
next(k)
>>> 3
next(k)
>>> StopIteration
map
형태 : map(function, iterable, ...)
인수로 할당된 iterable 자료형의 모든 요소를 function 에 의해 반환된 요소들로
구성된 map
객체 (iterator)를 반환
a = map(lambda x : x*2, [1,2,3])
type(a)
>>> map
lambda 를 통해 function 을 만들고, iterable 객체인 [1,2,3]
을 인수로 하여 map
객체를 만들었다.
list(a)
>>> [2, 4, 6]
리스트화시켜서 결과를 보면 각 리스트의 요소가 두배가 된 것을 알 수 있다.
map
객체 또한 lazy evaluation이 가능하므로 next
함수를 사용가능하다.
next(a)
>>> 2
next(a)
>>> 4
next(a)
>>> 6
next(a)
>>> StopIteration
filter
형태 : filter(function, iterable)
인수로 할당된 iterable 자료형의 모든 요소를 function 에 의해 반환된 결과 중
True 에 해당하는 값을 filter
객체 (Iterator)로 반환
a = filter(lambda x : x > 0, [-3, -2, -1, 0, 1, 2, 3])
type(a)
>>> filter
filter
객체를 만들었다.
list(a)
>>> [1,2,3]
x > 0
의 참에 해당하는 요소만 filter
객체로 반환되어진 것을 알 수 있다.
filter
객체 또한 lazy evaluation 이 가능하므로 next
함수를 사용가능하다.
next(a)
>>> 1
next(a)
>>> 2
next(a)
>>> 3
next(a)
>>> StopIteration
Practice (map & filter)
new = [-2, -1, 0, 1, 2, 3, 4]
정의된 new 리스트에서
- 2 보다 큰 수 중에서
- 3배를 한 값들로 구성된 리스트
Answer
answer = map(lambda x : x * 3, filter(lambda x : x > 2, new))
list(answer)
>>> [9, 12]
Leave a comment