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

    2020. 12. 8. 22:06

    by. 위지원

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

    파이썬 알고리즘 인터뷰
    국내도서
    저자 : 박상길
    출판 : 책만 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. 파이썬을 파이썬답게..

     

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