파이썬

khs·2021년 9월 5일
0

파이썬 알고리즘

목록 보기
2/7
** 본 글은 파이썬 알고리즘 인터뷰(박상길 지음)를 기반으로 작성하였습니다.

파이썬에 대해서 먼저 알아보자.
내장 라이브러리와 자료구조, 알고리즘으로 최적의 문제풀이가 가능할 정도로 살펴볼 것이다. Numpy(넘파이)같은 과학 계산 모듈은 사실상 파이썬의 표준 라이브러리처럼 쓰이지만 코딩 테스트에는 사용할 수 없기 때문에 다루지 않을 예정이다.

1. 파이썬 문법

인덴트
파이썬의 대표적인 특징이기도 한 인덴트는 공식 가이드인 PEP 8에 따라 공백 4칸을 원칙으로 한다. (Tap한번)


네이밍 컨벤션
파이썬의 네이밍 컨벤션은 자바와 달리 각 단어를 밑줄(_)로 구분하여 표기하는 스네이크 케이스를 따른다. 이는 함수명도 마찬가지 이다.

def long_function_name(var_one, var_two, var_three, var_four)

snake_case : int = 1

타입 힌트
타입을 지정할 수 있는 타입힌트가 PEP 484 문서에 추가됐다. 파이썬 버전 3.5부터 사용할 수 있으며 다음과 같은 형태로 타입을 선언할 수 있다.

a: str = "1"
b: int = 1

기존에 타입 힌트를 사용하지 않는 파이썬 함수는 다음과 같이 함수를 정의해 왔다.

def fn(a):
	...

이는 빠르게 정의해서 사용할 수 있다는 장점이 있지만 fn()함수의 파라미터 a에는 숫자를 넘겨야 하는지, 문자를 넘겨야 하는지 전혀 알 수 없으며 이 함수의 리턴값이 무엇인지도 알 수 없다. 따라서

def fn(a:int) -> bool:
	...

이처럼 타입 힌트를 사용하게 되면 fn()함수의 파마리터 a가 정수형임을 분명하게 알 수 있으며 리턴 값으로 True 또는 False를 리턴할 것이라는 점도 확실하게 알 수 있다. (강제 규약은 아니다.)


리스트 컴프리헨션
리스트 컴프리헨션이란 기존 리스트를 기반으로 새로운 리스트를 만들어내는 구문으로 파이썬 2.0부터 지원되었으며 파이썬의 대표적인 특징이기도 하다.

>>> [n*2 for n in range(1,10+1) if n%2 == 1]
[2,6,10,14,18]

만약 리스트 컴프리헨션을 사용하지 않는다면 다음과 같이 길게 풀어서 작성해야 한다.

>>> a = []
>>> for n in range(1,10,10+1):
	if n%2 == 1:
    	a.append(n*2)
>>> a
[2,6,10,14,18]

이처럼 한 줄로 간결하게 작성할 수 있는 리스트 컴프리헨션은 (리스트 뿐만 아니라 딕셔너리도 사용 가능하다.) 가독성이 좋은 편이지만 이 또한 무리하게 복잡하게 작성할 경우 가독성을 떨어뜨릴 수 있으므로 적절히 사용나는 게 중요하다. 대체로 표현식은 2개를 넘지 않아야 한다.


제너레이터
제너레이터는 루프의 반복 동작을 제어할 수 있는 루틴 형태를 말한다. 기존의 함수는 return구문을 맞닥뜨리면 값을 리턴하고 모든 함수의 동작을 종료한다. 그러나 yield는 제너레이터가 여기까지 실행 중이던 값을 내보낸다는 의미로, 중간값을 리턴한 다음 함수는 종료되지 않고 계속해서 맨 끝에 도달할 때까지 실행된다.

def yield_p():
    n = 0
    while True:
        n+=1
        yield n

g = yield_p()
for _ in range(0,50):
    print(next(g))

range
제너레이터의 방식을 활용하는 대표적인 함수로 range()가 있다. 주로 for문에서 쓰이는 range()함수의 쓰임은 다음과 같다.

a = [n for n in range(100000)]
b = range(100000)

print(sys.getsizeof(a))
print(sys.getsizeof(b))

800984
48

둘 사이의 메모리 점유율을 비교해보면 range 클래스를 리턴하는 방식의 장점이 쉽게 와닿을 것이다.
똑같이 숫자 100만개를 갖고 있으나 range클래스를 이용하는 b변수의 메모리 점유율이 훨씬 더 작다.
100만개가 아니라 1억개라도 b번수의 메모리 점유율은 동일하다.
생성 조건만 보관하고 있기 때문입니다.
게다가 미리 생성하지 않은 값은 인덱스에 접근이 안될 거라 생각할 수 있으나 덱스로 접근 시에는 바로 생성하도록 구현되어 있기 때문에 불편함없이 사용할 수 있다.


