python__[파이썬을 파이썬답게1]

Jaewon Lee·2021년 5월 20일
0

Algorithm

목록 보기
6/36
post-thumbnail

On.


Python


1) 네이밍 컨벤션

✔️ 스네이크 케이스: 변수를 밑줄(_)로 구분하여 표기하는 방법

ex.

def calc_score(s: dict):
    student_score = s.score

2) 타입 힌트

✔️ 코딩테스트는 일반적으로 짧은 알고리즘으로 끝나는 경우가 많고, 타입은 지정하지 않아도 한눈에 보일 만큼 명확하기 때문에 굳이 지정하지 않아도 문제는 없다. 그러나 코드를 정리할 때만이라도 타입을 모두 지정해서 보기좋게 제출하려고 노력하자!

ex.

num: int = 1
s: str = 'foo'

3) 리스트 컴프리헨션

✔️ 리스트 컴프리헨션은 가독성이 좋은 편이지만, 이 또한 무리하게 복잡하게 작성할 경우 가독성을 떨어뜨릴 수 있으므로 적절히 사용하는 게 중요하다. 대체로 표현식은 2개를 넘지 않아야 한다.

ex.

[n * 2 for n in range(1, 11) if n % 2 == 1]    ## [2, 6, 10, 14, 18]
{key : value for key, value in original.items()}

4) 제너레이터

✔️ 루프의 반복 동작을 제어할 수 있는 형태를 말한다.
✔️ 예를들어, 숫자 1억개를 만들어내 계산하는 프로그램을 만든다고 가정했을 때 제너레이터가 없다면 숫자 1억개를 만들어서 메모리 어딘가에 항상 보관하고 있어야 한다. 그러나 제너레이터를 이용하면, 단순히 제너레이터만 생성해두고 필요할 때 불러서 숫자를 만들어내면 된다.
✔️ 요약 : 메모리 많이 안 잡아먹게 도와줄 수 있는 녀석 -> 성능향상 굳

✔️ yield : 함수를 종료시키지 않고 값을 return 시킨다.
✔️ next : yield를 통해 현재 함수에서 생성한 값을 받았다면, 다음 값을 받기 위해 사용한다.

ex.
yield

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

## <generator object get_natural_number at 0x10d3139d0>
g = get_natural_number()     

for _ in range(0, 100):
    print(next(g))
## 1 2 3 ... 100

range
✔️ 대표적인 제너레이터 함수


5) enumerate

✔️ '열거하다'는 뜻의 함수로, 순서가 있는 자료형(list, set, tuple)을 인덱스를 포함한 enumerate 객체로 리턴한다.

ex.

a = ['lee', 'jae', 'won']
enumerate(a)              
## [(0, 'lee'), (1, 'jae'), (2, 'won')]

for idx, val in enumerate(a):
    print(idx, val)
## 0 lee
## 1 jae
## 2 won

5) print

✔️ 코딩테스트의 디버거 수단

ex.

print('A1', 'B2')                        ## A1 B2
print('A1', 'B2', sep='.')               ## A1,B2      (sep property)

print('A1', end=' ')
print('B2')                              ## A1 B2      (end property)

print('{0}: {1}'.format(idx+1, fruit))   ## 2: apple
print('{}: {}'.format(idx+1, fruit))     ## 2: apple   (괄호안 인덱스 생략가능)

print(f'{idx+1}: {fruit}')               ## 2: apple   (f-string은 3.6+에서만 지원)

5) locals

✔️ locals()는 로컬에 선언된 모든 변수를 조회할 수 있는 강력한 명령어로, 디버깅에 많은 도움이 된다.
✔️ 특히 로컬 스코프에 제한해 정보를 조회할 수 있기 때문에 클래스의 특정 메소드 내부에서나 함수 내부의 로컬 정보를 조회해 잘못 선언한 부분이 없는지 확인하는 용도로 활용할 수 있다.

ex.

import pprint
pprint.pprint(locals())       ## pprint로 출력하게 되면 보기 좋게 줄바꿈 처리를 해준다.

{ 'nums': [2, 7, 11, 15],
  'pprint': <module 'pprint' from ....>
  'self': <__main__.Solution object ....>
  'target': 9
}

6) 코딩 스타일

  1. 변수명은 스네이크 케이스로!
  2. 주석은 꼼꼼히!
  3. 가독성을 항상 고려하기!
  4. 리스트 컴프리헨션은 표현식이 2개가 넘어가지 않기!
  5. 함수의 매개변수에 기본값으로 []나 {}를 사용하는 것은 지양하기! (대신 None과 같은 불변객체를 사용한다.)
  6. True, False를 판별할 때는 암시적인 방법을 사용하는 편이 간결하고, 가독성이 높다!
    (if len(users) == 0 이것보다 if not users가 낫다는 말)


Off.


파이썬의 철학을 따라가면서 알고리즘 문제를 풀어보자!!!!

프론트와 백을 넘나드는 리드 개발자가 되는 그날까지 🔥🔥🔥

profile
Communication : any

0개의 댓글