티스토리 뷰

Non-Pythonic code smells like M-band's spirit.

 

(원문: 9 Skills That Separate Beginners From Intermediate Python Programmers)

(의역을 제 마음대로 마구마구 끼얹었습니다.)

 


1. 로직을 이해해라. + 답부터 찾으려 하지 마라.

 

코드 자체보다 중요한 것은 코드의 로직을 이해하는 것이다. 로직을 이해해야 문제해결능력이 생기고 그로부터 좋은 코드와 최선의 답을 생각해낼 수 있다.

 

질문하기도 중요하다. 스스로 문제풀이를 시도하지 않고 답부터 찾으려 한다면, 답을 보고도 아무것도 배울 수 없다. (참고: 프로그래밍 질문 잘 하기)

 


2. 문제를 정확히 정의해라. (문제를 마음대로 바꾸지 마라.)

 

파일명에서 확장자를 추출하고 싶다면 어떻게 할까? 문자열의 마지막 세 문자를 꺼내면 될 것 같다. 그래서 아래와 같은 코드를 작성했다.

 

 

잘 동작한다!

 

이제 입력으로 photo_of_lochness.jpeg를 넣어보자.

 

확장자를 추출하고 싶다면 확장자를 추출하는 코드를 짜야 한다. 마음대로 문제를 바꾸면 안된다. 파일의 확장자가 항상 세 문자라는 보장이 없으므로 (예: jpeg, webp) 제대로 된 코드는 아래와 같이 짜야 한다.

 

 

혹은 표준 라이브러리인 os.path.splitext()를 활용할 수도 있다.

 


3. 동작하는 코드라도 왜 동작하는지를 이해해라.

 

초보자라면 짧은 코드를 며칠동안 붙들고 있는 일이 종종 생긴다. 그러다 어느 순간 코드가 동작하면 안도의 한숨을 내쉬며 다음으로 넘어갈지도 모르겠다. 절대 하지 말아야 할 행동이다. 코드가 왜 동작하는지 모르는 채 넘어가는 건 코드가 왜 동작하지 않는지 모르는 것보다 더 위험하다.

 

예를 들어, 들여쓰기가 몇 단계에 걸쳐 복잡하게 되어있는 코드에서 들여쓰기가 에러가 날 수 있다. 어디를 어떻게 바꿔야 하는지 모른 채 마구잡이로 여기저기 들여쓰기를 고쳐보다 운 좋게 에러가 나지 않을 수 있다. 하지만 에러는 나지 않지만 의도와는 전혀 다른 코드일 수도 있다!

 

에러가 왜 뜨는지 이해되지 않는 일은 항상 발생한다. 마침내 디버깅에 성공했다면 왜 성공했는지를 꼭 확인하고 넘어가야 한다. 이 값진 경험은 이후에도 자산이 될 것이다.

 


4. 필요한 것 이상으로 궁금해해라.

 

열정적인 학생이라면 str()의 기능을 확인해봤을 것이다. 하지만 초보를 벗어나고 싶다면 str()의 문서도 확인해보자. help(str)로 도움말을, dir(str)로 관련 메서드를 확인할 수 있다. 예를 들어 str 자료형에 endswith()를 쓰면 파일의 타입을 알아내는 코드를 조금 더 유려하게 짤 수 있다.

 

 

대부분 프로그래머는 모든 문서를 다 읽지는 않는다. 좋은 프로그래머가 되기 위해서는 필요한 정보를 잘 찾는 방법을 알아야 한다.

 


5. 리스트를 다양하게 활용해라.

 

아래와 같이 리스트가 주어져 있다.

 

 

여기서 숫자와 문자를 분리하려면 어떻게 하면 될까? 초보자라면 우선 반복문부터 돌려볼 것이다.

 

 

물론 동작에는 문제가 없지만 코드가 다소 어수선하다. 삶이 행복하길 원하는가? 그렇다면 리스트 컴프리헨션을 배워라.

 

 

혹은 filter를 활용해볼 수도 있다.

 

 

한 문제를 푸는 방법은 여러가지가 있다. 본인에게 잘 맞는 방법을 찾아보자.

 

보너스1: 리스트를 뒤집고 싶다면? 아래처럼 해보자.

 

 

보너스2: 리스트를 문자열로 합치고 싶다면 아래처럼 하면 된다.

 

 


6. 파이써닉한 반복문을 써라.

 

파이썬에서 이런 코드를 본 적이 있는가?

 

 

동작에는 문제가 없겠지만 파이써닉하지 않다. 파이써닉하려면 아래와 같이 짜야 한다.

 

 

