ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pythonic하게 코드 작성하기
    ML, DL & Python/Pythonic Code 2020. 8. 15. 17:10

    요새 분석일을 하면서 최대한 제가 짜는 코드를 pythonic하게 맞추려고 하는데요. 그렇다면 pythonic한 코드 작성은 어떻게 하는 것일까요?

     

    이 부분에 대해서 여러 케이스를 찾아보고 공부해보면서 일단 대표적으로 PEP8에서 정의한 pythonic한 코드 작성법이 있는데 여기에 각 개인의 특성에 맞게 변형도 되고, 추가 및 제거도 되는 것을 확인할 수 있었습니다.

     

     

    이에 저도 정의한 모든 경우가 아닌 제 기준으로 중요하다고 생각하는 pythonic한 코드 작성법 몇가지를 공유하려고 합니다.

     

    학부생부터 취업을 해서 코드를 작성하기까지 결과를 보는게 중요하지 내가 작성한 코드를 좀 더 정형적으로, 이해하기 쉽게, 빠르게 등등 방법을 변형해서 작성하는 것에 대해서는 고민해보지 못했는데요. 점차 일을 하다보니 복잡한 코드를 작성할 때, 더 효율적으로 코드가 작동되도록 하고 싶은 일이 생기다보니 이 부분에 대해서 깊은 생각을 가지게 되었습니다.

     

    추가적으로 pythonic한 것이 어떤 것인지에 대한 텍스트가 python library에 내장되어 있는데 한번 확인해보겠습니다.

     

    해석은 아래와 같습니다.

     

     

    Beautiful is better than ugly. 아름다움이 추한 것보다 낫다.

    Explicit is better than implicit. 명확함이 함축된 것보다 낫다.

    Simple is better than complex. 단순함이 복잡한 것보다 낫다.

    Complex is better than complicated. 복잡함이 난해한 것보다 낫다.

    Flat is better than nested. 단조로움이 중접된 것보다 낫다.

    Sparse is better than dense. 여유로움이 밀집된 것보다 낫다.

    Readability counts. 가독성은 중요하다.

    Special cases aren't special enough to break the rules. 규칙을 깨야할 정도로 특별한 경우란 없다. Although practicality beats purity. 비록 실용성이 이상을 능가한다 하더라도.

    Errors should never pass silently. 오류는 결코 조용히 지나가지 않는다. Unless explicitly silenced. 알고도 침묵하지 않는 한.

    In the face of ambiguity, refuse the temptation to guess. 모호함을 마주하고 추측하려는 유혹을 거절하라. There should be one-- and preferably only one --obvious way to do it. 문제를 해결할 하나의 - 바람직하고 유일한 - 명백한 방법이 있을 것이다. Although that way may not be obvious at first unless you're Dutch. 비록 당신이 우둔해서 처음에는 명백해 보이지 않을 수도 있겠지만.

    Now is better than never. 지금 하는 것이 전혀 안하는 것보다 낫다. Although never is often better than right now. 비록 하지않는 것이 지금 하는 것보다 나을 때도 있지만.

    If the implementation is hard to explain, it's a bad idea. 설명하기 어려운 구현이라면 좋은 아이디어가 아니다. If the implementation is easy to explain, it may be a good idea. 쉽게 설명할 수 있는 구현이라면 좋은 아이디어일 수 있다. Namespaces are one honking great idea -- let's do more of those! 네임스페이스는 정말 대단한 아이디어다. -- 자주 사용하자!

     

    굉장히 좋은 글입니다! 이부분에 대한 생각을 유념하며 python을 더 pythonic하게 작성하는 것에 대해서 알아보겠습니다.

     

    1. 코드 작성 형식

    pythonic하게 코드를 작성하는 것은 크게는 내가 작성한코드를 내가 보거나 타인이 봤을 때 이해가 쉽게 하는 이유도 있습니다. 그래서 코드를 작성할 때 최대한 가독성을 높게 유지하는 것이 중요한데 이 부분에 대해서 살펴보겠습니다.

     

    1-1. 들여쓰기

    들여쓰기를 할 때 주의해야할 점이 인자 유무에 따라서 신경써서 들여쓰기를 해야한다는 점입니다. 이 하나로 코드 가독성이 굉장히 달라질 수 있는데요. 아래의 예시를 보겠습니다.

     

     

    위의 코드와 아래의 코드를 비교해보면 위의 코드가 더 가독성이 높은 것을 확인할 수 있습니다.

     

     

    1-2. 연산자 줄바꿈

    +, - 등의 연산자를 사용할 때는 사용하기 전에 줄바꿈을 하는 것이 좋습니다. 아래의 예시를 보시겠습니다.

     

     

    위의 코드를 비교해보면 연산자를 줄바꿈 이전에 사용했을 때 다음 인자와의 연결성이 떨어지는 것을 확인할 수 있는데, 줄바꿈 다음에 사용하게 되면 인자와 인자의 연결성이 매끄러운 것을 알 수 있습니다.

     

    1-3. import

    Library를 Import할 때 불러오는 Library를 한줄에 사용하시면 안됩니다. 한줄에 사용하는 케이스는 from으로 불러오고 싶은 라이브러리에서 import할 객체를 선택할 때 사용하는 것입니다. 아래의 예시를 보시겠습니다.

     

     

    서로 다른 library를 import할 때는 한줄에 하나씩, 같은 library에서 여러 객체를 불러올 때는 한줄로 코드를 작성하는 것입니다.

     

    1-4. 연산자 띄어쓰기

    ==, =, >=, <=, >, < 등의 연산자 띄어쓰기는 앞 뒤로 해주시는 것이 좋습니다.

     

     

    위의 코드를 비교했을 때 계산해야하는 식과 여기서 정한 연산자간의 구분이 뚜렷한 것을 알 수 있습니다.

     

     

    2. List Comprehension

    List Comprehension은 리스트 데이터를 주무를 때 굉장히 매력적인 방법입니다. 

    이 방법을 알기전엔 list를 만들 때 반복문을 돌려 .append, .extend를 사용해서  생성했지만 list comprehension을 사용하면 코드를 짧고 효율적이게 짤 수 있으며, 속도 측면에서도 이점을 가져올 수 있습니다.

     

    그럼 한 변의 길이가 1 ~ 11인 정삼각형중 길이가 짝수인 정삼각형의 높이를 구하는 코드를 작성해보겠습니다.

    높이는 리스트에 집어넣는 방식으로 합니다.

     

    두가지 코드를 비교했을 때 일단 위의 코드보다 아래의 코드가 굉장히 쉽고 간편한 것을 알 수 있습니다. 그리고 이부분에 관련한 속도도 효율적인 것을 확인할 수 있습니다.

     

    List Comprehension은 이 외에도 다양한 방식으로 이용할 수 있으며 한번에 적용해서 활용하기 힘들기 때문에 관련된 공부가 필요할 것입니다.

     

    3. 반복문

    반복문을 사용할 때 제가 습관처럼 이용하는 것이 있는데요. 바로 반복문의 loop데이터를 설정하는 과정에서 항상

    "for i in range(len(data))" 를 활용한다는 것입니다. 이렇게 사용하는 것에 대해서 아무런 생각이 없었지만 pythonic한 문법들을 찾아보고, enumerate, zip에 대해서 공부해보니 "아 지금까지는 매력적으로 코드작성을 하지 못했구나" 라는 생각이 들었습니다. 

    그럼 이부분에 대해서 예시 코드를 확인해보겠습니다.

     

    range(len())을 사용하는 것보다 enumerate, zip을 사용하여 인덱스 상태로 데이터를 이용하는 것보다 데이터 자체를 바로 loop문에서 이용하면서 인덱스도 따로 설정이 가능하니 더 효율적으로 코드를 작성할 수 있게 되었습니다.

    그래서 분석을 진행하면서 반복문을 사용하는 경우가 많기 때문에 이렇게 작성하는 과정을 거치면서 지금은 반복문을 작성할 때 이와 같이 작성할 수 있게 되었습니다. 

    4. lambda 사용

    lambda의 사용은 알아본 바로 python3에서는 사용하기를 권장하지 않는다라고 표현하지만 굉장히 매력적인 함수기 때문에 사용해보겠습니다.

     

     

    위의 예시는 분석할 때 원하는 파생변수를 생성할 때의 예시인데요. 함수를 만들어서 변수를 생성하는 방법보다 lambda를 활용해서 변수를 생성하는 방식이 굉장히 효율적인 것을 확인할 수 있습니다. 제가 생각하기로 lambda를 활용하는 것을 권장하지 않는 이유가 함수를 범용성이 뛰어나지만 lambda는 범용성이 떨어진다는 이유에서 나온 것이라고 생각이 되는데요.

     

    하지만 이부분을 제외하더라도 깔끔하고 효율적이게 데이터를 생성할 수 있는 점에서 굉장히 매력적이라고 생각이 됩니다.

     

    지금까지 pythonic한 코드 작성법에 대해서 알아봤는데 확실한건 제가 포스팅한 내용 이외에 더 다양한 코드 작성법이 있을 것입니다. 그 부분에 대해서는 앞으로 추가 포스팅을 이어나갈 예정입니다.

     

    마지막으로 글을 보시는 여러분들도 어떻게 하면 pythonic하게 코드를 작성할 수 있을지에 대한 고민은 한번씩 필요하다는 생각을 전달드리며 포스팅을 마치겠습니다.


    댓글

Designed by Tistory.