웹 사이트
Dive Into Python
HTML 온라인 eBook 형식: http://diveintopython.org/toc/index.html
다른 형식으로 된 것들도 구할 수 있음: http://diveintopython.org/
Python Grimoire
온라인 문서 (한글 번역본): http://home.paran.com/johnsonj/grimoire/Python%20Grimoire.htm
Jump To Python
온라인 문서 (한글): http://tdd.or.kr/wiki
참고한 글들
Python's Generator Functions
DNA의 Functional Programming in Python
yrange 함수
built-in 함수에 있는 range 함수를 generator 생성 함수 형태로를 구현해보았다.
사용 방법은 range 함수와 동일한데, 아래 구현 내용에서 주의 깊게 보아야 할 부분은 세 가지이다.
default parameter의 문법 특징 상 일반 parameter 앞에 optional parameter를 둘 수 없기 때문에 약간의 꽁수를 사용해서 마치 optional인 것처럼 보이도록 구현한 것 (아래 구현 내용 중 start 인자)
모든 범위의 요소를 한꺼번에 만들지 않고 yield를 사용해서 그때 그때 필요한 값만 반환하도록 구현한 것
Lazy Evaluation
메모리를 절약하고 초기화 비용을 줄일 수 있지만, 같은 index에 대해 중복 참조가 많아질 경우 더 많은 시간이 걸리게 된다. 이것은 generator 내부적으로 현재 index의 값을 구하기 위해 처리해야 하는 연산이 복잡할수록 더욱 심해진다. 그러므로 자주 참조해야 하는 값은 매번 generator를 거치기보다 별도의 변수를 선언하여 그 값을 저장해두고 사용하는 편이 좋다.
외부에서 generator 함수에 값을 전달하는 방법
yield 실행 후 그 반환 값을 구해서 유효성을 검사한 이후 적절할 경우 현재 값을 그 값으로 대체해줌 (아래 구현 내용 중 val 부분)
def yrange(start, stop=None, step=None):
"""yrange([start,] stop[, step]) -> generator function of integer list"""
if not stop:
begin, end, delta = 0, start, 1
elif not step:
begin, end, delta = start, stop, 1
else:
begin, end, delta = start, stop, step
n = begin
while n < end:
val = (yield n)
if val is not None:
n = val
else:
n += delta