들어가기 전 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다. 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item35 요약 throw 메서드를 사용하면 제네레이터가 마지막으로 실행한 yield 식의 위치에서 예외를 다시 발생시킬 수 있음. throw를 사용하면 가독성이 나빠짐. 예외를 잡아내고 다시 발생시키는 데 준비 코드가 필요하며, 내포 단계가 깊어지기 때문. 제네레이터에서 예외를 제공하는 더 좋은 방법은 __iter__() 메서드를 구현하는 클래스를 사용하면, 예외적인 경우에 상태를 전이시킬 수 있도록 메서드를 제공하는 것이다. Item 35. 제네레이터 안에서 throw로 상태를 변화시키지 마라. 제네레이터를..
들어가기 전 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다. 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item34 요약 send()를 이용하면 제네레이터에 데이터를 전송할 수 있음. 즉, 제네레이터와 양방향 소통이 가능함. send() 메서드는 일반적인 이터레이션(For, next())와 다른 방식으로 동작함. 제네레이터가 시작하기 전에 send()를 사용하면, 반드시 None을 입력값으로 전송해야 함. (시작되지 않았기 때문임) 그 이후 send()를 사용할 때는, 원하는 값을 전송할 수 있음. 여러 제네레이터를 합성해서 사용하는 yield from과 send()를 함께 사용하면, 서로 다른 용법 때문에 가독성..
들어가기 전 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item33 요약 yield from을 사용하면 여러 제네레이터를 합성해서 하나의 제네레이터를 만들 수 있음. 직접 내포된 제네레이터를 이터레이션하면서 각 제네레이터의 출력을 내보내는 것보다 yield from을 사용하는 것이 성능 면에서 더 좋음. yield from def get_generator(): k = list(range(10)) for v in k: yield v def generator(): for v in ["a", "b", "c"]: yield v yield from [1, 2, 3] yield ..
들어가기 전 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item32 요약 리스트 컴프리헨션에서 입력이 크면 메모리 문제가 발생할 수 있음. 제네레이터 식은 한 번에 제네레이터가 반환되기 때문에 메모리를 효율적으로 사용할 수 있음. 제네레이터 식에 다른 제네레이터를 내포할 수 있음. 이를 통해 여러 제네레이터를 하나로 합성할 수 있음. 각 제네레이터는 상태를 가지기 때문에 이 부분을 유의해서 사용해야 함. 합성된 제네레이터 식은 매우 빠르게 실행되며 메모리도 효율적으로 사용함. Item 32. 긴 리스트 컴프리헨션보다는 제네레이터 식을 사용하라. # 리스트 컴프리헨션 사..
들어가기 전 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다. 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item30 요약 제네레이터를 사용하면 결과를 리스트에 합쳐서 반환하는 것보다 더 깔끔함. 제네레이터를 사용하면, 결과를 리스트로 반환하는 것에 비해 적은 메모리로 작업 가능함. (OOM Kill 방지) 처음 제네레이터 함수가 호출되면 이터레이터가 반환됨. 반환된 이터레이터를 next()로 호출할 때 마다 yield부터 다시 시작함. 제네레이터가 반환하는 이터레이터는 상태가 있기 때문에 재사용이 불가능하다는 것을 염두해야함. Item 30. 리스트를 반환하기보다는 제너레이터를 반환하라. 파이썬으로 코드를 작성할 ..