enumerate
enumerate()는 '열거하다'는 뜻의 함수로, 순서가 있는 자료형(list, set, tuple 등)을 인덱스를 포함한 enumerate 객체로 리턴한다. 사용 방법은 다음과 같다.

a = [23,45,12,52,17,63]
print(list(enumerate(a)))

for i,v in enumerate(a):
    print(i,"번째 원소:",v)
    
[(0, 23), (1, 45), (2, 12), (3, 52), (4, 17), (5, 63)]
0 번째 원소: 23
1 번째 원소: 45
2 번째 원소: 12
3 번째 원소: 52
4 번째 원소: 17
5 번째 원소: 63

//나눗셈 연산자
//연산자는 나눗셈할 때 정수형을 결과로 리턴하면서 내림 연산자의 역할을 한다. 다시 말해 몫을 구하는 연산자이다. 참고로 나머지를 구하는 모듈로 연산자는 %이다. 몫과 나머지를 동시에 구하려면 divmod() 함수를 사용하면 된다.

print(10/3)
print(10//3)
print(divmod(10,3))

3.3333333333333335
3
(3, 1)

print
가장 쉽게 값을 출력하는 방법은 콤마(,)로 구분하는 것이다. 이 경우 한 칸 공백이 디폴트로 설정되어 있으며, 그대로 출력하면 띄어쓰기로 값을 구분해준다.

>>> print('A1', 'B2')
A1 B2

다음과 같이 sep 파라미터로 구분자를 콤마(,)로 지정해줄 수도 있다.

>>> print('A1', 'B2', sep=',')
A1,B2

end 파라미터를 공백으로 처리하여 줄바꿈을 하지 않도록 제한할 수 있다.

print('aa', end = '')
print('bb')

리스트를 출력할 때는 join()으로 묶어서 처리한다.

>>> a = ['A', 'B']
>>> print(' '.join(a))   #' '사이에 넣은 값을 구분자로 지정한다.
A B

f-string 방법 : 변수를 뒤에 별도로 부여할 필요 없이 인라인으로 삽입하는 방법. 간결하고 직관적이며 속도도 빠르다.

>>> idx = 1
>>> fruit = "Apple"
>>> print(f'{idx+1} {fruit}')
2 Apple

pass
코딩을 하다보면 일단 코드의 전체 골격을 잡아놓고 내부에서 처리할 내용은 처근차근 생각하며 만들겠다는 의도로 다음과 같이 코딩하는 경우가 있다.

class My_class(object):
    def method_a(self):

    def method_b(self):
        print("Method B")

c = My_class()

위 코드는 method_a()가 아무런 처리를 하지 않았기 때문에 오류가 발생하는데 pass를 통해 이런 오류를 막을 수 있다. pass는 널 연산(Null operation)으로 아무것도 하지 않는 기능이다.

class My_class(object):
    def method_a(self):
		pass   #여기에 pass를 추가
    def method_b(self):
        print("Method B")

c = My_class()

locals
로컬에 선언된 모든 변수를 조회할 수 있는 강력한 명령이므로 디버깅에 많은 도움이 된다.


2. 코딩 스타일

좋은 코드에 정답은 없다. 각자가 원하는 방식을 택하면 된다. 그러나 가능한 많은 사람이 좋아하며 선호하는 방식을 택하는 것이 중요하다. 개발은 혼자만 하는 것이 아니며, 좋은 코드란 모두가 이해할 수 있을 때 더 높은 가치를 발휘하기 때문이다.

변수명과 주석
변수 명은 무엇을 의미하는지 이해하기 쉬워야하며, 필요시 주석을 달도록한다. 주석은 한글로 달아도 무방하지만 영어로 작성하는 것에도 부담이 없어야 한다.


리스트 컴프리헨션
리스트 컴프리헨션은 파이썬의 매우 강력한 기능 중 하나며, 파이썬을 대표하는 특징 중 하나다. 하지만 특유의 문법과 의미를 축약하여 나타내는 특징 탓에 지나치게 남발하게 되면 파이썬의 가독성을 떨어트리는 요인이 되기도 한다.
리스트 컴프리헨션은 대체로 표현식이 2개를 넘지 않아야 한다.

profile
권혁상입니다. 행복코딩^_^

0개의 댓글