타입에 대한 파이썬의 유연함은일회성 스크립트나 소규모의 애플리케이션을 빠르게 개발 할때는 큰 장점으로 작용 하지만 애플리케이션이 규모가 커지게 되면 이러한 파이썬의 다이나믹함이 치명적인 버그로 이어질 확률이 높아지게 되며 애플리케이션 안정에 위험 요소가 되기도 합니다.
따라서 중규모 이상의 파이썬 프로젝트에서는 소위 타입힌팅이라는 개발 프로세스를 도입하여 사용하는 경우가 많습니다.
타입힌팅은 말 그대로 파이썬 코드를 작성할때 타입에 대한 메타 정보를 제공하는 것입닌다. 파이썬에 타입 힌팅이 추가되기 전에는 타입을 표시할려면 주석을 이용했어야 했습니다. 이 방법은 코드를 읽는 개발자에게는 약간의 도움이 될지 모르겠으나 정해진 표준이 없었고 일반 주석과 구분이 어려웠습니다.
타입 힌팅은 우리가 작성한 코드를 다른 개발자가 읽기 수월하게 해주고, 우리가 사용하는 개발 도구가 활용할 수 있도록 도와줄 수 있습니다.
타입스크립트 와 비슷
num: int = 1
def repeat(message: str, times: int = 2) -> list:
return [message] * times
name: str = "김현진"
age: int = 10
emails: list = ["짱"]
adress: dict = {
"city" : "인천"
}
그러나 다른 형(type)을 넣었다고 하여도 에러는 발생하지 않음(패키지를 사용해서 에러를 발생시킬 수 있음)
참고로 콜론(:)뒤에 한칸 -> 앞뒤 한칸씩 띄어주는게 관행
from typing import List, Set, Dict, Tuple # 파이썬 내장모듈을 이용해 상세히 표기
nums: List[int] = [1]
unique_nums: Set[int] = {6,7}
vision: Dict[str, float] = {'left': 1.2}
john: Tuple[int, str, List[float]] = (25, "Jo", [1.0, 0.9])
docstring 이란: 모듈, 함수, 클래스 또는 메소드 정의의 첫 번째 명령문으로 발생하는 문자열로써 설명문으로 사용됩니다.
docstring은 해당 객체의 __doc__
특수속성으로 변환됩니다.
def even_or_odd(n: int) -> None:
"""[짝수인지 홀수인지 구분하는 함수]
Args:
n (int): [짝수 홀수 구분 변수]]
"""
if n % 2 == 0:
print('even')
return
print('odd')
even_or_odd(3)
# 해당함수의 설명이 나옴
help(even_or_odd)
print(even_or_odd.__doc__)
--- 출력 ---
"""
------- help function -------------
Help on function even_or_odd in module __main__:
even_or_odd(n: int) -> None
[짝수인지 홀수인지 구분하는 함수]
Args:
n (int): [짝수 홀수 구분 변수]]
-----------__doc__--------------------
[짝수인지 홀수인지 구분하는 함수]
Args:
n (int): [짝수 홀수 구분 변수]]
"""
__name__
파이썬 실행환경에서는 더블 언더스코어로 구분되어지는 특별한 속성이나 메소드가 존재합니다.
__name__
: 콘솔창에서 script로 실행되는 것인지 아니면 다른패키지에서 import되는것인지 구분이 가능하게 해줍니다.
이를 이용하여 script로써 실행할 때는 함수를 실행하는 코드작성을 추가할 수 있습니다.
제네레이터는 함수는 파이썬의 시퀀스 데이터를 생성하는데 사용됩니다.
실제 시퀀스 데이터와 다른 점은, 시퀀스 전체를 가지고 있는 것이 아니라 시퀀스 데이터를 생성하기 위한 어떠한 루틴만을 가지고 있다는 것입니다.
제네레이터는 함수를 통해서 만들어지며, 함수 내부의 반복문에서 yield키워드를 사용하면 제네레이터가 된다.
함수 내부에 yield키워드가 사용되어 제네레이터 함수가 되었으며, 함수를 실행하면 제네레이터 객체를 반환한다.
def range_gen(num):
i = 0
while i < num:
yield i # yield를 만나는 순간 멈춘다.
i += 1
gen = range_gen(10)
print(gen.__next__()) # i값을 반환 0
print(gen.__next__()) # 1
yield부분에서 멈춘 제네레이터 객체를 순회하기 위해서는 __next__()
함수를 사용한다.
뭔가 연결된 데이터를 잘라서 사용한다.