파이썬 알고리즘 인터뷰 3장:파이썬
Python 문법
인덴트
- 파이썬의 대표적인 특징인 인덴트는 공식 가이드인 PE8에 따라 공백 4칸을 원칙으로 한다
- 강제는 아니면 유저들이 선택 적용 할 수 있다
네이밍 컨벤션
- 파이썬은 각 단어를 밑줄(_)로 구분하여 표기하는 스네이크 케이스를 따른다
- 카멜 케이스
- camleCase: int = 1
- 스네이크 케이스
- snake_case: int = 1
- 카멜 케이스
타입 힌트
- 파이썬은 동적 타이밍 언어지만 타입을 지정할 수 있다.
- 함수 정의시 input값에 어떤것을 넣어야 하는지 명시하지 않을 경우 잘못된 타입이 들어가면
에러가 발생할 수 있다.
- def fn(a:int) -> bool:
- 이런식으로 a에 정수형이며 리턴값은 True or False인것을 알 수 있다
- def fn(a:int) -> bool:
리스트 컴프리핸션
-
리스트 컴프리헨션이란 기존 리스트를 기반으로 새로운 리스트를 만들어 내는 구문
-
람다 표현식에 map이나 filter를 사용하는 것보다 가독성이 좋다
-
[n*2 for n in range(1,10 +1) if n % 2 == 1]
-
위와 같이 리스트 컴프리핸션을 사용하지 않는다면 더 길게 작성해야 한다
-
a = [] for n in range(1, 10+1): if n %2 == 1: a.append(n*2)
-
-
딕셔너리 컴프리핸션도 가능하다
a = {key: value for key, value in original.items()}
-
제너레이터
-
루프의 반복 동작을 제어할 수 있는 루틴 형태를 말한다
-
1억 개를 만들어내 계산하는 프로그램을 작성한다면 제너레이터가 없다면 메모리 어딘가에 작성한 1억개의 숫자를 보관해야 한다
-
제너레이터를 활용한다면 생성해두고 필요할 때 언제든 숫자를 만들어낼 수 있다
-
yield는 실행 중이던 값을 내보낸다는 의미로, 함수는 종료되지 않고 맨 끝에 도달할 때까지 실행된다
def get_natural_number(): n = 0 while True: n+=1 yield n g = get_natural_number() for _ in range(0,100): print(netx(g))
- 100까지의 숫자가 출력된다
-
range
-
제너레이터의 방식을 활용하는 대표적인 함수로 range()가 있다.
-
list(range(5)) range(5)
-
range()는 range 클래스를 리턴하며, for 문에서 사용할 경우 제너레이터의 next()를 호출하듯 매번 다음 숫자를 생성해내게 된다
-
a = [n for n in range(10000)] b = range(10000)
-
위 코드는 둘다 100만개 값을 가지고 있지만 a는 이미 생성된 값이 담겨있고 b는 생성해야만 한다.
- a가 b보다 메모리 점유율이 높다
-
-
enumerate
-
enumerate()는 열거한다는 뜻의 함수로 인덱스를 포함한 enumerate 객체로 리턴한다
-
a = [1,2,3,4,5] list(enumerate(a)) # [(0,1),(1,2),(2,3),(3,2),(4,45),(5,2),(6,5)] 반환한다
-
// 나눗셈 연산자
- // 연산자는 몫을 % 연산자는 나머지를 반환한다
- 몫과 나머지를 한번에 구할 때 divmod 함수를 사용한다
pass
- 파이썬에서 pass는 널 연산으로 아무것도 하지 않는 기능이다
- 이처럼 아무 역활을 하지 않는 pass를 지정하면, 인덴트 오류와 같은 불필요한 오류를 방지할 수 있다
locals
- locals()는 로컬 심볼 테이블 딕셔너리를 가져오는 메소드로 업데이트 또한 가능하다
- 로컬에 선언된 모든 변수를 조쇠할 수 있는 강력한 명력이므로 디버깅에 많은 도움이 된다
- 로컬 스코프에 제한해 정보를 조회할 수 있기 때문에 클래스의 특정 메소드 내부에서나 함수 내부의 로컬 정보를 조회해 잘못 선언한 부분이 없는지 확인하는 용도로 활용할 수 있다