4. Comprehensions and Generators

컴프리헨션과 제네레이터에 대해 알아보자.

27. Use comprehensions instead of map and filter.

  • 리스트 컴프리헨션은 람다를 필요로 하지 않으므로 map과 filter보다 명확하다.
  • 리스트 컴프리헨션은 입력 리스트에서 항목을 스킵할 수 있게 한다. map은 filter의 도움을 받지 않으면 어렵다.
  • 딕셔너리와 셋도 컴프리헨션을 통해 생성될 수 있다.

28. Avoid more than two control subexpressions in comprehensions.

  • 컴프리헨션은 복수의 루프 단계를 지원하며 루프 단계마다 복수의 조건문을 걸 수 있다.
  • 컴프리헨션에서 3개 이상의 제어 표현식은 가독성을 매우 떨어트리므로 지양하라.

29. Avoid repeated work in comprehensions by using assignment expressions.

  • 대입 표현식은 컴프리헨션과 제네레이터 표현식에서 표현식 내 사용되었던 값을 재사용할 수 있게 해준다. 이는 가독성과 성능을 향상시킨다.
  • 컴프리헨션과 제네레이터 표현식 밖에서 대입 표현식을 쓰는 것을 지양하라.

30. Consider generators instead of returning lists.

  • 제네레이터를 쓰는 것이 누적 결과를 리스트로 리턴하는 것보다 깔끔할 수 있다.
  • 제네레이터에 의해 반환된 이터레이터는 제네레이터 내 yield 표현식에 전달된 값들을 제공한다.
  • 제네레이터는 전체 입력과 출력을 메모리에 담지 않으므로 임의로 큰 입력들에 대한 출력을 생성할 수 있다.

31. Be defensive when iterating over arguments.

  • 입력 인자들을 여러 번 순회하는 함수에 주의하라. 입력 인자에 이터레이터가 있다면 이상한 동작이 일어난다.
  • Python의 이터레이터 프로토콜은 컨테이너와 이터레이터가 iter, next 내장 함수, for문 및 관계된 표현식들과 상호 작용하는 법을 정의한다.
  • 제네레이터로 __iter__ 메소드를 정의하면 순회 가능한 컨테이너 타입을 만들 수 있다.
  • iter에 넘겨준 값이 반환값과 같은지 여부로 객체가 이터레이터인지를 판별할 수 있다. isinstance(collections.abc.Iterator)를 쓸 수도 있다.

32. Consider generator expressions for large list comprehensions.

  • 리스트 컴프리헨션은 큰 입력에 대해 메모리를 많이 사용한다.
  • 제네레이터 표현식은 이터레이터와 동일하게 한 번에 하나의 출력만 하므로 메모리 문제가 없다.
  • 한 제네레이터 표현식 내의 이터레이터를 다른 표현식 내 for 부분표현식에 넘겨 줘서 제네레이터 표현식을 만들 수 있다.
  • 제네레이터 표현식끼리 연결되었을 때 메모리와 동작 시간 모두 좋은 성능을 낸다.

33. Compose multiple generators with yield from.

  • yield from 표현식은 복수의 중첩된 제네레이터를 단일 결합된 제네레이터로 쓸 수 있게 한다.
  • yield from 표현식은 중첩 제네레이터를 직접 순회하고 그 출력값을 넘겨주는 것보다 좋은 성능을 낸다.

34. Avoid injecting data into generators with send.

  • send 메소드는 yield 표현식에 변수에 대입될 수 있는 값을 줘서 제네레이터에 데이터를 주입시킬 수 있다.
  • send와 yield from을 같이 쓰면 제네레이터 출력에 None이 여러 번 등장하는 등의 이상한 동작이 일어날 수 있다.
  • 중첩 제네레이터에 입력 이터레이터를 제공하는 것이 send보다 나은 방식이고, send는 지양해야 한다.

35. Avoid causing state transitions in generators with throw.

  • throw 메소드는 제네레이터 내 가장 최근에 발생한 yield 표현식에서 예외를 재발생시킬 수 있다.
  • throw를 쓰면 예외를 발생시키고 잡는 데 있어 복붙 코드와 추가적인 코드 중첩을 필요로 하므로 가독성을 떨어트린다.
  • 제네레이터 내 예외를 발생시키는 더 좋은 방법은 예외 상태 변경을 일으키는 메소드와 같이 __iter__ 메소드를 구현하는 클래스를 쓰는 것이다.

36. Consider itertools for working with iterators and generators.

  • itertools 함수들은 이터레이터와 제네레이터를 갖고 작업을 수행할 때 3가지 기능으로 나뉜다. 이터레이터들을 서로 연결하기, 출력을 필터링하기, 아이템의 조합을 생성하기.
  • 더 많은 함수와 사용법에 대해서는 help(itertools)를 참조하라.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중