인덱스를 쓰고 싶다면? enumerate를 쓰면 된다.

 

 


7. 함수를 사용해라. + 정확한 용어를 사용해라.

 

코드에서 같은 일을 두 번 이상 반복하는 부분이 있다면 함수나 프로시저로 대체하는 것을 고려해야 한다. 새로운 함수나 프로시저 개발에 쓰이는 2주가 그 이후 6주의 시간을 줄여줄지도 모른다. 함수는 반환값이 있고, 프로시저는 반환값이 없다.

 

 

매개변수(parameter)와 인자(argument)도 구별해야 한다. 프로시저나 함수 안에서는 매개변수라고 부르고(주황색) 프로시저나 함수에 넘겨주는 값은 인자라고 부른다(녹색).

 


8. 클래스를 활용해라.

 

파이썬은 객체지향(OOP) 언어이다. 파이썬의 진정한 파워는 객체에 있다. 객체는 설계도라고 이해할 수도 있다. 설계도를 이용하여 인스턴스를 만들 수 있다. 즉, 설계도는 건드리지 않으면서 인스턴스를 얼마든지 많이 만들어낼 수 있다. OOP는 그 자체만으로 이미 큰 주제이므로 여기서는 OOP의 모든 것을 얘기하지는 않겠다. 대신 쉬운 예제를 몇개 보여주고자 한다.

 

OOP를 공부했다면 한번쯤 봤을법한 지긋지긋한 Student 클래스를 살펴보자. Student에게는 속성으로 name(이름)과 subject_list(수강목록)이 있다.

 

 

__init__은 클래스의 생성자이다. __init__에는 클래스의 코어에 해당되는 내용이 들어간다. 클래스에 메서드를 추가하는 방법은 뒤에서 다시 설명할 것이다. 메서드는 클래스의 함수 또는 프로시저이며 클래스를 사용할 때 호출할 수 있다.

 

Student 클래스의 인스턴스는 아래처럼 만들어서 변수에 대입할 수 있다.

 

 

학생이 한 명 더 필요하다면 두 번째 인스턴스를 만들면 된다.

 

 

student1과 student2는 모두 Student 클래스의 인스턴스이다. 이 둘은 하나의 설계도를 공유하지만 완전히 별개의 객체들이다. 이제 각 학생에게 수강목록을 추가하기 위한 메서드를 만들어보자. 이 메서드를 호출하여 클래스의 인스턴스를 수정할 수 있다.

 

 

이제 이 클래스는 학생을 생성하고, 수정하고, 정보를 출력할 때 사용할 수 있다.

 

 

클래스는 보통 별도의 파일로 관리하고, 필요할 때 import 해서 사용한다. 예를 들어 Student 클래스는 student.py 파일에 작성하고 main.py에서 import 해서 쓰는 방식이다.

 

 


9. PEP를 준수해라.

 

PEP를 무시하고 코딩을 하는 사람들이 종종 있다. 나도 가끔 그런다. 하지만 개발을 함에 있어 표준을 따르는 것은 중요하다. PEP까지는 아니더라도 적어도 조직의 표준은 따라야 한다.

 

PEP는 여러분의 코드를 위한 가이드라인이다. 나름 재밌는 읽을거리이니 한번은 끝까지 읽어보고 무슨 얘기를 하고 있는지 알아보길 바란다. 예를 들어 파이썬에서 변수명은 snake_case로 써야 한다.

 


마치며.

 

초보자가 되는 건 놀라운 경험이다. 처음엔 힘들겠지만 배우는 속도가 빠르고 새로운 경험들로 가득차 있다. 하지만 초보를 벗어나기란 결코 쉬운 일이 아니다. 이 글이 여러분을 바른 방향으로 인도하길 바란다.

 

코딩공부를 함에 있어서 초점을 어디에 맞춰야 할지, 어느 방향으로 가야 할지 모르겠다면 질문하기를 주저하지 말자. 여러분보다 잘하는 사람들에게서 도움받기를 망설이지 말자. 다양한 의견을 듣고, 그 중 더 나은 방법을 찾아보자. 어떤 방법들은 아직 여러분 수준에서 쓰기에 어려울 수도 있다. 그런 방법들은 잠시 접어두고 우선은 돌아가는 코드를 만들자. 그리고 그동안 더 나은 방법을 배우자.

 

- 번역: 게으른 파이썬

 

※ 좋은 글을 알려주신 페가님께 감사말씀 드립니다.

댓글