[리뷰] 파이썬 챌린지
in Review on Review, Book, Python, 예제, 챌린지, Gui, 알고리즘, Sqlite, Tkinter, Game, Io, 실전, 프로젝트
제이펍
출판사의"파이썬 챌린지(니콜라 레이시 저/황반석 역)"
를 읽고 작성한 리뷰입니다.
본 도서는 최소한의 설명과 함께 150개의 코딩 문제를 직접 풀어보며 Python을 익히는
독특하고 재미있는 입문서이다. 각 챌린지가 다루는 문제는 굉장히 초급 수준이지만 파이썬의 문법에 익숙해지기에 적합한 문제들이기도 하다. 암기보다는 문제 해결 능력
에 초점을 맞춘 점이 가장 큰 장점이다.
먼저 추천하고 싶은 대상 독자는 다음과 같다.
- 코딩을 처음 접하는 학생, 비전공자 등 입문자(
왕초보
) - Python의 문법을 배웠지만 당장 구현에는 자신이 없는 이론에만 자신있는 사람
- C, Java 등의 타 언어를 알고 있음에도 Python으로 전향을 원하는 사람
만약 이 유형에 해당하지 않는다면 본 도서는 너무 쉬워 큰 도움이 되지 않을 수도 있다. 물론 프로그래밍은 한 번이라도 더 구현할수록 새롭게 얻는 것이 생기기 때문에 심심풀이로 도전해봐도 재미있을 것이다. 하지만 본 리뷰를 읽을 필요는 없을 것 같다.
위 3가지 유형 해당자들을 위해 리뷰를 계속 진행하겠다. 우선 각 챌린지를 진행하기 앞서 이론이 고작 한 두 페이지 수준으로 짧게 설명되어 있다는 점이 인상적이었다.
개인적으로는 마음에 드는 구성이지만 이 정도 설명으로 과연 배울 수 있을까라는 의구심이 들었다. 하지만 이어지는 챌린지 문제들을 하나씩 풀어보니 충분히 가능한 구성이라는 생각이 들었다. 백견이 불여일타
식으로 철저히 실습을 통해 프로그래밍을 익히도록 구성된 점이 가장 큰 장점이다.
길게 설명할 것 없이 괜찮았던 예제 하나를 중심으로 책의 구성 방식을 설명해보겠다. 대상 예제는 어느 프로그래밍 언어에서나 가장 흔하게 쓰이는 문자열 파트의 마지막 문제로 골라보았다. 본문 59p에 등장하는 87번 챌린지이다.
어떤 느낌인지 확인하고 싶다면 아래 예시를 풀어보길 바란다. 참고로 이 문제는 책의 등장하는 문제 중 중간 난이도 정도 된다. 이 문제를 푸는데 쉽지 않았다면 이 책이 분명 도움이 될 것이다.
개념
먼저 문자열의 개념을 한 페이지로 간단하게 설명한다. Python에서 문자열을 다룰 때 흔히 사용하는 슬라이스를 위해 인덱스 개념을 알려준다.예제코드
다음으로는 예제코드가 등장한다. 문자열 파트에 해당하는 80 ~ 87번 챌린지를 풀기위한 기초 문법으로 그대로 따라서 구현해보면 좋다. 기본 패턴 및 일종의 API를 배우는 과정이라고 생각하면 된다.챌린지
본격적으로 챌린지 문제가 등장한다.답안
마지막으로 정답이 등장한다. 프로그래밍 세계가 언제나 그렇듯 답은 여러가지가 존재하지만 책에는 가장 쉽게 구현할 수 있는 답안 하나만 제시한다.
위와 같은 4단계 방식(개념-예제-챌린지-답안
)으로 전체 18개의 장 150개의 챌린지가 등장한다. 초보자라면 분명 훈련하는데 충분할 만한 양이며 다 끝내고 나면 상당히 자신감이 생길 것이다. 장마다 다루는 주제는 다음과 같다.
- 기초, 문자열, random, 파일I/O
- if, for, while, 함수
- 수학 함수, 튜플, 딕셔너리, 리스트, 배열, 2차원,
- 터틀그래픽, Tkinter, SQLite
Python에서 가장 쉽지만 가장 활용도가 높은 주제들로 구성되어 있다. 그 중 터틀그래픽, Tkinter, SQLite과 같은 요소는 Python에서 다루는 주력 기능들도 아니고 다른 언어에서 더 활용도가 높은 기술들이지만 포함시킨 것이 좋다고 본다.
이런 스킬들을 알아야 직접 눈으로 그림그리고 GUI 만들어보고 자신이 원하는 목적
의 가시적인 프로그램 하나를 만들 수 있기 때문이다. 나도 대학 시절 전공으로 처음 언어를 접했을 때 내 일기장이나 혹은 가계부 같은 것을 만들면서 진도를 빨리 뗄 수 있었던 기억이 난다.
이런 스스로 원하는 목적을 달성할 수 있도록 동기부여가 되어야 프로그래밍 실력이 빨리 늘텐데 그저 목적없는 예제의 타이핑은 학습을 쉽게 지치게 만들 것이다. 그런 점에서 초보자들을 위한 완급 조절이 잘 된 책이라는 생각이 들었다.
다만 구성에서 몇 가지 아쉬운 점도 보였다. 위에서 소개한 4단계 방식 중 답안 부분이 조금 모호하다. 답안을 작성하기 위해 저자가 어떤 방식을 접근했는지 그리고 상세한 주석 등이 추가되었다면 학습자의 입장에서 복습도 되고 좋았을 텐데라는 생각도 들었다.
하지만 또 달리 생각하면 아리송하다. 답안은 1개만 존재하지 않는다. C언어의 포인터 개념을 알고 있는 사람이라면 위 예제의 경우 다른 답안을 내놓았을 것이다. C언어의 포인터를 사용하듯 index를 이용하여 reverse 인덱스를 이용할 수도 있기 때문이다. 다음과 같이 말이다.
user_str = input('input:')
for i in range(-1, (len(user_str)+1)*-1,-1):
print(user_str[i])
또 다른 방식으로는 시간복잡도 등 알고리즘 성능 면에서는 좋다고 볼 수 없겠지만 배우는 입장에서는 다양한 시도가 살이되고 피가 되므로 이런 방법도 있을 수 있겠다.
user_str = input('input:')
reverse_str = ''
for i in range(0, len(user_str)):
reverse_str = user_str[i] + reverse_str
for i in reverse_str:
print(i)
입력받은 문자열을 맨 뒤로 붙여나가는 방식이다. for문을 2번써서 실전에서는 좋지 않은 코드이지만 배울 때는 다양한 길을 갈 필요가 있다. 또 다른 방식의 코드도 얼마든지 더 있을 수 있다.
어쨌든 책에서 이런 다양한 경우와 접근법의 설명이 없는 것은 다소 아쉽지만 역으로 생각하면 쉽게 어떤 하나의 패턴을 외우는 식으로 접근할까 우려된 구성이 아닌가 싶기도 하다. 또한 내 방식대로 모두 분량에 포함된다면 양이 늘어 지레 겁먹고 원본의 구성 상 깔끔함을 유지하기 어려웠겠다는 생각도 든다.
추천하고 싶은 공부 방식
은 끝까지 디른 레퍼런스를 참조하지 말고 될 때까지 삽질하며 구현했으면 좋겠다. 몇 시간이 지나도 구현이 어렵다면 예제 코드만 다시 보자. 그래도 어렵다면 Python의 공식 레퍼런스를 참조하자. 그래도 어렵다면 블로그 등 인터넷을 검색하자. 답안은 스스로 풀기 이전엔 절대 보지 않았으면 한다. 저자의 풀이와 다른 내 풀이를 비교하면서 배우는 과정도 필요하기 때문이다. 그 후에는 위에 내가 예시를 든 것 처럼 다른 접근법으로도 풀어봤으면 좋겠다.
이렇게 푸는 것이 시간이 오래 걸릴 수는 있을지 몰라도 넓게 바라보면 가장 빠른 지름길이다. 그리고 그런 과정을 거쳐야 사고의 깊이도 깊어지고 암기도 오래 지속된다. 삽질 끝에 달콤한 해결책은 쉽게 머리속을 떠나지 않기 때문이다.
느낌이 꼭 메모리 하이라키 개념 마냥 HDD에 있는 지식을 레지스트리에 옮기는 느낌이랄까? 삽질해서 외운 지식은 떠오르기도 매우 빠르게 떠오른다. 추후 실전에서 복잡하고 거대한 프로젝트를 진행할 때 이런 순식간에 가져다 쓸 수 있는 지식이 항시 준비하고 있어야 다른 모르는 영역에 집중할 수 있기 때문이다.
그리고 프로그래밍 연습에서만큼은 복잡한 Tree마냥 각 경우의 수를 다 경험해 보는 것이 좋다. 그래야 나중에 성능도 개선시킬 수 있기 때문이다. 마치 위 예제에서 시간복잡도가 불리한데도 한 번 구현해 보는 것 처럼 말이다.
파트2는 파트1의 150개 예제와는 다른 구성이다. 오직 문제와 필요한 자료만 주어진다. 총 5개의 챌린지가 등장하는데 일종의 작은 실전 프로젝트
라고 보면 된다. 파트1을 익혔다면 능히 풀 수 있는 문제들인데 만약 못 풀었다면 마찬가지로 답안을 볼 것이 아니라 파트1을 다시 복습하기 바란다.
마지막으로 언급하고 싶은 것이 있다. 이 책은 Pythonic에 중점을 둔 책이 아니라 프로그래밍의 기초에 중점을 둔 책
이다. 예를 들면 file I/O 파트에서 with 구문을 쓰지 않는다. 별도의 close() 구문을 구현하도록 안내한다. 이는 Pythonic 하지 않은 부분이지만 기초 프로그래밍 과정에서는 좋은 방법이다. 대신 본 책을 마치고 나면 이런 Pythonic에 대한 보완을 염두에 두어야 한다.
array의 경우나 math 라이브러리 부분도 마찬가지이다. python이 데이터 분석에 강점이 있는 언어인만큼 보다 많이 활용하는 Numpy 등을 다뤄야 한다. 성능 상 GPU를 이용하는 Vectorization의 개념 등이 존재하기 때문이다. 약간 문법이 달라지기도 한다는 점에 주의를 해야 한다. 하지만 기본 개념을 충실히 익히면 다른 라이브러리들에 적응하는데 큰 도움이 될 것이다.
프로그래밍을 처음 배우는 분들께 도움이 되고 싶어 간만에 리뷰가 길었다. 프로그래밍을 프로그래밍답게 익히고 싶다면 본 도서를 강력히 추천하고 싶다.