Python

Python 공부

참고 자료

웹 사이트

Iterator와 Generator

참고한 글들

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

내가 만들어 본 것들