위키북스 박응용 저 "점프 투 파이썬" 책을 읽고 정리한 내용입니다.
다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.
타입 힌트
- 파이썬에서는 자료형의 종류를 동적으로 할당한다
- 하지만 이렇게 할 경우 편리하기는 하지만 가독성도 떨어지고 연산중 자료형이 안맞아 오류가 날 수 있다
- 그래서 파이썬에서는 이 타입 힌트라는 기능을 제공한다
- 변수의 경우
변수: 자료형
으로 타입 힌트를 줄 수 있고 - 반환값의 경우
-> 자료형
으로 타입 힌트를 줄 수 있다 - 다만 말 그대로 타입 힌트이므로 이것을 따르지 않았을 경우 경고만 할 뿐 따로 에러처리를 하지는 않는다
- 즉, 타입힌트를 써줘도 얼마든지 동적으로 할당될 수 있으므로 조심해야한다
- 파이썬에서
pip install mypy
를 해주면mypy
가 깔리게 되는데, 요놈을 이용하면 타입 힌트랑 자료형이랑 안맞을때 오류처리를 해 손쉽게 고칠 수 있도록 도와준다
타입 힌트를 활용한 함수선언
def func_name(arg1: type, arg2: type) -> type :
return 반환할거
arg: type
: 매개변수와 매개변수의 타입-> type
: 리턴값의 타입
제네레이터
- 제네레이터는 어떤 많은 값들을 생성해서 사용해야할때 전부 다 만들어놓고 사용하는게 아닌 만드는 방법만 저장했다가 호출시에 바로바로 만들어 쓰는 개념 이다
- 대표적인예로
range()
함수를 알아보자- 5조5억개의 숫자를 생성해야한다고 가정해보자
- 이때
l1 = [n+1 for n in range(0, 오조오억)]
으로 그냥 리스트를 생성하고 l2 = range(0, 오조오억)
이렇게 해줬을때 두가지는 인덱스로 접근도 가능하고, iterate도 사용할 수 있으니 같은 기능을 제공한다고 할 수 있다- 심지어
len()
으로 요소의 갯수를 구해도 같은 값을 출력한다 - 하지만 이 둘의 메모리 소모를 보면 확연히 차이가 난다 - l2가 현저히 적은 양의 데이터를 먹는다
- 이것은 l1는 오조오억개의 숫자를 미리 만들어서 저장하고 있지만, l2의 경우에는 숫자를 생성하는 방법만 저장하고 실질적으로 만든 숫자는 가지고 있지 않기 때문
- 따라서 제네레이터는 같은 기능을 제공하지만 현저히 적은 메모리를 먹는다는 장점이 있다
- 일반 함수에서 제네레이터 기능 사용하기 :
yield
return
같은 경우에는 반환하면 바로 함수가 종료되지만yield
의 경우에는 종료되지 않는다return
같은 경우에는 반환값이 그대로 반환되지만yield
는 제네레이터 객체가 반환된다*next(반환된 제네레이터 객체)
를 이용해 다음으로 함수가 반환할 값을 그때그때 받아서 쓸 수가 있다- 이것도
return
의 경우에는 값을 다 만들어서 반환하지만yield
의 경우에는 값을 만드는 방법을 저장했다가next()
로 호출할때마다 그때그때 값을 만들기 때문임
제네레이터 함수
yield 반환할거 # 함수 return문 대신
next(제네레이터 객체) # 제네레이터 호출
- 함수를 제네레이터형으로 선언하고싶으면
return
대신yield
를 사용하면 된다 - 대신 함수의 반환값이 제네레이터 객체이므로 다음 값을 받고싶을때는
next()
를 이용하면 된다 - 함수의 반환값이 제네레이터 객체이고 다음값을 받을떄는
next()
를 써야된다는 점을 꼭 기억할 것