데이터의 원소들을 차례대로 접근할 수 있는 객체
반복 가능한 객체를 대상으로 이터레이터를 생성할 수 있음
메모리를 효율적으로 관리하면서 데이터를 처리할 수 있음 (파일이나 네트워크 스트림과 같은 대용량 데이터)
이터레이터 클래스 사용하기
__iter__ 메서드를 정의하여 이터레이터 객체를 반환한다.
__next__ 메서드를 정의하여 다음 원소를 반환하거나 다음 원소가 없다면 StopIteration 예외를 발생시킨다.
for 문을 사용하거나, __next__ 를 직접 호출하여 순회한다.
파이썬의 for문은 내부적으로 Iterator를 생성하여 동작한다.
이터레이터를 간단하게 생성할 수 있는 방법
일반 함수처럼 정의되지만, yield 키워드를 사용하여 값을 반환함
yield 키워드는 해당 값을 반환하고도 함수의 상태가 유지되어 다음에 함수를 호출할 시 중단된 지점부터 이어서 진행하도록 함
제너레이터 표현식
list comprehension (list = [i for i in range(10)] 와 같이 리스트를 생성하는 방법)과 유사한 형태를 가지며, 제너레이터를 간단하게 생성할 수 있는 방법
괄호안에 구성됨
반복할 때마다 한 번에 하나씩 결과를 생성하여 메모리 사용량을 최소화
even_numbers = (x for x in range(1, 11) if x % 2 == 0)
for num in even_numbers:
print(num)
이터레이터 VS 제너레이터
두 방식 모두 메모리 효율성을 높이기 위해 사용될 수 있음
그러나, 작성하려는 코드의 복잡성, 코드 재사용성 등을 고려하여 간단한 제너레이터와 구조화된 이터레이터를 선택하여 사용해야함
파이썬은 동적 타이핑 언어로서, 변수 타입을 명시적으로 선언하지 않아도 되도록 유연성을 갖고 있지만, 코드의 가독성과 유지 보수, 디버깅 등에 어려움이 있어 파이썬 3.5부터 이러한 단점을 해결하기 위해 타입 어노테이션이 도입되었다.
기본 타입 어노테이션
파이썬의 기본 타입들에 사용할 수 있다.
(변수명): (타입명) 과 같이 해당 변수가 어떤 타입인지 명시한다.
예시)
age: int = 25
name: str = "Jinu"
height: float = 184.2
is_adult: boolean = True
def hello(name: str) -> str: ...
복합 타입 어노테이션
파이썬의 복합 데이터 구조(List, Tuple, Dict, Set 등) 에 사용할 수 있다.
(변수명): (타입명)[(타입명...)] 과 같이 해당 변수가 어떤 타입이며, 어떤 데이터 타입을 갖는지 명시한다.
typing 모듈에서 사용하고자하는 복합 타입 어노테이션을 가져와 사용한다
예시) (from typing import List, Tuple, Set, Dict 를 윗 부분에서 했다고 가정)
names: List[str] = ["jinu", "JJinu" ...]
coordinates: Tuple[float, float] = (37.4, -122.2)
user: Dict[str, str] = {"name": "jinu", "email": "jinu.com"}
numbers: Set[int] = {1, 2, 3}
def sum_elements(numbers: List[int]) -> int: ...
클래스 메서드의 타입 어노테이션
위 예시들에서와 같이 함수에도 인자의 타입과 반환형의 타입을 명시할 수 있다.
self 인자의 경우 타입을 명시하지 않는다.
반환 타입이 없을 경우 (def ,,,() -> None) 라고 정의한다.
타입 어노테이션을 귀찮게 사용하는 이유는 런타임 에러를 컴파일 시점에 잡아주기 위해서이다. 따라서, 타입 체크를 해주는 도구를 사용하여 쉽게 오류를 확인할 수 있다.
파이썬의 유명한 타입 체크 도구들
Mypy (https://mypy.readthedocs.io/en/stable/index.html)
파이썬 코드를 정적으로 분석하여 타입 오류를 찾아줌
코드를 실행하지 않고 타입 오류 발견
가장 널리 사용되며, pip를 사용하여 설치할 수 있음
Pyright (https://github.com/microsoft/pyright)
마이크로소프트에서 개발한 빠른 성능의 타입 체커
순수 파이썬으로 작성되었으며, VS Code의 확장 프로그램인 Pylance 를 기반으로 함
npm 을 사용하여 설치할 수 있음
Pytype (https://github.com/google/pytype)
구글에서 개발한 파이썬 타입 체커
파이썬 2와 파이썬 3 코드 모두를 지원
파이썬 코드를 실행하고 이를 통해 타입 정보를 추론하며, 타입 어노테이션이 없는 코드에도 사용할 수 있음
pip 를 사용하여 설치할 수 있음
PyCharm (https://www.jetbrains.com/pycharm/)
JetBrains에서 개발한 파이썬 전용 IDE
다양한 개발 도구 지원(자동 완성, 리팩토링 ...)
Visual Studio Code (https://code.visualstudio.com/)
마이크로소프트의 코드 에디터로 Python 확장 프로그램만 설치하면 타입 체크 및 코드 분석 기능 사용 가능
Pylance 확장 프로그램을 통해 더 빠른 타입 체킹 가능