독자 여러분이 지금까지 그저 파이썬 언어의 구문만 만지작거리는 수준이었다면, 이 책에서 다루는 [실습 프로젝트]를 직접 수행함으로써 프로그램을 완벽하게 작성하는 수준으로 즉시 성장할 수 있을 것이다. 이 책에서 우리는 실험을 수행하고, 통계 개념을 탐구하며, 외계 행성을 탐지하는 등 인류의 역사 속에서 천재들을 괴롭혔던 새로운 문제를 해결하면서 파이썬 기술을 연마해 나간다.
각 장은 명확히 프로젝트의 목표를 정의하면서 시작하고, 문제를 공략하는 방법을 논의한 다음, 전문 프로그래머처럼 생각하도록 고안된 16가지 실습 과제를 다뤄본다. 이 책에서 함께 해안 경비대의 수색 및 구조 작업을 돕고, 나사(NASA)의 달 비행을 계획하고 실행하며, 얼굴 인식을 사용해 보안이 필요한 실험실의 출입을 제한하는 등의 과업을 수행해보자.
이 책의 실습 프로그램은 초보자도 쉽게 이해할 수 있다. 하지만, 단계가 진행됨에 따라 점차 수준 높은 기법을 배울 수 있으며, 그에 따라 여러분의 코딩 능력도 향상될 것이다. 이 책에서 주어진 과업을 모두 달성하고 나면, 파이썬을 활용해 실생활의 여러 문제를 풀 수 있는 역량을 갖추게 될 것이다.
| 이 책에서 다루는 내용 |
- 맷플롯립(matplotlib), 넘파이(NumPy, 보케(Bokeh), 판다스(pandas), 리퀘스츠(Requests), 뷰티플 수프(Beautiful Soup) 등의 라이브러리 사용법
- NLTK와 OpenCV 같은 자연어 처리와 컴퓨터 비전 모듈을 다루는 방법
- 별 시야(star field)상에서 이동하는 천체를 감지하고 추적하는 프로그램을 작성해보는 프로젝트
- 인터넷에서 연설문을 스크레이핑해서 자동으로 요약해보는 프로젝트
- 화성 궤도 레이저 고도계(MOLA) 지도를 사용해 화성 우주선이 착륙할 지점을 선택하는 프로젝트
- 데이터 시각화와 그래프 그리기 도구의 도움을 받아서 좀비 아포칼립스 상황에서 살아남게 하는 프로젝트
| 이 책의 구성 |
1장 베이즈 확률로 위치 예측하기 - “실종된 난파선 선원을 찾아라”
파이썬만에서 발생한 실종 사건에서 해안 경비대가 효율적으로 탐색과 구조 임무를 수행하도록, 베이즈 확률 규칙을 사용해 돕는다. OpenCV, NumPy, itertools 모듈을 활용한다.
2장 NLTK로 문서 간 유사도 측정하기 - “이 소설의 원작자는 누구일까”
자연어 처리를 통해 아서 코난 도일이나 H. G. 웰스 중 누가 『잃어버린 세계』를 썼는지를 결정한다. NLTK, matplotlib 등의 모듈은 물론이고 불용어(stop words), 품사, 어휘의 풍부함, 자카드 유사성(Jaccard similarity) 등의 스타일로메트리(stylometry) 기법을 활용한다.
3장 NLTK로 텍스트 요약하기 - “핵심 문장을 뽑아내고 단어 구름을 만들어보자”
마틴 루터의 ‘나에게는 꿈이 있습니다’와 같은 유명한 연설을 인터넷에서 긁어와서 요점을 요약한다. 그리고 소설 본문을 멋진 광고나 판촉 글로 변환한다. BeautifulSoup, Requests, regex, NLTK, Collections, wordcloud, matplotlib 등을 활용한다.
4장 암호화 기법으로 안전한 메시지 전송하기 - “해독 불가능한 암호문을 작성해보자”
켄 폴릿의 베스트셀러 스파이 소설인 『레베카의 열쇠』에 나오는 원타임 패드 방식을 디지털 방식으로 재구성해서, 아무도 깰 수 없는 암호문을 여러분의 친구와 함께 공유한다. Collections 모듈을 활용한다
5장 OpenCV로 이미지 차이 분석하기 - “천체 이미지로 명왕성을 찾아보자”
클라이드 톰보가 1930년 명왕성을 발견할 때 사용한 장치인 ‘반짝 비교정’을 복원한다. 그리고 현대적인 컴퓨터 비전 기술을 사용해 자동으로 행성이나 운석과 같이 별 시야에서 이동 중인 순간적인 천체를 찾아낸다. OpenCV와 NumPy를 활용한다.
6장 터틀 그래픽으로 궤적 그리기 - “우주 경쟁에서 승리하기 위한 아폴로 8호의 궤적 시뮬레이션”
위험한 도박에 참여해 미국의 아폴로 8호가 달 착륙 경쟁에서 승리할 수 있도록 돕는다. 미 항공우주국 나사(NASA)가 예상보다 1년이나 더 일찍 달 궤도에 도착해서 소련이 실질적으로 달 착륙 프로그램을 포기하게 만든, 똑똑한 자유 귀환 비행 궤적을 그림으로 그려서 실행해본다. turtle 모듈을 활용한다.
7장 넘파이로 통계 분석 처리하기 “- 안전한 화성 착륙 지점을 찾아라”
실제적인 미션 목표를 사용해 화성 착륙선의 잠재적인 착륙 후보지 범위를 좁힌다. 화성 지도에 후보 지점과 각 지점의 통계를 요약해 표시한다. OpenCV, 파이썬 이미징 라이브러리(Python Imaging Library), PIL, NumPy, tkinter에 대한 경험을 얻을 수 있다.
8장 OpenCV로 이미지를 처리하고 맷플롯립으로 시각화하기 - “멀리 떨어져 있는 외계행성을 찾아라”
외계행성이 항성의 앞을 통과하는 우주적 사건을 시뮬레이션하면서, 상대적인 광도 변화를 그래프로 그리고 행성의 지름을 추정한다. 새로 발사된 제임스 웹 우주 망원경이 직접 외계행성을 관찰한 결과를 시뮬레이션해서 행성의 하루 길이를 추산하면서 8장을 끝낸다. OpenCV, NumPy, matplotlib을 사용한다.
9장 OpenCV로 얼굴 형태 감지하기 - “사람과 외계인을 구별해내는 피아식별 장치를 만들라”
비전을 이용해 우주군 해병대와 적대적인 돌연변이를 구분하는 자동 포탑을 프로그래밍한다. OpenCV, NumPy, playsound, pyttsxw, datetime을 사용한다.
10장 머신러닝 알고리즘으로 개인별 얼굴 인식하기 - “외계인의 실험실 침입을 막아라”
얼굴 인식을 통해 보호된 실험실에 대한 접근을 제한한다. OpenCV, NumPy, playsound, pyttsxw, datetime을 사용한다.
11장 판다스와 시각화 도구로 지도 그리기 - “인터랙티브한 인구 밀도 지도를 만들어 좀비떼로부터 탈출하라”
TV 드라마 〈워킹 데드〉의 생존자들이 애틀랜타에서 탈출해 미국 서부의 안전한 지대로 대피하도록 돕는 인구 밀도 지도를 만든다. pandas, bokeh, holoviews, webbrowser 를 사용한다.
12장 프로파일러로 프로그램 실행 속도 추정하기 - “우리는 지금 현실 세계에 있는가 가상 세계에 사는가”
시뮬레이션 안의 존재(어쩌면 우리 자신일 수도 있음)가 자신이 컴퓨터 시뮬레이션 안에 살고 있음을 알 수 있는 증거를 찾는 방법을 식별한다. turtle, statistics, perf_counter를 사용한다.
각 장의 끝에는 [실습 프로젝트]나 [도전 프로젝트]가 있다. 해답은 이 책의 부록에 실려 있다. 이 책이 제시한 답이 유일한 정답은 아니며, 어쩌면 여러분만의 더 나은 해답을 찾을 수 있을 것이다. 하지만 [도전 프로젝트]는 여러분이 직접 해결해야 한다. 직접 해보거나 아니면 포기하거나 둘 중 하나이며, 직접 해보는 것은 무언가를 배우는 아주 훌륭한 방법이다. 이 책이 여러분에게 새로운 프로젝트를 시작할 동기가 되길 바란다. 이 책의 코드와 [실습 프로젝트] 해답을 이 책의 깃허브 페이지인 https://github.com/onlybooks/python-projects에서 다운로드할 수 있다.
| 이 책의 대상 독자 |
이 책은 2년 차 개발자를 대상으로 한 파이썬 서적이다. 기본 프로그래밍 기법은 다루지 않으며, 핸즈온 프로젝트를 기반으로 하는 실전 연습을 목표로 한다. 따라서 여러분은 이미 배운 개념을 재탕한 책을 사느라 쓸데없는 돈을 들이거나 책꽂이를 채우지 않아도 된다. 이 책에서는 프로젝트의 모든 단계를 설명하며, 라이브러리나 모듈을 사용하는 자세한 절차를 제시할 것이다. 물론 라이브러리나 모듈을 설치하는 방법도 함께 설명한다.
[추천사]
프로그래밍 세상에 첫발을 내디뎠을 때가 생각나는가? 컴퓨터라는 만능 기계를 완전히 통제할 수 있다는 기쁨도 잠깐이고, 말이 통하지 않는 하인을 어떻게 활용해야 할지 난관에 부딪히면서 좌절감이 들기 시작한다. 모든 일을 할 수 있으면서, 한편 아무 일도 하지 못하는 컴퓨터를 길들이기 위해 여러 가지 시도를 한다. 프로그래밍 언어를 배우면서 표준 라이브러리를 기웃거리다가, 다양한 프레임워크와 외부 라이브러리를 활용하면서 오픈소스로 만들어진 각종 소프트웨어를 실행하고 경우에 따라 뜯어보게 된다. 여기까지 진행해왔다면 근본적인 질문이 떠오르기 마련이다. 실생활에서 부딪히는 문제를 풀기 위해 컴퓨터를 활용하려 한 건데 정작 나는 컴퓨터가 제대로 동작하게 만드는 기술만 익히고 있는 건 아닐까?
하지만 현실에서 직면한 문제를 잘 정의한 다음에 컴퓨터가 해결하도록 만드는 작업은 결코 쉽지 않다. 많은 대기업과 스타트업의 사무실에서 수많은 개발자들이 매일같이 더 나은 세상을 만들기 위한 소프트웨어 개발에 매진하고 있다는 사실이 이를 증명한다. 사람은 모호한 요구사항도 적절히 알아서 처리하는 융통성이 있지만, 컴퓨터는 한 바이트만 잘못되어도 문제 풀이를 거부한다. 아니, 이는 지극히 사람 관점으로 바라본 아쉬움이고, 컴퓨터는 사람의 명령을 거부하는 대신 잘못된 한 바이트까지 묵묵하게 수행할 뿐이다. 소프트웨어 개발이 어려운 이유를 설명하려면, 컴퓨터가 존재하는 세상과 사람이 살아가는 세상 사이에는 크나큰 간극이 존재한다는 사실에서 출발할 필요가 있다.
그렇다면 학습 목적이나 개인적인 취미 목적으로 컴퓨터에게 제대로 된 문제 풀이를 시키기 위해 어떤 연습이 필요할까? 수학이나 논리학을 공부해 엄정한 요구사항을 뽑아내면 될까? 아니면 공학적인 관점에서 접근해 미리 만들어진 라이브러리나 프레임워크를 활용해 API를 적절히 조합하면 될까? 그것도 아니면, 다양한 실험을 통해 시행착오를 거치면서 원하는 결과를 도출할 때까지 알고리즘을 개선하면 될까? 결론적으로 이 모든 연습이