2020년/코테

[파이썬 알고리즘 인터뷰] 파이썬

위지원 2020. 12. 8. 22:06

아래 책을 보고 필요한 부분만 정리한 내용

파이썬 알고리즘 인터뷰
국내도서
저자 : 박상길
출판 : 책만 2020.07.15
상세보기

github.com/onlybooks/algorithm-interview

 

오랜만에 코딩에 대해 공부한다. 위의 책을 구매했는데, 요근래 코테를 너무 안한 것 같아서 공부차원으로 책을 읽었다. 앞에 1부는 날리고 2부인 파이썬부터 정리해야겠다. 

 

몇번 면접을 보면서, 내 포폴이나 이력서엔 파이썬을 중-상으로 적어놨었다. 그러나 나는 파이썬마저도 '하'라는 것을 느꼈다. 기본기가 정말 부족했다. 나는 지금까지 무슨 공부를 해온건지 가끔 너무 좌절을 겪는다. 하지만, 아직 나는 아직 살 날도 그 안에 공부할 날도 많으니 좌절만 하지말고 부족을 느낀만큼 열심히 해야겠다. 밤이라 그런지 왜이러는가...공부를 시작해야게따 😄😄;;

 

  • 인덴트(Indent): 흔히 알고있던 4번 띄어쓰기, Tab 
  • 파이썬 개선 제안서(Python Enhancement Proposals:PEP): 새로운 기능을 제안하고 커뮤니티 의견을 반영하여 파이썬의 디자인 결정을 문서화하는 파이썬의 주요 프로세스
  • 스네이크 케이스:'_'로 변수명을 구분짓는 행위, 파이썬은 스네이크 케이스(반대는 카멜케이스)를 지향함 

충격적이다.. 난 카멜케이스에 엄첨 익숙해져있어 모든 코딩을 그렇게 해왔다. 파이썬도 마찬가지. ....어디가서 파이썬 할줄 안다고 하면 안될 것 같다..😭

 

  • Type Hint: 파이썬 3.5부터 추가
    • a:str = "1"
    • a:int = 1
    • def fn(a:int)->bool: 
  • mypy: 타입에러를 체크할 수 있음

본 내용을 면접에서 받은적이 있다. 근데 나는 한번도 파이썬에서 타입을 선언하거나 고민한적이 없었고, 단연 대답을 하지 못했었다.  세번째 리턴타입을 뱉는 형태도 leetcode를 접하면서 처음알게되었었다. 코드의 규모가 커지면 발생할 수 있는 문제점을 예방하기 위해서라고

한다.

 

  • list comprehension: [i for i in lis]
  • 딕셔너리도 가능(2.7 이후): {k:v for k,v in dic.items()}

리스트 컴프리헨션은 내가 좋아하는 기능 중 하나다. 너무 좋다. 딕셔너리도 되는줄 처음알았다...

 

  • 제네레이터: yield를 사용
    • 아래 코드를 이용하면 따로 메모리에 값을 저장하지 않음
def get_natural_number():
	n = 0
    while True:
    	n+=1
        yield n
        

g = get_natural_number()
for _ in range(0, 100):
	print(next(g))
    
  
#다음과 같이 여러개의 값을 리턴할 수도 있다.
def generator():
	yield 1
    yield 'string'
    yield True

g = generator()
next(g) >1
next(g) >'string'
next(g) >True

 

  • range 클래스:아래는 메모리 점유율이 다름
    • a = [n for n in range(0,100)]: 이미생성을 했으므로 점유함
    • b = range(100): 필요할 때 사용하므로 아직 점유하지 음

충격적인 것은 아래와 같이 range class로 선언해도, index로 접근 시 사용할 때 바로 생성을 하기때문에 전혀 불편함이 없다는 것이였다..

 

  • divmod(5,3)
  • print("a","b",sep=",")
  • print("a","b",end=" ")
  • print("{0}:{1}".format(idx,"fruit")
  • print("{}:{}".format(idx, "fruit")
  • f-string(3.6이상 지원):print(f"{idx}:,"fruit"")
  • locals()
    • pprint모듈을 이용하면 줄바꿈과 함께 출력해 보기 편함:pprint.pprint(locals())

가장 마지막에 적은 locals는 클래스내의 모든 변수값을 딕셔너리 형태로 출력해준다. 

 

www.python.org/dev/peps/pep-0008/

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

google.github.io/styleguide/pyguide.html

 

styleguide

Style guides for Google-originated open-source projects

google.github.io

위 가이드에 따라 코드를 작성하는 것이 좋다. 일일히 보기가 어렵다면 파이참과 같은 ide를 사용하면 열심히 경고를 띄어주어 작성하는데 도움을 준다.

 

내 코드엔 똥내가 나지 않나요? 하이! 

#가변사용지양
def fun(a,b:Mapping=[]) => ❌
def fun(a=None) => ⭕️

#몇가지 꿀팁
if len(user)==0 ❌
if not user ⭕️

if foo is not none and not foo ❌
if foo == 0 ⭕️

if not i%10 ❌
if i%10 == 0 ⭕️

 

The Zen of Python. 파이썬을 파이썬답게..

 

파이썬의 철학...! 근데 왜 수평이 계층보다 낫다는 것일까? 의존성이 너무 엉키고 설키게 되어서일 것 같다. 부모의 부모의 부모의 부모의 부모의 부모의 부모의