러닝파이썬제 5 판 Learning Python, 5th Edition 상편
LEARNING PYTHON 2018 J-Pub Co. Authorized Korean translation of material included in the English edition of LEARNING PYTHON 5th ed, ISBN 9781449355739 c 2013 Mark Lutz This translation is published and sold by permission of O Reilly Media, Inc., which owns or controls all rights to publish and sell the same. 이책의한국어판저작권은에이전시원을통해저작권자와의독점계약으로제이펍에있습니다. 신저작권법에의해한국내에서보호를받는저작물이므로무단전재와무단복제를금합니다. 1쇄발행 2018년 3월 28일지은이마크러츠옮긴이강성용, 조인중펴낸이장성두펴낸곳제이펍출판신고 2009년 11월 10일제406-2009-000087호주소경기도파주시회동길 159 3층 3-B호전화 070-8201-9010 / 팩스 02-6280-0405 홈페이지 www.jpub.kr / 원고투고 jeipub@gmail.com 독자문의 readers.jpub@gmail.com / 교재문의 jeipubmarketer@gmail.com 편집부이민숙, 황혜나, 이슬, 이주원 / 소통 기획팀민지환 / 회계팀김유미교정 교열이주원 / 본문디자인이민숙용지신승지류유통 / 인쇄해외정판사 / 제본광우제책사 ISBN 상편 979-11-88621-07-1 (93000) 하편 979-11-88621-16-3 (93000) 세트 979-11-88621-17-0 (93000) 값 38,000원 이책은저작권법에따라보호를받는저작물이므로무단전재와무단복제를금지하며, 이책내용의전부또는일부를이용하려면반드시저작권자와제이펍의서면동의를받아야합니다. 잘못된책은구입하신서점에서바꾸어드립니다. 제이펍은독자여러분의아이디어와원고투고를기다리고있습니다. 책으로펴내고자하는아이디어나원고가있으신분께서는책의간단한개요와차례, 구성과저 ( 역 ) 자약력등을메일로보내주세요. jeipub@gmail.com
러닝파이썬제 5 판 Learning Python, 5th Edition 상편 지음 / 옮김
드리는말씀 이책에기재된내용을기반으로한운용결과에대해저자, 역자, 소프트웨어개발자및제공자, 제이펍출판사는일체의책임을 지지않으므로양해바랍니다. 이책에등장하는각회사명, 제품명은일반적으로각회사의등록상표또는상표입니다. 본문중에는 TM, C, R 마크등이 표시되어있지않습니다. 이책에서사용하고있는제품버전은독자의학습시점이나환경에따라책의내용과다를수있습니다. 기타자료 ( 부록, 찾아보기 ) 의 PDF 파일은다음의제이펍출판사 GitHub 페이지에서다운로드하실수있습니다. 러닝파이썬 GitHub 페이지 : https://github.com/jpub/learningpython 책내용과관련된문의사항은옮긴이나출판사로연락주시기바랍니다. - 옮긴이 : ulzima@gmail.com - 출판사 : readers.jpub@gmail.com
차례 xii xv xl 부록과찾아보기는이책의하편에실려있으며, https://github.com/jpub/learningpython 에서 PDF 파일로도다운로드하실수있습니다. PART 1 CHAPTER 1 CHAPTER 2 CHAPTER 3 시작하기 _1 Q&A _3 왜파이썬을사용하는가? 3 파이썬은 스크립트언어 인가? 6 그렇다면단점은무엇인가? 8 누가파이썬을사용하는가? 11 파이썬으로무엇을할수있는가? 13 파이썬은어떻게개발되고유지되는가? 19 파이썬의기술적인강점은무엇인가? 20 파이썬은다른언어와어떻게비교될수있는가? 27 이장의요약 29 학습테스트 : 퀴즈 29 학습테스트 : 정답 30 _33 파이썬인터프리터소개 33 프로그램실행 35 실행모델변형들 41 이장의요약 51 학습테스트 : 퀴즈 51 학습테스트 : 정답 51 _53 대화형프롬프트 54 시스템명령라인과파일 67 유닉스방식의실행스크립트 : #! 75 파일아이콘클릭하기 78 모듈임포트와리로드 84 exec로모듈파일실행하기 92 IDLE 사용자인터페이스 94 차례 v
다른 IDE 도구들 101 다른실행옵션 103 어떤옵션을사용해야하는가? 106 이장의요약 108 학습테스트 : 퀴즈 109 학습테스트 : 정답 109 학습테스트 : 파트 1 실습문제 111 PART 2 CHAPTER 4 CHAPTER 5 CHAPTER 6 타입과연산 _115 _117 파이썬의계층구조 118 내장된타입을사용하는이유 118 파이썬핵심데이터타입 120 숫자 122 문자열 124 리스트 137 딕셔너리 144 튜플 154 파일 155 그외의코어타입 161 이장의요약 166 학습테스트 : 퀴즈 167 학습테스트 : 정답 168 _169 숫자타입의기본 169 숫자의동작 179 다른숫자타입 200 숫자의확장 219 이장의요약 220 학습테스트 : 퀴즈 220 학습테스트 : 정답 221 _223 사라진선언문 223 공유참조 229 동적타입변환은어디에나존재 235 이장의요약 236 학습테스트 : 퀴즈 237 학습테스트 : 정답 237 vi 차례
CHAPTER 7 CHAPTER 8 CHAPTER 9 _239 이장의범위 239 문자열의기초 241 문자열리터럴 243 문자열의실제동작 253 문자열메서드 265 문자열포매팅표현식 275 문자열포매팅메서드호출 281 일반적인타입분류 298 이장의요약 300 학습테스트 : 퀴즈 301 학습테스트 : 정답 301 _303 리스트 303 리스트의실제동작 306 딕셔너리 318 딕셔너리의동작 320 이장의요약 344 학습테스트 : 퀴즈 345 학습테스트 : 정답 345 _347 튜플 348 파일 356 코어타입의복습과요약 373 내장타입사용시주의사항 389 이장의요약 393 학습테스트 : 퀴즈 393 학습테스트 : 정답 394 학습테스트 : 파트 2 실습문제 395 PART 3 CHAPTER 10 문과구문 _399 statement _401 파이썬설계개념계층구조다시보기 401 파이썬의문 402 두 if 이야기 404 빠른예제 : 대화형루프 414 이장의요약 423 학습테스트 : 퀴즈 423 학습테스트 : 정답 424 차례 vii
CHAPTER 11 CHAPTER 12 CHAPTER 13 CHAPTER 14 CHAPTER 15 _425 할당문 425 표현식문 446 출력연산들 448 이장의요약 464 학습테스트 : 퀴즈 464 학습테스트 : 정답 465 if _467 if 문 467 파이썬구문다시보기 472 진릿값과부울테스트 479 if/else 삼중표현식 481 이장의요약 485 학습테스트 : 퀴즈 485 학습테스트 : 정답 485 while for _487 while 루프 488 break, continue, pass, 그리고루프 else 490 for 루프 496 루프코딩기법 / 기술 505 이장의요약 521 학습테스트 : 퀴즈 521 학습테스트 : 정답 521 _523 루프 : 처음보기 524 리스트컴프리헨션 : 최초의상세한설명 534 다른반복상황들 541 파이썬 3.X 에서새로운반복객체들 547 다른반복주제들 555 이장의요약 556 학습테스트 : 퀴즈 556 학습테스트 : 정답 557 _559 파이썬문서화소스들 559 일반적인코딩시주의사항 583 이장의요약 586 학습테스트 : 퀴즈 586 학습테스트 : 정답 587 학습테스트 : 파트 3 실습문제 587 viii 차례
PART 4 CHAPTER 16 CHAPTER 17 CHAPTER 18 CHAPTER 19 CHAPTER 20 함수와제너레이터 _591 _593 왜함수를사용하는가? 594 함수코딩하기 595 첫번째예제 : 정의와호출 599 두번째예제 : 시퀀스의교집합구하기 602 이장의요약 606 학습테스트 : 퀴즈 606 학습테스트 : 정답 607 _609 파이썬범위의기본 609 global문 621 범위와중첩함수 627 3.X에서의 nonlocal문 637 왜 nonlocal인가? 상태유지방법들 642 이장의요약 651 학습테스트 : 퀴즈 651 학습테스트 : 정답 653 _655 인수 전달방식의기본 655 특별한인수매칭모드 662 최솟값구하기 679 일반화된집합함수들 683 파이썬 3.X의 print 함수흉내내기 686 이장의요약 690 학습테스트 : 퀴즈 691 학습테스트 : 정답 692 _693 함수설계개념 693 재귀함수 696 함수객체 : 속성과어노테이션 704 익명함수 : 람다 711 함수형프로그래밍도구 719 이장의요약 725 학습테스트 : 퀴즈 725 학습테스트 : 정답 725 _727 리스트컴프리헨션과함수형도구들 727 제너레이터함수와제너레이터표현식 740 컴프리헨션구문요약 780 차례 ix
이장의요약 784 학습테스트 : 퀴즈 785 학습테스트 : 정답 785 CHAPTER 21 _787 반복도구들의성능측정 787 timeit을이용한반복과파이썬성능측정 804 다른벤치마킹주제 : pystone 820 함수주의사항 821 이장의요약 828 학습테스트 : 퀴즈 828 학습테스트 : 정답 829 학습테스트 : 파트 4 실습문제 830 PART 5 CHAPTER 22 CHAPTER 23 CHAPTER 24 모듈과패키지 _835 _837 왜모듈을사용하는가? 838 파이썬프로그램아키텍처 839 임포트작동방식 843 바이트코드파일 : 파이썬 3.2+ 에서의 pycache 846 모듈검색경로 849 이장의요약 857 학습테스트 : 퀴즈 858 학습테스트 : 정답 858 _861 모듈생성 861 모듈사용법 863 모듈네임스페이스 871 모듈리로드하기 878 이장의요약 883 학습테스트 : 퀴즈 883 학습테스트 : 정답 883 _885 패키지임포트기초 886 패키지임포트예제 891 왜패키지임포트를사용하는가? 893 패키지에상대적인임포트 898 파이썬 3.3 네임스페이스패키지 920 이장의요약 930 학습테스트 : 퀴즈 930 학습테스트 : 정답 931 x 차례
CHAPTER 25 _933 모듈설계개념 933 모듈에데이터숨기기 935 이후버전의언어특징을활성화시키기 : future 937 복합사용모드 : name 과 main 938 예제 : 이중모드코드 941 모듈검색경로변경 948 import와 from에대한 as 확장 949 예제 : 모듈은객체 951 이름문자열로모듈을임포트하기 954 예제 : 이행적모듈리로드 956 모듈관련주의사항 965 이장의요약 973 학습테스트 : 퀴즈 973 학습테스트 : 정답 974 학습테스트 : 파트 5 실습문제 975 차례 xi
옮긴이머리말 이책은 1999년초판이출간된후지속적으로파이썬의새로운기능과변화, 버전변경등을반영하여 5판까지개정을계속해왔다. 이책의저자인마크러츠는 30년가까운세월동안파이썬의변화를충실하게반영한셈이다. 원서의경우초판은 384페이지에불과했으나, 5판에이르러서는원서기준으로 1,648페이지에이르렀다. 이를볼때저자가이책에얼마나열정을기울여왔는지알수있다. 러닝파이썬 ( 제5판 ) 은 8개의파트와 41개의장으로구성되어있다 ( 부록제외 ). 각파트에서다루는내용을간략하게요약하면다음과같다. 파트 1. 시작하기파트 1에서는파이썬의용도, 파이썬프로그램실행방법등파이썬에대한기초적인내용을다룬다. 이책의독자들은대부분어느정도파이썬이무엇인지정도는알고있으리라생각하지만, 그렇지않은독자들도있기때문에파이썬에대한기초적인개념및용도등을익힐수있도록하고있다. 파트 2. 타입과연산파트 2부터는본격적인파이썬프로그래밍언어에대한학습을시작한다. 파이썬에대한기본적인개념을이미이해하고있는독자라면파트 1을건너뛰고파트 2부터읽어도좋다. 파트 2에서는거의모든프로그래밍언어학습과정에서제일처음접하게되는타입에대해다루고있다. 여기서는객체, 숫자등의기초적인타입과타입의변환, 문자열, 리스트및딕셔너리, 튜플, 파일까지파이썬에서접할수있는모든타입에대해다룬다. xii 옮긴이머리말
파트 3. 문과구문 파트 3에서는파이썬의문 (statement) 와구문 (syntax) 에대해다루고있다. 파이썬프로그램을작성할때사용하는다양한문장형식과문법및루프활용방법등에대해다루고있다. 또한프로그램소스코드안에서의문서화방법및문서화도구에대해서도다룬다. 파트 4. 함수와제네레이터파트 3에서학습한파이썬의문과구문을바탕으로절차적프로그래밍에서함수를사용한모듈화및코드재사용으로의전환에대해다루고있다. 파트 4 후반부에서는함수형프로그래밍에사용되는람다식에대해서다루고있다. 최근여러프로그래밍언어에서람다식이널리활용되고있으므로, 람다식에대해서학습해둘것을권장한다. 21장에서는파이썬의다양한반복도구에대한상대적인성능측정방법에대해다루고있다. 파트 5. 모듈과패키지파트 5에서는라이브러리개념인모듈과패키지에대해다루고있다. 모듈의개념과활용범위에대해학습하고, 모듈작성방법에대한실제적인예제를볼수있다. 또한파이썬 3.3 이후버전에서사용할수있는네임스페이스패키지모듈에대해서도학습할수있다. 파트 6. 클래스와객체지향프로그래밍이책의후반부에해당하는파트 6부터는파이썬의객체지향프로그래밍개념에대해다루고있다. 객체지향프로그래밍의기본적인요소인상속및다형성등을어떻게구현하는지학습할수있고, 가장중요한개념인클래스와객체상속트리, 그리고객체상속트리내에서의이름검색등에대해배우게된다. 그리고 3.X 버전부터도입된새로운형식의클래스가 2.X 에어떻게백포팅 (back-porting) 되어활용되는지에대해서도다루고있다. 규모가큰프로그램을작성해야한다면해당파트를반드시읽어볼것을권장한다. 파트 7. 예외와도구 파트 7에서는파이썬의예외 (exception) 에대해다루고있다. 대부분의언어에서지원하는예외처리방법이파이썬에서어떻게구현되어있는지, 그리고코드를작성할때예외를어떻게활용할수있는지학습할수있다. 또한, 예외를어떻게설계하는지에대해서도다루고있으므로내용을충분히이해하면큰도움이될것이다. 옮긴이머리말 xiii
파트 8. 고급주제파트 8에서는일반적으로사용빈도가높지않은파이썬의고급기능들에대해다룬다. 37장에서는유니코드와바이트문자열을다루는방법에대해집중적으로설명하고있으며, 관리속성, 데코레이터, 메타클래스등파이썬의고급기법에해당하는내용을다루고있다. 이장에서다루는주제들은앞부분에서조금씩언급되었으나, 내용의난이도와낮은활용도로인해자세하게는설명하지않았다. 이파트의내용은독자가필요로할때찾아보고참조할것을권장한다. 파트 9. 부록여기서는하나의파트로분류하기모호한주제들에대해설명하고있다. 파이썬의설치및환경설정방법, 윈도우런처사용방법등에대해다루고있으며, 이책의각판에반영된파이썬변경사항에대해서도다루고있다. 또한, 각장의마지막에있는실습문제에대한해답을부록 D에수록해놓았다. 부록은다음의사이트에서 PDF 파일로도다운로드할수있다. https://github.com/jpub/learningpython 이책은파이썬에대한거의모든내용을다루고있다고해도좋을정도로그내용이광범위하며, 파이썬 2.X 버전과 3.X 버전의차이에대해서도잘설명하고있다. 특히, 대부분의예제코드를 2.X 와 3.X 버전에대해나누어설명하여독자가차이점을쉽게이해할수있도록배려하고있다. 이부분은이책이가진가장큰장점중의하나다. 독자의스타일에따라이책을처음부터끝까지읽을수도있고, 관심을가진부분만을선택하여읽을수도있으며, 일종의레퍼런스로필요할때만활용할수도있다. 당연한말이지만책을읽는정해진방법은없으며, 어떤방식이든독자가이책을최대한으로활용할수만있다면그방법이독자에게맞는방법일것이다. 30년에가까운긴시간동안파이썬의변화를추적해가며점점더충실한책을만들어온저자인마크러츠에게경의를표하며, 독자들이이훌륭한책을긴시간동안옆에두고활용할수있다면옮긴이로서더이상의기쁨은없을것같다. Happy Python Programming! 옮긴이강성용, 조인중 xiv 옮긴이머리말
서문 여러분이서점에서이책의요약부분을찾고있었다면다음을읽어보기바란다. 파이썬은프로그래머의생산성과코드가독성, 그리고소프트웨어품질을높이는데있어최적화된, 매우강력한프로그래밍언어다. 이책은파이썬언어에관하여통합적이면서도깊이있게소개함으로써실제업무에적용하기전에파이썬의기본을마스터할수있도록도와준다. 이전판과마찬가지로이번판도모든파이썬초보자 ( 파이썬 2.X를사용하든 3.X 를사용하든, 또는둘다를사용하든 ) 들을위한모든학습자료를제공하고있다. 이번판에서는파이썬 3.6 과 2.7 버전의내용을다루고있으며, 파이썬세상에서현재많이다뤄지고있는최신주제를대폭반영하였다. 서문에서는이책의목적과범위그리고목차를좀더상세하게다룰예정이다. 물론, 서문을읽을지말지는여러분의자유지만, 이방대한책을시작하기전개요를파악하는데좋을것이다. 이책의 생태계 파이썬은다양한영역에서단독프로그램과스크립트애플리케이션에동시에활용이가능한, 인기있는오픈소스프로그래밍언어다. 파이썬언어는무료인데다이식성이뛰어나고, 사용하기편한데, 심지어재미있기까지하다. 소프트웨어산업에종사하는대부분의프로그래머가크고작은프로젝트를진행하는데있어개발자의생산성과소프트웨어의품질측면에서파이썬이얼마나큰전략적이점을가졌는지를경험하고있다. 서문 xv
여러분이프로그래밍을처음접하는사람이든, 전문개발자든지에상관없이이책은여러분을파이썬언어에정통하게해준다. 이책을다읽고나면여러분은모든애플리케이션영역에서파이썬을사용하여개발하기에충분한지식을갖게될것이다. 또한, 이책은특정영역의용례보다는파이썬언어자체를설명하는지침서로활용될수있도록기획하였다. 따라서다음두권중첫번째내용을제공하는것을목표로한다. 러닝파이썬 (Learning Python) : 이책은파이썬자체, 즉여러영역으로확장할수있는언어의기본에집중하여설명한다. 프로그래밍파이썬 (Programming Python) : 파이썬에대해배우고난뒤에파이썬으로무엇을할수있는지를보여준다. 이처럼책을두권으로나눈이유는언어응용편의목적은독자에따라달라질수있지만, 언어의기본을다루는책의범위는독자의영향을받지않기때문이다. 프로그래밍파이썬 과같은응용편은이책 ( 러닝파이썬 ) 의끝에서알아볼파이썬의일반적인응용영역 ( 웹, GUI, 시스템, 데이터베이스, 텍스트등 ) 에서파이썬의다양한역할에대한실제예시를제공한다. 이와더불어 파이썬포켓레퍼런스 (Python Pocket Reference) 는이책에포함되지않은참고자료를제공함으로써이책의내용을보완한다. 이책이언어의기초에집중하고있긴하지만, 많은프로그래머들이언어를처음접할때배우는것보다더깊은내용을다루고있다. 이책은언어의기초부터다루되, 다루는내용에관한예시를모두포함하고있어한번에한단계씩언어의모든것을학습하도록구성되어있다. 이책을읽는과정에서배우게될언어자체에대한핵심기술은앞으로여러분이만나게될모든파이썬소프트웨어시스템 ( 현재가장인기있는 Django( 장고 ), NumPy( 넘파이 ), App Engine( 앱엔진 ) 등 ) 에적용될것이다. 이책은실습과퀴즈가포함된 3일짜리파이썬교육프로그램을기반으로독자여러분이자기진도에맞추어언어를학습해나갈수있도록구성되었다. 비록이책이교육프로그램처럼상호교류가가능한형태로구성되지는않았으나, 교육프로그램에서는다룰수없는, 책에서만제공가능한깊이와유연성있는내용으로이러한아쉬움을해소할수있으리라생각한다. 이책을활용하는방법에는여러가지가있겠지만, 처음부터그내용을따라학습하는독자라면한학기분량의파이썬수업을듣는것과거의같은효과를경험할수있을것이다. xvi 서문
다섯번째개정판에대하여 2009년에출판된네번째개정판은파이썬 2.6 과 3.0 1 버전까지를다루고있어서일반적으로 3.X 버전에새로도입된변경내역들 ( 그중에는이전버전과는호환되지않는내용도포함되어있다 ) 에관하여이번개정판에서설명하고있다. 이번개정판에서는새로운객체지향프로그래밍 (OOP) 튜토리얼과함께유니코드텍스트 (Unicode Text), 데코레이터 (decorator), 메타클래스 (metaclasses) 와같은좀더난이도있는주제에관하여다루는장을추가했다. 이내용들은내가가르치는교육프로그램과최신파이썬변경사항들을참고했다. 이책은이전개정판에서다루지못한최신파이썬 3.6 과 2.7 버전의내용을포함하여개정하 였다. 이전개정판이나온이래각파이썬버전에서변경된내용에관하여모두포함하고있으 며, 표현을좀더다듬었다. 파이썬 2.X에서는이전에는 3.X 에서만지원되다가 2.7 에서도지원되기시작한딕셔너리 (dictionary) 나집합컴프리헨션 (set comprehension) 을함께다룬다. 파이썬 3.X 에서는 yield와 raise 구문, pycache 바이트코드모델, 3.3 네임스페이스패키지, PyDoc의도움말을웹페이지에서확인할수있는새로운브라우저모드, 유니코드리터럴 (Unicode literal) 과스토리지변경, 파이썬 3.3 에탑재된새로운윈도우런처 (Launcher) 에관한설명을추가하였다. 2.X 버전에서호환성측면에서일반적으로나아진점과함께 JSON, timeit, PyPy, os.popen, 제너레이터 (generators), 재귀탐색 (recursion), 약한참조 (weak references), mro, iter, super, slots, 메타클래스 (metaclasses), 디스크립터 (descriptor), random, 스핑크스 (Sphinx) 외많은기능에관하여다양한예시와함께설명하였다. 또한이책은 41 개장을통해서파이썬의진화에관한새로운결론을더했으며, 최근파이썬 의변경내역과새로운윈도우런처에대해다루는두개의새로운부록과이전코드타이밍 예시의확장버전에관하여다루는장이추가되었다. 부록 C 에는이전개정판과이번개정판 1 2007 년에출판된세번째개정판은파이썬 2.5 와더간단하고짧고단순한파이썬세상을다루고있다. 이책의개정내역들은 http://learning-python.com/books 에서확인할수있다. 이책은파이썬의성장이그러했듯이여러해를거쳐그규모와복잡도가커졌다. 부록 C 를보면파이썬 3.0 에서만추가된기능이 27 개, 변경내역이 57 개가있으며, 파이썬 3.3 에서도동일하게추가되 고변경되는사항들이꾸준히발생하고있다. 현재파이썬프로그래머들은서로양립할수없는두개의버전과세개의주요패 러다임, 고급도구의과잉, 그리고 2.X 와 3.X 버전이깔끔하게분리되지않아서발생하는기능적중복성에직면하고있다. 이러 한것은들리는것만큼그리벅찬것은아니며, ( 많은도구가하나의주제에변형을준것이라 ) 파이썬텍스트내에서이루어지 는공정한게임이라고이해하면된다. 서문 xvii
사이에발생한파이썬의변경내역에관하여간결하게요약해두었다. 또한이부록은이전개정판에서도설명했던 2.X 와 3.X 사이의초기차이점에대하여요약하고있지만, 그중새로운스타일의클래스와같은몇몇기능은여러버전으로확장되어결국 3.X 에서필수기능이되었다 ( 버전에서 X가나타내는의미에관해서는곧이야기하겠다 ). 앞선항목마지막내용에따르면, 이책은우리중많은이들이지난십수년간선택적사항이라고여겼으나이젠파이썬코드에보편적으로사용되는, 이른바진보된언어의기능들에대하여다룸으로써그내용이더욱풍부해졌다. 앞으로보게되겠지만이러한도구들이파이썬을보다강력하게하는반면, 새로운입문자들의진입장벽을높이기도하고파이썬의범위와그정의를바꾸기도한다. 우리는이중어느것이든마주하게될가능성이있다. 따라서마치이러한도구나기능들이없는듯묻어둔채돌아서기보다는정면으로맞서서다루고자한다. 이러한개정에도불구하고이책은이전버전의구조와내용의대부분을유지함으로써여전히파이썬 2.X 와 3.X 버전모두의통합교재로활용될수있도록구성하였다. 우선적으로파이썬 3.6 과 2.7(3.X 와 2.X 의최신릴리즈 ) 사용자들에게초점을맞추어집필하였으나, 이전버전들의내용을통해현재도일반적으로볼수있는이전버전의파이썬의내용에대하여알수있다. 이책은거의 30년가까이유효했고 ( 미래를예측하긴어렵지만 ) 앞으로릴리즈될파이썬에서도적용이가능한파이썬언어의기본기능에집중하고있다. 늘그렇듯이, 이책에영향을줄만한파이썬의개정내역에대해서는앞서기술한이책의웹사이트에포스팅할예정이다. 파이썬매뉴얼의 What s New 에서도이책이출판된이후에나온파이썬의개정내역을확인할수있다. 파이썬 2.X 와 3.X 이책의내용에많은영향을끼치고있는파이썬 2.X 와 3.X 와관련된내용을서두에일부언급하고자한다. 네번째개정판이집필되던 2009년당시, 파이썬은막두갈래로나뉘어발전하기시작했다. 3.0 버전은당시막부상하기시작한버전으로서기존파이썬과는호환되지않는언어의변형을이루었고, 일반적으로 3.X 로알려진버전의최초버전이다. xviii 서문
2.6 버전은기존파이썬코드와의호환성을유지하면서발전해왔으며, 2.X 의최신버전이었다. 크게보면 3.X 는같은언어이지만, 다음의이유로이전릴리즈에서쓰인코드가이버전에서는동작하지않는다. 문자열, 파일, 그리고라이브러리를포괄할수있는유니코드모델을반드시사용하도록했다. 기능성을극대화하기위한패러다임의한측면으로, 반복자 (iterator) 와제너레이터 (generator) 를보편화시켰다. 타입을통합한새로운스타일의클래스를강제하여보다강력하고복잡해졌다. 많은기본적인도구와라이브러리를변경했고, 다른것들은대체되거나완전히제거되었다. print를문에서함수로변형한것은이전까지작성된거의모든파이썬프로그램을뜯어고쳐야할정도의영향을미친다. 전략적잠재력은차치하고라도 3.X 에서필수적인유니코드, 클래스모델, 그리고보편적인제너레이터는지금까지와는다른프로그래밍경험을제공한다. 많은사람이파이썬 3.X 를파이썬의개량버전혹은미래로여겼지만, 파이썬 2.X 는여전히널리사용될뿐더러수년간파이썬 3.X 와함께지지를받아왔다. 현재사용되고있는파이썬코드의대부분은 2.X 로작성되어있으며, 3.X 로의전환은서서히이루어지고있는것으로보인다. 오늘날의 2.X 와 3.X 이야기 이번다섯번째개정판작업을하는 2018년현재기준으로, 파이썬 3.6 버전과 2.7 버전이출시되었지만, 2.X 와 3.X 의내용은여전히크게변한것이없다. 실은현재파이썬은두버전이공존하고있으며, 많은사용자가자신의소프트웨어의목적과의존성에맞추어 2.X 와 3.X 를동시에활용하고있다. 또한, 대다수의입문자에게는 2.X 와 3.X 중무엇을선택할것인가는기존의소프트웨어와언어의최첨단중무엇을선택할것인가의문제로남는다. 많은주류파이썬패키지가 3.X 로전환되고있다하더라도여전히 2.X 로남아있는패키지들이지금도많이존재한다. 혹자는파이썬 3.X 를새로운아이디어를탐색하기에좋은샌드박스 (sandbox) 로여기는반면, 2.X 는신뢰할만한파이썬으로바라보고있어서비록 3.X 의기능을모두가지고있지는않지만여전히널리사용되고있다. 또다른이들은현재핵심개발자들의계획에힘을얻어파이 서문 xix
썬 3.X 가파이썬의미래로여기고있다. 비록당분간은파이썬 2.7 이사용자들의지지를받으며유지되겠지만, 이는 2.X 의마지막버전이될예정인반면에 3.6 은앞으로꾸준히진화할 3.X 버전의최신버전이다. 그리고놀라운성능향상을제공하는파이썬 2.X 로만구현된 PyPy와같은구현체는 2.X 의미래를대표한다고볼수있다. 이모든의견은차치하고라도, 3.X 는릴리즈후거의 10년이지나도록 2.X 를앞지르기는커녕사용자기반을따라잡지도못했다. 이는 python.org에서윈도우용파이썬에대한다운로드횟수를살펴보면 ( 새로운사용자와가장최신버전을다운받는사람들이포함되어있음에도 ) 여전히 2.X 버전이 3.X 버전보다많다. 물론이러한통계는언제든지달라질수있지만, 그럼에도불구하고이결과가 3.X 버전이릴리즈된지 10년후의결과라는면에서 3.X 의활용도에대해시사하는바가있다. 기존의 2.X 소프트웨어기반은여전히 3.X 의언어확장버전으로넘어오지않고있다. 더군다나 3.X 버전의꾸준한변화에도아랑곳하지않고 2.7 버전이 2.X 버전의마지막릴리즈로서사실상의표준으로여겨지고있다. 이는안정적인버전을선호하는이들에게는바람직한현상이겠지만, 성장과꾸준한변화를원하는이들에게는부정적으로느껴질것이다. 나는개인적으로오늘날파이썬세상은 3.X 와 2.X 버전모두를포괄할만큼충분히크다고생각한다. 두버전은각각다른목표를만족시키고다른진영의사람들에게매력적일것이다. 또한, 이러한선례는이전의다른언어군에서도볼수있는데, 예를들어 C와 C++ 는파이썬 2.X 와 3.X 보다더많은차이점이있음에도오랜기간공존해왔다. 더구나이들은서로매우유사하므로둘중한버전에서배운기술은거의대부분다른버전으로의전이가가능하다. 특히, 여러분이이책과같이두버전을모두다루는교재의도움을받는다면더욱쉽게버전간의기술전이가가능할것이다. 여러분이이들이얼마나다른지를이해한다면가끔은두버전에서모두동작가능한코드를작성할수도있다. 이렇게버전이나뉘어동시에발전하는것은프로그래머와나 ( 지은이 ) 모두를상당한딜레마에빠지도록만든다. 책에서는파이썬 2.X 가마치존재하지않는양 3.X 버전만을기술하는것이더쉽겠지만, 이럴경우오늘날존재하는대규모파이썬사용자기반의필요를해결해줄수없게된다. 기존의엄청난양의코드들이이미파이썬 2.X 에서작성되었으며, 이들은가까운시일내에사라지거나하지않을것이다. 또한, 몇몇입문자는파이썬 3.X 에집중하여배울수도있겠으나, 과거에작성된코드를사용해야하는사람들이라면어쩔수없이파이썬 2.X 세상에한쪽발을걸쳐둘수밖에없다. 비록제삼자에의해작성된라이브러리와확장들 (extensions) 의많은부분이파이썬 3.X 버전으로이식된지여러해라하더라도, 3.X 와 2.X 로나뉘어발전하는이현상이일시적이지는않을것이다. xx 서문
3.X 와 2.X 버전모두적용 이책은이렇게이원화되어발전하고있는상황을타개하고모든잠재적독자들의필요를만족시키기위하여파이썬 3.6 과 2.7 을모두다루고있으며, 이로써 2.X 를사용하는프로그래머와 3.X 를사용하는프로그래머, 그리고그둘사이에끼여있는프로그래머들모두를아우르고자노력하였다. 즉, 이책을통해파이썬의어떤버전이라도배울수있다. 비록 3.X 를강조하더라도예전코드를활용하는프로그래머를위하여 2.X 의차이점과도구에대해서도함께설명한다. 크게보면두버전이유사하지만몇몇중요한부분에서차이점을보이는데, 이에관한것은내용중등장할때마다설명하도록하겠다. 예를들어, 대부분의예제에서 3.X 의 print 함수를호출하여사용하더라도 2.X 의 print문에관하여설명함으로써독자들로하여금이전에작성된코드에대해서도이해할수있도록하였고, 또가끔은두버전모두에서실행가능한이식성있게작성된출력기술을사용하기도한다. 아울러 3.X 의 nonlocal문이나 2.6 과 3.0 의문자열 format 메서드와같은새로운기능들에관해서도자유롭게소개할것이며, 이전파이썬에서더는사용되지않을때는이에대해서도함께언급하였다. 이책에서는 2.X 와 3.X 버전의다른릴리즈에관하여도함께다루고있지만, 2.X 의이전버전에서작성된몇몇코드에서는여기에서다룬모든예제가실행되지않을수있다. 비록클래스데코레이터 (class decorator) 가파이썬 2.6 과 3.0 모두에서사용가능하지만, 예를들어이를지원하지않는파이썬 2.X 의이전버전에서는사용할수없다는것이다. 관련하여최근 2.X 와 3.X 의변경내역에관한요약은부록 C의변경내역표에서확인할수있다. 어떤버전의파이썬을이용해야하는가? 파이썬버전선택은여러분이속한조직에의해이미정해져있겠지만, 파이썬을처음접하고스스로학습하는이들이라면어느버전을설치해야할지고민이될것이다. 이에대한답은파이썬을통해얻고자하는목표에따라다르다. 다음에몇가지버전선택과관련된제안을해보겠다. 서문 xxi
3.X를선택 : 새로운기능그리고진화만약파이썬을처음배우면서기존 2.X 로작성된코드를활용할필요가없다면, 파이썬 3.X 로시작하라고권하고싶다. 3.X 는언어에다년간존재하던불필요하고불쾌한것들을깨끗이제거하면서도원래언어가가지고있던핵심개념을유지하면서몇몇의멋지고새로운도구를도입하였다. 예를들어 3.X 의유니코드모델과제너레이터, 함수사용기술은많은사용자가매력적인기능으로여긴다. 인기있는많은파이썬라이브러리와도구는이미 3.X 에서도사용가능하거나, 3.X 버전의지속적인발전을생각해보면이글을읽을때쯤에는가능해졌을것이다. 새로운기능을추가하고파이썬의기조를유지하는한편, 기술의최첨단에서있는언어로끊임없이달라지는목표에맞춰언어의정의를맞추어나가는등의모든새로운언어적진화는 3.X 에서만이루어지고있다. 2.X를선택 : 기존코드, 안정성만약파이썬 2.X 를기반으로한시스템을활용하고있다면, 3.X 버전은현재로서는아마도선택사항일것이다. 그러나이책을통해관심있는영역에관해서도배워나갈수있으며, 이후에 3.X 로이관하게될때에도도움이될것이다. 또한, 2.X 버전만으로도꽤커다란범주에속해있음을알게될것이다. 2012년에내가가르쳤던모든그룹은 2.X 만을사용하였는데, 여전히 2.X 로만구현된유용한파이썬소프트웨어들을꾸준히만나볼수있었다. 더군다나 3.X 와는달리 2.X 는 ( 묻는당사자에따라자산으로든부채로든 ) 추가변경사항이없다. 2.X 코드를사용하고작성하는것은문제가되지않으나, 다만 3.X 의진화에대해관심을가지고주시하고싶을수도있다. 파이썬의미래는아직쓰이지않았으며, 여러분을포함한파이썬사용자들에의해결정될것이다. 두버전모두를선택 : 버전중립적인코드아마도여기에서가장좋은소식은파이썬의기본은두버전모두에서똑같다는것이다. 그러나곧많은사용자가 2.X 와 3.X 의차이점이사소한곳에있음을알게될것이다. 이책은두버전을모두배울수있도록구성되어있다. 이책에서도종종그렇듯사실둘사이의차이점에대해이해하고있는한, 가끔은두버전모두에서동작되는버전중립적인코드를간단하게작성할수있다. 부록 C에는 2.X 와 3.X 간이동에관한조언과두파이썬버전에서코드를작성하기위한유용한팁을제공하고있다. 처음에어떤버전을선택하든여러분이원하는작업을하기위한스킬을갖기에는부족함이없을것이다. xxii 서문
X에관하여 : 이책의전반에걸쳐두버전에서출시된모든릴리즈를통칭하는표현으로 3.X 와 2.X 를사용한다. 예를들어 3.X는 3.0부터 3.6까지는물론장차출시될 3.X 릴리즈들을의미하고, 2.X는 2.0부터 2.7( 아마이후릴리즈는없을것으로예상된다 ) 까지의모든릴리즈를의미한다. 특정릴리즈를지칭하는경우는그주제가해당릴리즈에만적용됨을의미한다. 예로, 2.7의집합리터럴과 3.3의런처, 네임스페이스패키지를들수있다. 이러한표기법은지나치게광범위할수도있지만 (2.X로표기되는몇몇기능은현재는거의사용하지않는초기 2.X에는존재하지않았을수도있다 ), 이표기는이미십수년간확장되어온 2.X 버전을포괄할수있다. 3.X 표기법은 2.X에비해짧은기간에출시된릴리즈들을포함하고있어서상대적으로정확하고파악하기가쉽다. 이책을읽기위해필요한것들 이책을읽기위해필요한조건을명확히말하기란불가능한데, 이는책의용도나가치가읽는목적과독자의배경지식에따라달라지기때문이다. 과거에는입문자든, 프로그래밍경험이많은베테랑이든이책을성공적으로잘활용해왔다. 만약여러분이파이썬을배우는게목적이라면파이썬이요구하는시간을기꺼이투자할것이며, 이글이아마도움이될것이다. 파이썬을배우려면시간이얼마나걸릴까? 물론학습하는사람에따라다르겠지만, 이책은처음부터차분히읽고따라할때그효과가가장크다. 일부독자는이책을그때그때필요에따라참고하는데활용할수도있겠지만, 파이썬을통달하려는사람이라면예제를얼마나자세히따라하느냐에따라최소한몇주또는몇개월을이책과함께보내야할것이다. 이전에도언급했듯이, 이책은파이썬언어를가르치는한학기분량에필적하는내용을담고있다. 앞서얘기한내용은파이썬자체를배우고, 이를활용하기위한소프트웨어기술을익히는데필요한시간이다. 물론이책이기본적인스크립트작성을하기에는충분하지만, 대체로소프트웨어개발경력을쌓기를원하는독자라면이책이후에대규모의프로젝트경험과함께 프로그래밍파이썬 2 과같은후속편을학습하는데시간을추가로더투자할것이다. 2 이책내용에서책임지지않는것 : 나는이책과함께앞서언급한다른책을함께저술하였으며, 두권이한벌로이루어지도록구성하였다. 러닝파이썬 이언어의표준을위한책이라면, 프로그래밍파이썬 은언어의응용을위한책이다. 더불어 파이썬포켓레퍼런스 는이두권의책과함께참고할수있도록구성되어있다. 이세권모두 1995년에작성된초판인 프로그래밍파이썬 으로부터출발했다. 부디많은파이썬관련서적을탐색해보기바란다 ( 방금나는아마존에서 200권까지세다가멈췄는데, 그이유는목록이끝도없을뿐아니라장고와같은파이썬관련주제들은포함되지도않았기때문이다 ). 내출판담당자는최근에파이썬에초점을맞춘도서시리즈를출간하고있는데, 기기공학, 데이터마이닝, 앱엔진, 수치분석, 자연어처리, MongoDB( 몽고디비 ), AWS 등특정영역별로파이썬언어의활용법에관하여배우고싶다면이책에서파이썬의기본을익힌후에한번쯤살펴보는것도좋다. 오늘날의파이썬은이미책한권으로익히기에는그범위가굉장히넓어졌다. 서문 xxiii
바로숙련된프로그래밍실력을얻을것이라기대하는이들에게는별로반가운소식은아니겠지만, 프로그래밍이란 ( 이미들어알겠지만 ) 그리간단한기술이아니다. 일반적으로오늘날의파이썬과소프트웨어는도전적이기도하지만, 그노력에상응하는보상또한따른다. 그래서이책의활용법에관해몇가지조언을하겠다. 숙련된프로그래머들에게아마처음몇장은빠른속도로넘어갈수있을것이다. 그러나핵심개념을놓치지말아야하며, 그중몇몇은기억하기위해열심히노력해야할것이다. 개괄적으로이야기하자면, 이책이전에작성된어떤프로그래밍이나스크립팅에대한경험은그유사성때문에이책을학습하는데도움이될것이다. 반면, 이전의프로그래밍경험이오히려불리하게 작용하기도한다 ( 처음작성한파이썬코드만으로도자바 (Java) 와 C++ 프로그래머들을찾아낼수있다!). 파이썬을사용하는것은파이썬의사고방식을채택하는것과같다. 이책은주요핵심개념에집중하여파이썬적인방법으로파이썬코드를작성하는것을배울수있도록구성되어있다. 입문자들에게여러분또한여기서프로그래밍과함께파이썬을배울수있다. 하지만좀더노력이필요할것이고, 경우에따라이책을보완할만한좀더얇고친절한입문서가필요할지도모른다. 여러분이아직스스로프로그래머라고생각하지않는다면아마도이책이유용하다는것을알게되겠지만, 그래도이책의예제와실습을따라차근차근학습할수있는지를확인하고싶을것이다. 이책이프로그래밍의기본보다는파이썬자체를가르치는데주요목적이있음을기억할필요가있다. 만약이책에서길을잃는다면, 이책에불만을갖기전에일반적인프로그래밍입문서를먼저찾아보기를권한다. 파이썬웹사이트는입문자들에게유용한많은자원에관련된링크를제공하고있다. 공식적으로이책은모든유형의입문자를위해처음보는파이썬입문서로기획되었다. 이전에는컴퓨터라곤만져본적도없는이들에게이상적인교재는아니겠지만 ( 여기에서컴퓨터가무엇인지에관한설명은전혀다루지않는다 ), 이책을저술하면서독자들의프로그래밍배경지식이나교육정도에대한어떠한가정도하지않았다. 그렇다하여독자들을아무것도모르는바보로가정하여모욕하지도않을것이다. 파이썬으로많은것들을할수있으며, 어떻게그것이가능한가를이책을통해보여줄것이다. 이책 xxiv 서문
은종종 C, C++, 자바외다른언어와파이썬을비교하기도하지만, 만약여러분이과거에그 런언어들을사용한적이없다면, 이러한비교는무시해도좋다. 이책의구성 독자들의이해를돕기위해이절에서는이책의주요부분의목표와내용에관하여간단하게설명하고자한다. 이책을바로시작하고싶다면이부분은건너뛰거나또는목차만간단히살펴봐도된다. 하지만몇몇독자에게는이렇게방대한분량의책을시작하기에앞서간단한안내를먼저살펴보는것이도움이될것이다. 각각의파트는언어의주요기능영역을다루고있으며, 각파트는특정주제나해당파트영역의기능에관하여다루는장들로구성되어있다. 또한각장은퀴즈와정답으로, 각파트는좀더규모가큰실습문제로마무리하도록구성되어있다. 실습문제에대한해답은부록 D 에서확인할수있다. 연습이중요하다 : 나는독자들이할수있는한이책의모든예제를실습해보고이책에서제공하는퀴즈와실습문제를풀고넘어가기를강력히추천한다. 프로그래밍을배울때읽은것을연습해보는것만큼좋은것은없다. 이책이든여러분만의프로젝트를통해서든, 만약이책에서설명한개념을이해하고자한다면실제코딩을해보는것이가장중요하다. 이책은전반적으로파이썬이그러하듯이, 상향식으로구성되어있다. 진도를나갈수록주제와예제가더어려워질것이다. 예를들어, 파이썬클래스는크게는내장된타입으로처리하는함수들의패키지일뿐이다. 일단, 내장된타입과함수에관해익히고나면클래스는상대적으로이해하기어렵지않다. 각각의파트는이전파트의내용을기반으로설명하므로목차순서대로읽어내려가는것이가장이해가빠를것이다. 책의주요파트에대한개요는다음과같다. 파트 1 파이썬에관한일반적인개요로시작한다. 사람들이이언어를사용하는이유나어디에서유용한지등보통처음갖게되는질문에대한답을제시하게될것이다. 첫장에서는몇몇배경맥락과함께이기술의근간이되는주요개념에관하여소개하며, 나머지장에서는파이썬과프로그래머모두가프로그램을실행하는방법들에관하여설명한다. 이파트의목표는이후에접하게될예제와실습을따라하기에충분한정보를제공하는것이다. 서문 xxv
파트 2 이파트에서는파이썬의주요내장객체타입 ( 숫자, 리스트, 딕셔너리등 ) 과이를활용하여무엇을할수있는지를깊이있게학습한다. 여러분은이도구들만으로도많은일을할수있으며, 이도구들은모든파이썬스크립트의핵심을이룬다. 이파트는이후에다뤄질내용에관한기초를담고있기때문에이책에있어가장중요한부분이다. 또한, 동적타이핑과그에대한참조자료 ( 파이썬을잘사용하기위한핵심 ) 에관하여알아볼것이다. 파트 3 이파트는파이썬에서객체를생성하고처리할때작성하는코드인파이썬문 (statements) 에관하여소개한다. 또한, 파이썬의일반적인문법에관해서도설명한다. 비록이파트에서는문법에집중하지만, 이와관련된도구들 ( 예를들면, PyDoc 시스템 ) 을소개하며, 반복 (iteration) 의개념에관해서도처음으로다루게될것이고, 다양한코딩방법에관해서도알아볼것이다. 파트 4 이파트는파이썬에서고수준의프로그램구조를작성하기위한도구들에관하여살펴보는 것으로시작한다. 함수 (functions) 는코드중복성을피하고코드재사용을위하여패키징하는간단한방법임을알게될것이다. 그리고파이썬의범위 (scope) 규칙과인수전달방식, 때로는악명이높은람다 (lambda) 함수를포함한많은내용을알아본다. 또한, 함수형프로그래밍관점에서반복자 (iterator) 를다시살펴보게되며, 사용자정의제너레이터 (generator) 를소개하고, 성능측정을위하여파이썬코드의실행시간을측정하는방법을배우게될것이다. 파트 5 이파트에서는문과함수를좀더큰컴포넌트 (component) 로구조화할수있도록하는파이썬의모듈 (modules) 을생성하는방법과이것을로딩하고사용하는방법을보여준다. 아울러모듈패키지, 모듈리로딩, 패키지관련호출, 3.3 에서새롭게등장한네임스페이스패키지, name 변수등과같은좀더수준높은주제를살펴본다. 파트 6 여기서는파이썬의객체지향프로그래밍도구인클래스에관하여알아볼것이다. 클래스는반드시사용해야하는것은아니지만, 코드의수정과재사용을위해코드를구조화하는가장강력한방법으로코드의중복성을자연스럽게최소화할수있는유용한도구다. xxvi 서문
앞으로보게되겠지만클래스는대부분여기에서다루는개념을주로재사용하고, 파이썬에서객체지향프로그래밍은주로함수에서특별한첫번째인수와연결된객체에서이름을찾는것과관련이있다. 또한파이썬에서객체지향프로그래밍은선택사항이지만, 파이썬의객체지향프로그래밍은다른언어들보다단순하여획기적으로개발시간을단축할수있음을알게될것이다. 파트 7 이책의언어기본에관하여다루는내용은이파트를끝으로마무리된다. 이파트에서파 이썬의예외처리모델과문 (statement) 에대하여살펴본다. 이에덧붙여, 더큰규모의프로그램을작성하기시작하면더유용해질개발도구 ( 디버깅, 테스팅도구등 ) 에관하여간단히살펴본다. 예외는그내용의비중으로는상당히가벼워앞부분에서다루는것이맞겠으나, 사용자-정의예외가모두클래스여야하기때문에클래스에관한논의후인이파트에서다루도록한다. 더불어컨텍스트관리자 (context manager) 와같은좀더심도있는주제도다룬다. 파트 8 마지막파트에서우리는몇몇고급주제 ( 유니코드, 바이트문자열, 프로퍼티 (property) 나디스크립터 (descriptor) 와같은관리되는속성도구, 함수와클래스데코레이터, 메타클래스 ) 에대하여알아본다. 여기에담긴내용은모든프로그래머가이해해야만할내용은아니므로읽는것은독자의선택사항이다. 반면에국제화텍스트나바이너리데이터를처리해야하거나다른사용자들에게공개할 API를작성해야하는독자들은이파트에관심을갖게될것이다. 이파트의예제들은다른파트의예제와비교하면다소크며, 여러분스스로공부하는데활용할수있을것이다. 파트 9 다양한컴퓨터에파이썬을설치하고활용하기위한플랫폼에따른팁을제공하는네개의부록으로이책을마무리한다. 파이썬 3.3 과함께제공되는윈도우런처를설명하고, 최신판에서다루었던파이썬의변경내역에관하여요약하고, 관련링크를제공하며, 파트마지막에등장하는실습문제의정답을실었다. 각장의마지막에실린퀴즈의정답은각장에실려있다. 부록은다음의사이트에서 PDF 파일로도다운로드할수있다. https://github.com/jpub/learningpython 이책의구성을좀더자세히살펴보려면차례를확인하기바란다. 서문 xxvii
이책의목적이아닌것 십수년에걸쳐청중의규모가커진것을고려하면, 일부사람들은반드시이책에대하여책의범위를벗어나는것들을기대하기마련이다. 그래서이책의성격을이곳에서확실히규정하고자한다. 이책은튜토리얼 ( 사용지침서 ) 이며, 참고서적이아니다. 이책은언어자체를다루며, 응용이나표준라이브러리또는서드파티도구들을다루지않는다. 이책은중요한주제에관하여통찰하는책이며, 수박겉핥기식으로개괄하는책이아니다. 이책의내용에관한주요포인트로각항목에대하여몇마디솔직하게덧붙이고자한다. 이책은구체적인활용방안을다루지않는다 이책은언어의기본을가르치는교재로, 참고도서또는활용서적이아니다. 오늘날의파이썬은내장된타입, 제너레이터 (generator), 클로저 (closure), 컴프리헨션 (comprehension), 유니코드 (Unicode), 데코레이터 (decorator) 그리고절차적프로그래밍, 객체지향프로그래밍, 함수형프로그래밍의혼합등다양한특징을가졌다. 이로써핵심언어는매우중요한주제로, 이핵심언어를배우는것은파이썬으로어느영역에서작업을하든지반드시선행되어야할필수조건이다. 만약여러분이다른자원을활용할준비가되어있다면, 몇가지제안을여기에남기고자한다. 참고자료이책의구조에관하여설명할때언급했지만, 자세한내용을찾으려면목차와색인을활용하면되나이책에참고부록은없다. 만약파이썬의참고자료를찾는다면 ( 아마대부분의독자가파이썬으로경력을쌓으면곧그렇게되겠지만 ), 이전에도언급했던이책과함께활용할수있도록구성된 파이썬포켓레퍼런스 를참고하기바란다. 이외에도원한다면다른파이썬참고도서를쉽게찾아볼수도있으며, 표준파이썬참고매뉴얼은 http://www. python.org에서도운영되고있다. 마지막매뉴얼은무료이지만늘최신내용으로유지되고있고, 웹과윈도우에설치한뒤라면컴퓨터모두에서조회및활용이가능하다. xxviii 서문
애플리케이션과라이브러리이전에논했듯이이책은웹, GUI, 시스템프로그래밍같은특정애플리케이션에대한지침서가아니다. 대신, 이책은애플리케이션에서활용되는라이브러리와도구들에관한 설명을포함하고있다. 비록일부표준라이브러리와도구 (timeit, shelve, pickle, struct, json, pdb, os, urllib, re, xml, random, PyDoc, IDLE 등 ) 는여기에서소개되겠지만, 이것들이이책의공식적인주범위안에들지는않는다. 만약해당주제에관하여더많이다루길원하고이미파이썬에숙련된사람이라면, 이책의후속작인 프로그래밍파이썬 을추천한다. 프로그래밍파이썬 은이책을선행한것으로가정하여내용이구성되어있으므로우선핵심언어에대하여확실하게이해하고있어야한다. 특히, 소프트웨어개발같은엔지니어링영역에서는뛰기전에반드시걸어야한다. 이책은결코얇지않다 이미분량으로도알수있다시피, 이책은상세한부분도건너뛰지않고모두다룬다. 파이썬언어의일부만을간략하게다루는게아니라언어전체를다루고있다. 이책은또한좋은파이썬코드를작성하기위해필수인소프트웨어원칙에관해서도다루고있다. 앞서말했듯이, 이책은파이썬으로한학기강좌를수강했을때얻을수있는기술수준을전수하도록구성되어있다. 이책을읽는많은분은전체소프트웨어개발기술을배울필요가없으며, 일부는파이썬을단편적으로습득할수있다. 하지만이와동시에여러분이마주하게될코드에서언어의어떤부분이라도사용될수있기때문에대부분의프로그래머에게는어떤부분도전적으로선택사항이될수없다. 더군다나심지어비정기적인스크립트개발자나취미로개발하는사람이라도코딩을잘하고, 이미코딩된도구들을적절하게활용하기위해서는기본적인소프트웨어개발원칙을알아야할필요가있다. 이책은언어와개발원칙모두를활용이가능한수준으로설명하는것을목표로한다. 마지막으로, 만약이책을한번에한장씩배워나가면서이들의필수조건을숙달해간다면, 파이썬의좀더높은수준의도구 ( 객체지향또는함수형프로그래밍의지원 ) 를상대적으로쉽게배울수있다. 서문 xxix
이책은파이썬이허락하는한순서대로구성되어있다 읽는순서에대해이야기하자면, 이번개정판에서는이후에나올내용을사전에참조해야하는상황을최소화하기위해심혈을기울였다. 그러나파이썬 3.X 의변경내역으로인해이러한상황이불가피한경우도있다. 실은 3.X 는때에따라파이썬을배우는중임에도이미파이썬을알고있다고가정하는듯보인다. 몇몇대표적인사례를살펴보자. 출력, 정렬, 문자열 format 메서드, 그리고몇몇 dict 호출은함수키워드인수에의존적이다. 많은도구에서사용되고있는딕셔너리키리스트와테스트, 그리고리스트호출은반복 (iteration) 개념에기반을두고있다. 코드를실행하기위한 exec의사용은파일객체와인터페이스에관한지식이있음을가정한다. 새예외처리 (exceptions) 를작성하기위해서는클래스와객체지향프로그래밍에대한기본지식이필요하다. 기본상속 (inheritance) 에서고급주제인메타클래스 (metaclass) 와디스크립터 (descriptor) 에관하여언급한다. 파이썬은여전히단순한개념부터고급수준까지한단계씩진전하면서배우기에최고의언어이며, 이책을순서대로읽어가며학습하는것이이해가가장빠른길이다. 여전히일부주제는이후의장들을참조하거나다른부분을찾아보며이해하는노력이필요할수있다. 이러한수고를최소화하기위해이책은어느부분을참조하면되는지함께기술함으로써이로인한번거로움을가능한한줄여줄것이다. 시간이부족한경우 : 파이썬을마스터하려면깊이가매우중요하지만, 일부독자의경우시간적제약이있을수있다. 만약빠르게파이썬의내용을둘러보고자한다면, 1장, 4장, 10 장, 그리고 28장 ( 아마도 26장도필요할수있다 ) 을보면될것이다. 다만, 바라는것은여러분이이를통해이책의나머지부분에서다루는더완전한내용, 오늘날파이썬소프트웨어세계에서대부분의독자가필요로하는모든것에관심을갖게되기를바란다. 이책은내용의이해를돕기위해의도적으로개념을먼저소개하고이어서상세설명이나오도록구성하였다. 따라서독자들은개요로시작해서시간이지남에따라더깊이있는내용을학습할수있을것이다. 이책을한번에독파할필요는없지만, 차근차근따라가다보면마침내이교재를모두마치게될것이다. xxx 서문
이책의프로그램 대체적으로이책은파이썬의버전이나플랫폼에무관하게실행될수있도록노력하였으며, 모든파이썬사용자에게유용할수있도록구성하였다. 그럼에도불구하고파이썬은시간에따라계속변화하며, 플랫폼은실용적인측면에서달라지는경향이있기때문에이책의대부분의예제가동작이가능한시스템요구사항에관하여기술하고자한다. 파이썬버전 다섯번째개정판에포함된모든프로그램예제는파이썬버전 3.6 과 2.7 기반으로작성되었다. 아울러이예제들중많은부분은이전 3.X 와 2.X 릴리즈에서도실행되며, 이전버전대비변경사항에대하여기술하여예전버전의사용자들도함께활용할수있도록하였다. 이글은핵심언어에대하여집중적으로다루고있기때문에여기에나오는대부분의내용은향후배포될파이썬에서도그다지변경되지않을것이라고확신할수있다. 이책의대부분은초기파이썬버전에도적용되지만, 신규버전이출시되면서새롭게추가된확장기능들은이전버전에서적용되지않는다. 경험상, 최신파이썬을쓰는것이가장좋으므로가능하다면최신버전파이썬으로업그레이드하는것이좋다. 이책은핵심언어에집중하고있으므로이책의대부분의내용은 Stackless나 PyPy와같은파이썬구현, 그리고또한 Jython과 IronPython 같은자바또는.NET 기반의파이썬언어구현에적용된다 (2장의내용을참조할것 ). 이러한여러구현들은활용시세부내용에서차이가날뿐언어자체의본질적인내용에는변함이없다. 플랫폼 파이썬의이식성과이책이주로핵심언어자체를다룬다는점을고려한다면플랫폼에대한안내는오히려혼동을일으킬수도있지만, 이책의예제들은윈도우 10이설치된울트라북에서실행되었다. 독자들은아마도명령라인프롬프트, 스크린샷, 설치환경및 3.3 에서의윈도우용런처에관한부록내용을통해윈도우환경임을알아챌것이다. 하지만이는대부분의파이썬입문자들이아마도윈도우환경에서시작할가능성이높기때문이며, 다른운영체제를사용하는사용자들은가볍게무시할수있을만한것이다. 서문 xxxi
이책은또한 #! 와같은라인을사용하여리눅스를포함한다른플랫폼에서실행하는방법에 관해서도제공하지만, 3 장과부록 B 에서볼수있듯이 3.3 버전에포함된윈도우런처는이부 분에관한이식성을높이는결과를가져왔다. 이책의코드가져오기 이책의예제에해당하는소스코드및실습문제에대한해답은이책의웹사이트에서 zip 파일로가져올수있다. 웹사이트주소는다음과같다. 러닝파이썬 GitHub 페이지 : https://github.com/jpub/learningpython 이사이트에는이책의모든코드와함께패키지사용설명을포함하고있다. 이에관한자세한내용은차후에다루겠다. 물론, 이책의예제들은책에서보여주는형태에서가장잘동작하며, 이예제들을활용하기위해일반적으로파이썬프로그램을실행하기위한추가적인배경지식이필요할수도있다. 파이썬프로그램을구동하는방법에관해서는 3장에서상세히다룬다. 이책의코드사용하기 이책에실린코드는교육용으로작성된것이므로독자들에게도움이된다면기쁠것이다. 오라일리출판사는일반적으로책에기재된예제의재사용과관련한공식적인정책을가지고있으므로그에대한안내로본내용을대신한다. 이책은여러분의일을돕기위해존재한다. 일반적으로, 이책에포함된코드를여러분의프로그램이나문서에서사용할수있다. 코드의주요부분을재작성하지않는한사용과관련하여출판사에허락을구하지않아도된다. 예를들어, 이책에나오는몇몇코드를이용하여프로그램을작성하는것은별도의허가가필요없다. 또한, 이책이나예제코드를인용하는것도별도의승인이필요없다. 그러나이책에실린예제코드의상당량을결합하여여러분이작성한문서에포함시킨다면, 출판사의허가를받아야한다. 인용시출처를밝혀준다면고맙겠으나, 반드시밝힐필요는없다. 인용출처는일반적으로제목, 저자, 출판사, 그리고 ISBN을포함한다. 표기법에대한예를들자면 러닝파이썬 ( 제5판 ) 마크러츠지음, 제이펍 978-11-88621-07-1 과같다. xxxii 서문
만약예제코드사용방식이정당한사용처의범위를벗어났거나상기와같이출판사의 허가가필요한경우에는 permissions@oreilly.com 혹은 readers.jpub@gmail.com 으로연락 하기바란다. 이책의표기방식 이책의기술방식은일단읽다보면이해가되겠지만, 참고삼아이책에서는다음과같은서 체규약을따름을밝혀둔다. 고딕체 ( abc) 파일명, 경로명, 그리고새로운용어를강조하기위해사용한다. 고정폭서체 ( abc) 프로그램코드문등을표기할때사용한다. 고정폭볼드체 ( abc) 코드가등장하는부분에서명령어를나타내거나, 사용자가입력한텍스트, 그리고경우에따라코드중특정부분을강조할때사용한다. 고정폭이탤릭체 ( abc) 코드문상의대체가능한부분을표시하기위해사용한다. 이아이콘은팁이나제안을표시한다. 이아이콘은경고나주의사항을표시한다. 또한, 종종상자형태로구획이나뉘어진칼럼또는각주를볼수있다. 이부분은선택적으로확인해도되지만, 본문에설명한내용에대한부연설명을제공하고있으므로읽어보면도움이될것이다. 예를들어, 259쪽 더생각해볼주제 : 슬라이스 칼럼에서는탐색하고있는주제들에대한활용예시를제공한다. 서문 xxxiii
이책의최신정보와자료들 읽다보면개선이필요한부분이있을것이다 ( 또한, 오타역시있을것이다 ). 최신내용으로업데이트가필요하거나보완또는정정되어야하는부분에대해서는웹에지속적으로게시, 운영할것이다. 관련하여제보할내용이있다면다음의출판사웹사이트나이메일로연락이가능하다. 주요조정내역은다음과같다. 출판사웹페이지 : http://oreil.ly/learningpython-5e 이사이트는본개정판에대한공식적인오탈자목록을관리하며, 재판을찍을때마다수정된내역에대한이력을관리하고있다. 또한, 이전에설명했듯이이책의예제와관련한공식사이트다. 나의웹사이트 : http://learning-python.com/about-lp5e.html 이사이트는파이썬의향후변경내역에대응하여이책과파이썬자체에관한최신내역의업데이트를주로게재한다. 해당사이트를이책의특별부록으로여기고활용하면될것이다. 출판사는이책에대한기술적질문과견해를받을수있도록다음의이메일주소를운영하고있다. readers.jpub@gmail.com 출판사에서운영하는도서, 학회, 지원센터, 오라일리네트워크에대하여더많은정보를얻고싶다면다음의일반웹사이트에서확인할수있다. https://www.oreilly.com 내가저술한다른책에도관심이있을경우, 직접운영하는다음사이트를방문하면확인할수있다. http://learnin-python.com/index-book-links.html 또한, 시간이지나앞서기술한사이트링크들이유효하지않다면웹에서검색해보기바란다. 천리안과도같은능력이있으면좋겠지만, 웹은출간된책보다더빨리변화하기때문에제때따라잡기에는아무래도한계가있다. xxxiv 서문
감사의말 2013년에이책의다섯번째개정판을쓰면서지난날에대한회상에빠지지않기란어려운일이었다. 30여년간파이썬을사용하고전파하면서그중반이상을파이썬저술활동과교육프로그램을운영하는데힘써왔다. 오랜시간이지났음에도불구하고여전히파이썬이얼마나성공했는지를볼때마다놀라곤한다. 이는 1990년초반에는상상조차할수없었던일이었다. 자기자신에게만몰두하는저자 라는오명을쓸것을무릅쓰고여기에몇가지이야기와감사의말을남기며글을맺고자한다. 배경이야기 나와파이썬과의인연은웹이나파이썬 1.0 보다먼저시작되었다. 돌이켜보건대, 프로그램설치란이메일로파일을받아서합치고디코딩하여잘동작하기를바라는게전부였던시절이었다. 1992년 C++ 개발자로좌절감을느끼고있을때처음파이썬을접했는데, 그때만해도이것이내인생의나머지날들에얼마나영향을미칠것인지는전혀예상하지못했다. 1995 년파이썬 1.3 을기반으로 프로그래밍파이썬 을처음출판한지 2년뒤, 세계여러곳을여행하며입문자나전문가들을대상으로파이썬을가르치기시작했다. 이어서파이썬의인기에힘입어 1999년에 러닝파이썬 의첫출판을시작으로나는파이썬트레이너이자저술가로활동하게되었다. 지금까지 14권의파이썬책을저술하였으며, 모두합하여수십만부의판매를기록했다. 또한, 오랜기간파이썬을가르치면서미국, 유럽, 캐나다, 멕시코등지에서수백회의교육과정에강사로참여하였고, 그러면서대략수천여명의학생들을만났다. 이과정들을통해서내책들을개선해나갈수있었다. 교육활동을통해서책의내용을다듬고, 반대로저술활동을통해교육내용이다듬어졌다. 덕분에책에서나타나는효과는내강의중에도일어났으며, 서로에게훌륭한대안이될수있었다. 파이썬에대해서도얘기하자면, 최근몇년간세계에서가장널리사용되는프로그래밍언어상위 5~10위안에들게되었다. ( 인용하는시점에어디를참조하느냐에따라그순위가달라질것이다.) 우리는이책의 1장에서파이썬의현재상황에대하여알아볼것이므로나머지이야기는거기에서다시하고자한다. 서문 xxxv
파이썬에대한감사 가르치는활동은가르치는사람에게가르치는것을가르치기때문에이책은내강좌의덕을많이보았다. 그동안내강의에참석한모든학생에게감사하고싶다. 파이썬의변화를따라가다보면여러분의피드백이이글을다듬는데중요한역할을해왔다. 수천여명의사람들이똑같은초보적실수를하는것을직접보는것만큼유익한것은없다! 이책의최근개정판은그들을가르친경험을토대로수정및보완하였다. 비록 1997년이후매번있어온교육과정이지만, 그과정하나하나가이글을다듬고보완하는데도움이되었다. 더블린, 멕시코시티, 바르셀로나, 런던, 에드몬튼, 푸에르토리코에서열린과정을개최한주최측에게감사의말을전한다. 이런경험들이내경력에서가장오래남는보상중하나다. 저술활동은저술가가쓰는법을가르치기때문에이책은독자들에게많은빚을지고있다. 지난 20여년간온라인뿐아니라개인적으로도많은제안을해준셀수없이많은독자여러분에게감사하고싶다. 여러분의의견이책의발전에크게기여했으며, 이책의성공에가장중요한열쇠가되었다. 이는오픈소스이기에가능한이점이기도하다. 독자들의견해는 당신은책을쓰지말아야한다. 라는의견부터 당신이책을썼다니, 행운이깃들기바란다. 까지아주다양했다. 만약독자들이의견일치를보는게가능하다면, 그것은아마저둘사이어딘가일것이다. 또한, 이책의출판에참여한모든이에게감사의말을전하고싶다. 수년에걸쳐이책을알차게만드는데도움을준모든이들 ( 편집장, 디자이너, 마케팅담당자, 기술검토위원등 ) 에게, 그리고내게 14권의책을저술할수있는기회를제공한오라일리에감사의말을전하고싶다. 정말즐거운경험이었다 ( 그리고조금은영화 사랑의블랙홀 (Groundhog Day) 같은느낌이들긴했지만말이다 ). 마지막으로, 파이썬커뮤니티의모두에게감사하고싶다. 대부분의오픈소스시스템처럼파이썬은그공로를인정받지못한무수한노력의산물이다. 파이썬이스크립트언어계의신참에서거의대부분의소프트웨어개발조직에서어떤형태로든사용되고있는도구로성장하는것을지켜볼수있었던것은더할나위없는영광이다. 기술적으로의견이다른것은차치하고, 이러한역사의한부분에참여할수있었다는것은매우기쁜일이다. 내책의최초편집장인 ( 지금은고인이된 ) 오라일리의프랭크윌리슨에게감사의말을드리고싶다. 이책의많은부분이그의아이디어였다. 그는나의경력과파이썬의성공에지대한영향을끼쳤다. 내가 오직 (only) 이라는단어를오용하고자할때마다그가남긴유산을기억한다. xxxvi 서문
개인적인감사의말 마지막으로, 개인적인감사의말을전하고자한다. 이제고인이된칼세이건, 위스콘신에서자란 18살소년에게많은영감을주었다. 나의어머니, 늘곁에서격려를아끼지않으셨다. 내형제자매들에게, 피너츠박물관에서우리는많은진실을찾을수있었다. 책, 생각하지않는사람들 (The Shallows) 에게, 더많은모닝콜이필요했음에감사한다. 내아들마이클과딸사만다와록산느에게, 너희의존재만으로도감사하단다. 너희들이언제이만큼자랐는지확실하지않지만, 너희가정말자랑스러울수있도록이생이너희를어디로인도할지지켜보기를고대한다. 그리고내아내베라에게, 당신의인내와교정, 그리고다이어트콜라와프레첼에감사하고, 마침내당신을만난것에행복하오. 이후내가무엇을할지는모르겠지만, 그시간을당신과항상함께할것을바란다는것은알고있기를바라오. 마크러츠 Mark Lutz 서문 xxxvii
베타리더후기 제이펍은책에대한애정과기술에대한열정이뜨거운베타리더들로하여금출간되는모든서적에사전검증을시행하고있습니다. 구민정 (SK주식회사) 러닝파이썬원고를처음받았을때 아, 드디어기대하던파이썬책이나왔구나 라는생각이들었습니다. 아울러엄청난페이지수와쉽고자세한설명에놀랐습니다. 파이썬개발자라면꼭한번정독하시기를바라고, 곁에두고서수시로학습하셨으면합니다. 입문자부터고급개발자까지파이썬을제대로알수있는기회가될것입니다. 설명이상당히친절한데, 그설명을반복하는부분이많아학습에더욱도움이될것같습니다. 그리고시중에나와있는책들은 파이썬이쉬운언어다 라는것을너무강조하여분량도적고얕은지식만을알려주는느낌이어서무척아쉬웠는데, 이 러닝파이썬 은정말파이썬을제대로알고싶은사람들을만족시킬만한도서라고생각합니다. 출간이너무기다려지네요. 김용현 ( 마이크로소프트 MVP) 문법책만으로영어를공부하는것보다는자습서를함께보는것이이해가빠른것처럼, 프로그래밍언어또한마찬가지입니다. 이책은객체지향프로그래밍의법칙등어려운말을사용하지않으면서도핵심을이해하기쉽게설명하여, 초급자에게는시행착오를줄임과동시에언어의전체를볼수있게해주고, 중급자에게는지식의빈공간을메꿀기회를주는책입니다. 언어의개괄을보여주고실무에서맞닥뜨리게되는부분을반복해서학습하다보면결국유창한파이썬을구사하게될것입니다. 파이썬의텍스트로취급받는모출판사책의아성에도전할수있는책인것같습니다. 많은분량의내용을번역하고만드시느라수고많으셨습니다. 이제독자의한사람으로서설레는마음으로출간을기다리겠습니다. xxxviii 서문
김인근 ( 서울대학교 ) 파이썬초보자에서중급자로단숨에끌어올릴책입니다. 파이썬이동작하는원리를기초부터높은수준까지총망라하여자세히, 그리고반복적으로설명합니다. 분량이제법많지만한번정독하여읽으면그만큼확실한실력을얻게될것입니다. 본인의실력이정체되었다고느끼는파이썬개발자들이있다면한줄기빛이될그런책입니다! 김정헌 (BTC) 이 러닝파이썬 은무척두꺼운책입니다. 설명이자세하다는장점도있지만, 그만큼배워야할내용이많습니다. 그러나제대로배우고자한다면, 꼭읽어보기를권합니다. 다른책에서보기힘든자세한설명덕에중급자에게도도움이될것같네요. 코딩을전혀모르는사람이읽기에는부담스럽겠지만, 다른언어를알고있는사람이나파이썬을조금아는사람이파이썬을정말제대로배우고싶다면꼭읽어야할책이라고생각합니다. 김종욱 (KAIST) 이책은파이썬을배우는데필요한거의모든기초지식들을다루고있습니다. 또한, 초보자부터중급자에이르기까지옆에두고필요한부분이있으면수시로참고하면서학습하기좋게구성되었습니다. 다만책의두께가상당한만큼학습하다지치지않도록처음부터모든내용을숙지하려는것은피하는게좋습니다. 박성환 ( 한국외국어대학교 ) 파이썬을더욱깊게느껴보고싶은모든파이썬사용자들에게이책은단순파이썬서적이아니라, 파이썬개발경험수십년이넘는저자의고급파이썬개발노하우와소프트웨어개발철학의집대성이라고할수있습니다. 비전공자로프로그래밍을공부하는입장에서파이썬내용은물론, 지은이의내공이느껴지는노하우나개발철학에대한조언이정말인상깊었습니다. 제가베타리딩한부분에서의중복제거에대한집착이나, 결합도, 응집도등등소프트웨어공학적인내용들은달달외워야할정도로중요한내용인데, 이를어떻게책에다녹여낼생각을했는지대단합니다. 그러나파이썬은진입장벽이낮아서프로그래밍경험이전무한비전공자들도많기사용하는데, 그들에게는다소어려울거라생각됩니다. 책의내용이고급인것은물론, 저자의수준이워낙높아한문장, 문장에깊이가있기때문입니다. 안그래도두꺼운책인데소프트웨어공학에대한지식이전혀책에서다루는용어하나조차스트레스일것입니다. 그러므로저는다른분들이이책을구입할때 서문 xxxix
장기간의스터디용으로여겼으면합니다. 입문을넘어파이썬을완벽히마스터하고싶은사람들에게는꼭추천하고싶은책입니다. 저또한어느새단순한베타리딩을넘어열심히공부하며읽고있는스스로를발견하였습니다. 파이썬을사랑하는사람으로서이책의베타리딩에참여할수있어서영광이었습니다. 박정춘 (NextMatch) 최근배워야할언어를추천해달라는말을들으면단연코쉽고생산성이뛰어난파이썬을꼽습니다. 파이썬은범용프로그래밍언어의장점과풍부한라이브러리, 성숙한커뮤니티를통해발전함과동시에다양한분야에걸쳐사용되고있습니다. 이책은파이썬의기본부터핵심적인요소를자세하게다루고있습니다. 특히, 기초적인내용부터고급주제까지골고루다루고있어레퍼런스용도로사용하기에도충분합니다. 내용이나문장에난이도가있는데번역자께서시간을많이투자하신것같습니다. 반드시읽어보기를권합니다! 박조은이책은입문서지만파이썬에대한기초적인이해가있는사람들이읽으면더좋을책입니다. 많은분량만큼구체적인내용을다루고있으므로다른파이썬책에서보지못했던내용을이책을통해학습할수있었습니다. 하지만관련지식이나경험이없다면이책의분량과깊이가어렵게느껴질것입니다. 그러나그만큼파이썬을좀더깊고자세하게이해할수있는좋은안내자가될것입니다. 사전처럼많은내용을다루고있기때문에기본문법을학습하다가지칠수도있으므로처음시작하는분들은파이썬을통해무엇을하고싶은지목표를확실히하고읽는것이좋겠습니다. 이미경험을해본분들이라면기존에알고있던내용을정리하고깊이있는학습을하는데도움이될것입니다. 이해를도와주는적절한예제코드가잘정리되어있으며, 파이썬사용자라면책상에꽂아두고필요할때마다찾아서읽어보기딱좋은책입니다. 석대진 ( 코아시스템 ) 이책은제가파이썬을알기전부터꾸준히출판되어온책으로 41개의장을통해파이썬의미래혹은파이썬에대한저자의열정을느낄수가있습니다. 그리고저자의열정만큼설명이자세하고반복적으로이루어진탓에책자체가다소지루하게느껴지는경향이있습니다. 하지만파이썬 2를다루거나, 혹은 2와 3을동시에다루어야하는사람이이책을읽는다면저자의자세하고꼼꼼함에감사하지않을수없을것입니다. xl 베타리더후기
송재욱 ( 카카오 ) 파이썬은매우인기있는언어입니다. 풍부한라이브러리를제공할뿐만아니라국내커뮤니티도활성화되었으며, 실제로많은현업개발자들사이에서도손꼽히는언어중하나입니다. 그렇기에꼭한번공부해볼가치가있습니다. 방대한분량만큼파이썬의상세한이해를돕는설명과예제를모조리포함하고있습니다. 그러나그만큼인내심을갖고읽어야할책이기도합니다. 느긋하게마음을가지고하나씩차근히학습해나갈것을추천합니다. 염성욱 ( 삼성SDS) 최근들이딥러닝이인기를끌면서필요한경우가많아파이썬도덩달아인기가높아졌습니다. 파이썬은 2 버전과 3 버전이호환이되지않는데, 이책은 2와 3을비교해가면서설명하고있습니다. 많은페이지를통해파이썬을설명하는만큼, 기초적인부분부터고급기술까지두루두루설명하여마치바이블처럼느껴집니다. 이승현 ( 스타코프 ) 파이썬은다른언어들보다시작하기쉬우면서도간결하고강력하여요즘에는적절한타이밍과빠른아이디어실현이목적인스타트업에서매우각광받고있습니다. 이책은분량때문에방대하고조금복잡한언어가아닌가싶을만큼, 파이썬의이모저모를세밀하게조명하고있습니다. 책내용전반에대한저자의오랜경력이깊게배어있습니다. 이제갓파이썬에입문했다면이분량에압도되겠지만, 조언을건네자면경험많은파이썬개발자들도고급기능모두를적극적으로사용하지않는다는것입니다. 이책을읽고난후여러분에게는이언어가가지고있는세개의패러다임 ( 절차지향, 객체지향, 함수지향 ) 에서선별 & 조합하여코딩하는방법을습득하기위해부단히노력해야한다는숙제가남았습니다. 파이썬은일단시작하기만한다면독자가생각한것을그대로코딩할수있는즐거운경험을선사할것이라고확신합니다. 마지막으로이거대한책을매끄럽게번역해주신역자분들께감탄과존경의마음을표합니다. 이재빈 ( 안랩 ) 각종언어의전문서적들을다양하게봐왔지만, 이책이야말로파이썬의기본서적이라고말할수있을정도로기본내용부터응용개념까지충실한바이블입니다. 파이썬에관심을가진분들이라면여러책을사기보다이책한권을책장에꽂아두고필요할때마다지속적으로꺼내보는것이가장좋을것같습니다. 베타리더후기 xli
이지현 파이썬을사용하면서궁금했던내용들을자세히설명한책입니다. 드디어모든궁금증이 풀려속이시원하네요! 정현준 ( 카카오 ) 파이썬을알고사용한다고생각해도막상접하다보면새롭거나잘못알고있는부분이생기는데, 이책을베타리딩하면서이런부분도같이알수있어개인적으로도만족스러웠습니다. 이책이모쪼록파이썬을공부하는많은사람들에게도움이되면좋겠습니다. 제이펍책항상잘읽고있습니다. 앞으로도좋은책많이출간해주세요! 조현호 ( 칩스앤미디어 ) 파이썬학습서로유명한책인것은익히알고있었지만, 이번베타리딩을통해처음직접접했는데파이썬에대해서대략적으로만알고있었던내용들에대해서보다자세히알수있는좋은기회가되었습니다. 보통다른프로그래밍언어를사용하다가파이썬을접하게되는경우최소한의문법만을알고사용하시는분들이많은데, 그런분들께보다자세히파이썬을배울수있도록많은도움을줄책인것같습니다. 한상곤 ( 마이크로소프트 MVP) 이책은파이썬을배우는데필요한거의모든지식이담겨있습니다. 고급주제들을선별해서소개하고설명을담은만큼, 알고보면생각보다많은시간과노력이요구되는파이썬의좋은길잡이가되어줄것입니다. 한홍근 ( 서울옥션블루 ) 이책은방대한분량만큼매우세세한설명을담고있습니다. 파이썬입문자는자칫분량에질릴수있으므로각오를단단히하고이책을손에들기바랍니다. 하지만파이썬또는프로그래밍경험이있는분들이라면깊이있게공부하는데참고할만한든든한교재역할을충분히해낼것입니다. 책의내용은물론이고, 번역품질도좋아서읽는데편했습니다. xlii 베타리더후기
1PART 시작하기
CHAPTER 1 파이썬 Q&A 세션 3 CHAPTER 2 파이썬이프로그램을실행하는방법 33 CHAPTER 3 프로그램을직접실행하자 53
CHAPTER 1 Q&A / 3
소프트웨어품질다른스크립트언어와는달리파이썬은일반적으로가독성, 정합성 1, 소프트웨어품질에집중하고있다. 파이썬코드는읽기쉽게설계되어전통적인스크립트언어보다재사용및유지보수가훨씬쉽다. 파이썬코드의일관성은코드의이해가쉽도록하며, 타인의코드에대한이해역시쉽도록만들어준다. 추가로파이썬은객체지향과함수형프로그래밍과같은좀더향상된재사용매커니즘에대해서도심층적으로지원한다. 개발자생산성파이썬은 C, C++ 그리고자바와같은컴파일언어나정적타입언어보다개발자의생산성을몇배더증가시킨다. 파이썬코드는일반적으로같은기능의 C++ 또는자바코드의 1/3 에서 1/5 정도의크기밖에되지않는다. 즉이것은타이핑수와버그, 유지보수비용의감소를의미한다. 또한파이썬프로그램은다른언어에서는필수적인긴컴파일및링크단계없이바로실행되므로결국개발자의개발속도를향상시킨다. 프로그램이식성대부분의파이썬프로그램은주요컴퓨터플랫폼에서코드의변경없이바로실행된다. 예를들어, 리눅스와윈도우사이에서파이썬코드를이식하기위해서는보통두장비간에코드를복사하기만하면된다. 게다가파이썬은그래픽사용자인터페이스 (GUI), 데이터베이스접근프로그램, 웹기반시스템등에대한이식성을고려한코드를작성하기위한다양한옵션을제공한다. 심지어프로그램의실행과디렉터리에대한접근을포함한운영체제인터페이스조차도파이썬에서는이식성을고려한코드를작성할수있다. 라이브러리지원파이썬은다양한기능을미리이식성을고려한상태로빌드하여표준라이브러리라는이름으로함께제공한다. 이라이브러리는텍스트패턴비교에서부터네트워크스크립트까지애플리케이션수준프로그래밍에서필요한다양한기능을제공한다. 게다가파이썬은사용자가직접작성한라이브러리들과다양한서드파티애플리케이션지원소프트웨어들을사용한확장이가능하다. 파이썬의서드파티영역에서는웹사이트구축, 수치제어프로그래밍, 시리얼포트접근, 게임개발및기타다양한분야를위한다양한도구를제공한다. 예를들어 NumPy 확장기능의경우는무료이며, Matlab( 매트랩 ) 수치제어시스템과맞먹는강력함을제공한다고설명되어있다. 1 옮긴이논리의일관성 4 CHAPTER 1 파이썬 Q&A 세션
컴포넌트통합파이썬스크립트는다양한통합매커니즘을사용하여애플리케이션의다른부분과쉽게통신할수있다. 이러한통합매커니즘을이용하면파이썬을제품커스터마이징과확장도구로사용할수있다. 오늘날파이썬은 C/C++ 라이브러리의호출, C/C++ 프로그램에서파이썬의호출, 자바또는.NET( 닷넷 ) 컴포넌트와통합, COM 또는실버라이트 (Silverlight) 같은프레임워크와통신, 시리얼포트를통한장치와연결, 그리고 SOAP, XML-RPC, CORBA 같은인터페이스를사용하여네트워크와통신할수있다. 이러한다양한도구는독립적으로실행되지는않는다. 즐거움파이썬의쉬운사용법과함께제공되는다양한도구는프로그래밍작업을단순한일이상의즐거움으로만든다. 비록이러한것들은눈에보이지않지만, 생산성에영향을미치는파이썬의중요한자산이다. 이러한요소들중처음두개에해당하는품질과생산성이아마대부분의파이썬사용자에게가장매력적인혜택과장점이아닐까한다. 소프트웨어의품질 파이썬은의도적으로단순하고읽기쉬운구문과매우일관된프로그래밍모델을구현하고있다. 오래전의파이썬콘퍼런스에서선언한슬로건처럼파이썬은결과적으로사용자의두뇌에맞는언어 ( fit your brain ) 인것같다. 즉, 언어의기능들은일관되고제한된방식으로상호작용하고자연스럽게몇몇핵심개념들을따른다. 이러한방식은언어를쉽게배우고이해하고기억하게한다. 실제로파이썬프로그래머는코드를작성하거나읽을때매뉴얼을계속해서참조하지않아도된다. 이방식은놀라울정도로균일한코드의산출물을만들어내는일관성있게설계된시스템덕분에가능한일이다. 철학적으로, 파이썬은다소최소주의적 (minimalist) 인접근방식을채택한다. 즉, 일반적으로코딩작업을수행하는데는다양한방법들이존재할수있다. 보통명확한한가지방법과다소덜명확한여러가지대안들이있으며, 언어전반적으로일관된상호작용들이있다. 또한, 파이썬은여러분을위해어떤임의의결정을하지않는다. 파이썬은상호작용이모호한경우, 마술 (magic) 보다는오히려명시적인개입을더선호한다. 파이썬적인사고관점에서는암 왜파이썬을사용하는가? 5
묵적인것보다명시적인것을, 복잡한것보다단순한것을선호한다. 2 이러한설계주제를넘어, 파이썬은자연스럽게코드의재사용성을유도하는모듈과객체지향프로그래밍 (Object-Oriented Programming, OOP) 을지원하는도구들을포함하고있다. 그리고파이썬이코드의품질에초점을맞추고있기때문에파이썬프로그래머들도자연스럽게코드의품질에초점을맞추게된다. 개발자의생산성 인터넷사용이왕성했던 1990년대중후반에는소프트웨어프로젝트를진행할만큼충분한프로그래머수를확보하기가쉽지않았다. 이시기의개발자들은진화하는인터넷에따라시스템을가능한빨리구현하도록요구받았다. 그리고정리해고와경기침체의시대를지나면서상황이더욱악화되어이제프로그래머들은심지어더적은인원으로같은작업을해줄것을요구받기시작했다. 이러한상황에서파이썬은프로그래머가더적은노력으로더많은일을할수있는도구로서주목받았다. 파이썬은의도적으로개발속도에최적화되었는데, 파이썬의단순한구문, 동적타이핑, 컴파일단계의생략과내장된도구들을이용하면몇몇다른도구를사용할때필요한시간보다상대적으로짧은시간안에프로그램을개발할수있다. 파이썬은일반적으로기존언어에서지원하는수준을뛰어넘는개발자의생산성향상을동반한다. 이러한장점은경기의호황과불황에상관없이소프트웨어산업이있는곳이라면어디서나반가울이야기다. 파이썬은 스크립트언어 인가? 파이썬은스크립트작성목적으로자주사용되는일반적인목적의프로그래밍언어이며, 주로객체지향스크립트언어로서정의된다. 이정의는스크립트작성도구로서의역할에대한전반적인방향과객체지향프로그래밍에대한지원을함께포함하고있다. 파이썬에대한정 2 파이썬의철학에대한좀더자세한내용은파이썬대화형프롬프트에 import this 명령을입력해보자 ( 뒤에나올 3 장에서확인 할수있다 ). 이명령은파이썬에숨겨진 이스터에그 (Easter egg) 를호출한다. 호출해보면파이썬언어와사용자커뮤니티에스 며든파이썬의설계원칙을보여준다. 이원칙들중약어 EIBTI 는 명시적인것이암시적인것보다낫다 (Explicit Is Better Than Implicit) 는원칙을의미한다. 이러한원칙이종교적인것은아니지만파이썬의모토나신념에가까우며, 이책에서종종인용될것이다. 6 CHAPTER 1 파이썬 Q&A 세션
의를한줄로표현하자면, 파이썬은절차적, 함수적그리고객체지향패러다임을섞어놓은일반적인목적의프로그래밍언어로더잘알려져있다고말할수있다. 이말은오늘날파이썬의풍요로움과범위 ( 한계 ) 를잘표현하고있다. 파이썬에여전히 스크립트 라는용어가늘따라다니는것은아마도프로그래밍에많은노력이필요한다른언어와비교되기때문일것이다. 예를들어, 사람들은종종파이썬코드파일을말할때 프로그램 대신 스크립트 라는단어를사용한다. 이러한관습을따라이책에서는 스크립트 와 프로그램 을적절히섞어서사용하지만, 단순한단일파일을언급할때는 스크립트 의사용을선호하며, 다수의파일로구성된복잡한애플리케이션을말할때는 프로그램 의사용을선호한다. 스크립트언어 라는용어는바라보는사람에따라매우다른의미를가진다. 따라서일부사람들이이용어의사용을선호하긴하나, 파이썬과는어울리지않는다. 실제로, 사람들은파이썬에대해말할때다음과같은세가지부류로나눠서이야기하는경향이있으며, 다음부류는듣는사람에따라그중요도가다를수있다. 셸 (Shell) 도구종종사람들이스크립트언어로설명된파이썬에대해듣게될경우, 그들은파이썬이운영체제기반의스크립트를작성하기위한도구를의미한다고생각한다. 이러한스크립트들은콘솔명령라인에서자주실행되며, 텍스트파일처리와다른프로그램을실행하는작업들을수행한다. 파이썬프로그램들이이러한역할을수행할수는있지만, 이러한역할은수많은파이썬애플리케이션영역중단지하나일뿐이며, 파이썬이단순히더나은셸 (Shell) 스크립트언어는아니다. 제어언어스크립트는또다른사람들에게다른애플리케이션을제어하고명령하기위해사용되는연결계층을의미한다. 실제로파이썬프로그램은종종대규모애플리케이션의일부로배포된다. 예를들어, 몇몇대규모프로그램에서하드웨어장치를검사하기위한목적으로파이썬이저수준접근을제공하는컴포넌트를호출하는데사용될수있다. 마찬가지로, 몇몇대규모프로그램에서전체시스템의소스코드에대한재컴파일없이최종사용자제품에대한커스터마이징을지원하기위해전략적으로일부요소에대해서파이썬코드를실행할수있을것이다. 파이썬은 스크립트언어 인가? 7
이단순함이자연스럽게파이썬을유연한제어도구로만들지만, 엄밀히말하면이것또한일반적인역할일뿐이다. 대부분의파이썬프로그래머의코드는어떤통합컴포넌트를사용하거나그와관련된지식이없어도독립적으로실행되는스크립트다. 파이썬은단순한제어언어가아니다. 쉬운사용 스크립트언어 라는용어는빠른코딩작업을위해사용되는간단한언어를의미한다고생각하는것이가장좋을것이다. 이용어는 C++ 같은컴파일언어보다는훨씬빠른프로그램개발이가능한파이썬에적용될때특히잘어울린다. 파이썬의빠른개발주기는경험을통해평가되어야하는탐색적이고점진적인개발방법을촉진한다. 그러나파이썬은단순한작업만을위한언어는아니다. 오히려쉬운사용법과유연함으로인해작업을단순하게만든다. 파이썬은쉬운기능들을제공하지만, 필요에따라프로그램을정교하게확장할수있다. 그렇기때문에일반적으로빠른개발이필요한작업과장기전략이필요한개발모두에사용된다. 그래서 파이썬은스크립트언어인가, 아닌가? 에이에대한대답은누구에게묻느냐에따라다르다. 일반적으로, 스크립트 라는용어는특정애플리케이션영역보다는파이썬이제공하는빠르고유연한개발모드를설명하는데사용되는것이좋다 그렇다면단점은무엇인가? 파이썬을 30여년간사용하면서그중반이상을파이썬코드작성과교육에임해왔지만, 그동안내가발견한파이썬의유일한단점은 C 또는 C++ 같은완전한컴파일및저수준언어만큼항상빠르게실행되지는않는다는것이었다. 그러나오늘날그리흔한일은아니지만, 일부작업중여전히내부하드웨어구조에좀더직접적으로연결할수있는저수준언어의사용이필요한경우가있다. 파이썬의설계개념에관해서는이책의후반부에서자세히다룰예정이다. 간단히언급하면, 오늘날파이썬의표준구현은소스코드문장을바이트코드 (byte code) 로알려진중간형태로컴파일 ( 즉, 변환 ) 하며, 그러고나서바이트코드를해석한다. 이바이트코드는플랫폼에독립적인형식으로서파이썬의이식성을제공한다. 그러나파이썬은일반적으로이진 (binary) 기계코드 ( 인텔칩을위한명령 ) 로까지컴파일되지는않는다. 그러므로일부프로그램은파이썬에서 C 8 CHAPTER 1 파이썬 Q&A 세션
처럼완전히컴파일되는언어보다파이썬에서더욱느리게실행될것이다. 다음장에서다루는 PyPy 시스템은프로그램이실행될때컴파일하는방식으로, 일부코드에대해열배또는 100 배의속도향상을달성하기도하지만, 이는표준이아닌별도의또다른파이썬구현이다. 실행속도의차이에대한관심은여러분이작성하는프로그램의종류에따라달라질수있다. 파이썬은오랫동안최적화되었으며, 파이썬코드자체는대부분의애플리케이션영역에서충분히빠르게실행된다. 게다가여러분의파이썬스크립트에서파일처리또는그래픽사용자인터페이스를구성하는것과같은 실제 작업을할때, 이러한작업이컴파일되어파이썬인터프리터내부로보내진이후여러분의프로그램은실제 C의속도로실행될것이다. 좀더근본적인측면에서보자면, 현대의컴퓨터속도를감안할때파이썬의개발속도향상에서얻는이점은실행속도의손실보다더중요하다. 그러나심지어오늘날의 CPU 속도환경에서도여전히최적의실행속도를필요로하는일부분야가있다. 예를들어, 수치연산프로그래밍과애니메이션에서는핵심이되는방대한수를계산하는컴포넌트가곧잘 C 또는그이상의속도로실행될필요가있다. 그러나여러분이이러한분야에서일하고있더라도여전히파이썬을적용할수있다. 바로최적의속도를필요로하는애플리케이션의일부를컴파일확장으로분리하고, 이확장을파이썬스크립트에서사용하기위해여러분의시스템에링크하는것들이다. 이책에서는확장기능에관해서많은이야기를하지는않지만, 이것은우리가이전에이야기한제어언어로서파이썬역할의한가지예일뿐이다. 이와같은두가지언어를사용하는전략의대표적인사례로는파이썬용 NumPy 수치연산확장이있다. NumPy 는컴파일된최적화된수치연산확장라이브러리를파이썬언어와결합함으로써효율적이고사용하기쉬운수치연산프로그래밍도구가된다. 필요에따라이러한확장기능들은강력한최적화도구를제공한다. 파이썬의다른장단점 : 실체가없는것들실행속도가파이썬의유일한큰단점임을이미언급한바있다. 이러한단점은대부분의파이썬사용자들에게영향을주며, 특히이제파이썬을배우는사용자들에게더욱크게와닿는부분이다. 대부분의파이썬사용자들은파이썬이쉽게배울수있고사용하기재미있다고느끼며, 특히자바와 C# 그리고 C++ 같은다른언어들과비교하면더욱그렇다. 그러나모든독자들을위해파이썬세상을 ( 교육자그리고개발자로서 ) 지난 30년에가까운시간동안지켜보면서느낀다소추상적인파이썬의장단점에대해서이야기해볼까한다. 그렇다면단점은무엇인가? 9
교육자로서의나는때로파이썬의변화의속도를체감할수있었는데, 종종그속도가너무느려한탄스러웠으며, 파이썬라이브러리의성능은점점더나빠졌다. 내가이러한변화의속도를체감할수있는것은부분적으로는교육자와책의저자로서변화의최전선에머물고있기때문이며, 때로는고양이한무리의연대기를기록하는것과도비슷한작업이다. 이러한내용은파이썬개발자들사이에널리알려진공동의관심사다. 이책에서볼수있는것처럼파이썬의 간결하게유지하라 는기존모티브는오늘날더욱복잡해지는소프트웨어의경향을반영하고있으며, 이는높아지는초보자들의학습비용을대가로한다. 이책의두께는이러한경향의간접적인증거다. 한편으로, 대부분의평가에따르면파이썬은여전히유사한다른언어들보다더단순하지만, 오늘날파이썬에게주어진많은역할로인해복잡해보일수있다. 파이썬의전체적인일관성과개방성은대부분강력한기능들로서남아있다. 또한, 모든사람이항상새로운기술로최신상태를유지할필요는없다. 파이썬 2.X의지속적인인기가이를명확히잘보여준다. 반면, 개발자로서의나는 건전지포함 (Battery Included) 3 접근방식에내재된장단점에대해서의문을가지고있다. 이접근방식은미리제공되는도구들에대한의존성을증가시킬수있으며 ( 만약여러분이사용중인도구들이변경, 손상또는더이상지원되지않는다면?), 사용자에게장기적으로도움이될수있는보편적인원리보다특별한솔루션의사용을더권장한다 ( 여러분이도구의목적을이해하지못한다면어떻게도구를잘사용하고평가할수있겠는가?). 이런우려에대한예제들은이책곳곳에서볼수있을것이다. 일반적인사용자들의경우, 특히취미로파이썬을배우는사용자나초보자들에게파이썬이툴셋을제공하는방식은매우큰장점이다. 그러나미리제공된도구가더이상필요하지않게된경우에도놀랄필요는없다. 이책이전달하고자하는기술로부터도움을받을수있을것이다. 속담에빗대어말하자면, 사람들에게도구를그냥주면하루정도면코딩이가능하겠지만, 사람들에게도구를만드는방법을가르치면평생코딩할수있다. 이책의목적은전자보다후자에가깝다. 이장의어딘가에서언급한바와같이, 파이썬과파이썬의툴셋모델은일반적으로오픈소스 (open source) 프로젝트가공통적으로가진단점에민감하다. 이는많은사용자가사용하는일반적인사용법보다일부사용자의개인적인취향이잠재적으로승리하는경우를말하며, 나아가무정부주의또는심지어엘리트주의의출현으로연결되기도한다. 그러나이러한경향이새로운파이썬을최첨단으로이끄는중요한요소다. 우리는이러한장단점중일부에대해여러분스스로결론을도출할수있을만큼충분히파이썬을배운후인이책의끝부분에서다시언급할것이다. 오픈소스시스템으로서의파이썬이무엇인지는사용자들의정의에달렸다. 오늘날의파이썬은그어느때보다더많은인기를누리고있으며, 파이썬의성장속도는여전히누그러질기미가보이지않는다. 일부사람에게는이러한인기가개인적인의견이나장단점보다파이썬을판단하는더중요한기준이되기도한다. 3 옮긴이프로그래머가바로사용할수있는기본적인라이브러리와통합환경이배포판과함께제공되는것을의미한다. 10 CHAPTER 1 파이썬 Q&A 세션
누가파이썬을사용하는가? 이글을쓰는시점을기준으로전세계에는약백만명정도의파이썬사용자가있다고추정된다. 이추정치는다운로드수, 웹통계, 그리고개발자조사와같은다양한통계를기반으로한다. 파이썬은오픈소스라서좀더정확한수치를구하기는쉽지않다. 또한, 집계할만한라이선스등록같은것은존재하지않는다. 게다가파이썬은리눅스배포판, 매킨토시컴퓨터그리고다양한종류의제품과장치에자동으로포함되므로사용자기반을계산하기가더욱어렵다. 그러나일반적으로파이썬은대규모사용자기반과매우활동적인사용자커뮤니티를가지고있다. 파이썬은오늘날세계적으로상위 5위또는 10위안에드는가장널리사용되는프로그래밍언어로간주되며 ( 정확한순위는출처와시기에따라다를수있다 ), 30년이가깝도록광범위하게사용되어왔으므로매우안정적이고강력한언어라말할수있다. 또한, 파이썬은개인사용자들외에도실제많은회사에서수익이발생하는제품에사용되고있다. 예를들어, 파이썬을사용한다고일반적으로알려진회사들은다음과같다. 구글 (Google) 은자신들의검색시스템에서파이썬을광범위하게사용한다. 인기있는비디오공유서비스인유튜브 (YouTube) 는대부분파이썬으로작성되었다. 스토리지서비스인드롭박스 (Dropbox) 의서버와데스크톱클라이언트소프트웨어의대부분이파이썬으로작성되었다. 단일보드컴퓨터인라즈베리파이 (Raspberry Pi) 에서는교육용언어로파이썬을권장한다. CCP 게임즈에서개발한대규모멀티플레이어온라인게임 (MMOG) 중하나인이브온라인 (EVE Online) 은파이썬을광범위하게사용한다. 광범위하게사용되는 P2P 파일공유시스템인비트토렌트 (BitTorrent) 는초기에파이썬으로작성되었다. 인더스트리얼라이트 & 매직 (Industrial Light&Magic) 이나픽사 (Pixar) 와같은몇몇기업에서는애니메이션제작에파이썬을이용한다. ESRI는자사의지리정보시스템 (GIS) 제품을위해소비자에대한커스터마이징도구로파이썬을이용한다. 구글앱엔진의웹개발프레임워크는애플리케이션언어로파이썬을사용한다. 이메일서버제품인아이언포트 (IronPort) 에는백만줄이상의파이썬코드가사용되었다. 누가파이썬을사용하는가? 11
강력한통합 3D 모델링및애니메이션시스템인마야 (Maya) 는파이썬스크립트 API를제공한다. 미국국가안보국 (NSA) 은암호와정보를분석하는데파이썬을이용한다. 로봇개발전문회사인아이로봇 (irobot) 은상업및군사목적의로봇장치를개발하는데파이썬을이용한다. 게임 문명 4 의사용자정의스크립트이벤트는모두파이썬으로작성되었다. OLPC(One Laptop Per Child) 프로젝트는사용자인터페이스와활동모델을파이썬으로만든다. 넷플릭스 (Netflix) 와옐프 (Yelp) 모두자신들의소프트웨어인프라에서파이썬의역할에대해서설명하고있다. 인텔 (Intel), 시스코 (Cisco), 휴렛-팩커드 (HP), 시게이트 (Seagate), 퀄컴 (Qualcomm) 그리고 IBM은하드웨어검사를위해파이썬을이용한다. JP모간체이스 (JPMorgan Chase), 유비에스 (UBS), 겟코 (Getco) 그리고시타델 (Citadel) 은금융시장을예측하기위해파이썬을이용한다. 미항공우주국 (NASA), 로스앨러모스국립연구소, 제트추진연구소 (JPL) 와같은곳에서과학프로그래밍작업에파이썬을이용한다. 그러나이목록들은일부대표적인회사일뿐전체목록을표시하는것은이책의범위를벗어나며, 또한시간이지남에따라달라질수있다. 추가적인파이썬사용자들과애플리케이션, 그리고소프트웨어에대한최신정보들은웹브라우저를통해검색해보거나현재파이썬과위키피디아에있는다음웹페이지들을확인해보도록하자. 성공사례 : https://www.python.org/about/success 애플리케이션영역 : https://www.python.org/about/apps 사용자수 : https://www.python.org/about/quotes 위키피디아페이지 : https://en.wikipedia.org/wiki/list_of_python_software 아마도오늘날파이썬을사용하는기업들사이에유일한공통된관심사는애플리케이션관점에서볼때거의모든분야에서파이썬이사용되고있다는점일것이다. 파이썬이가지고있는다목적특성은파이썬이특정한분야에국한되지않고거의모든분야에서사용할수있게만든다. 사실, 오늘날파이썬은테스트나관리와같은단기적인작업또는장기전략제품개발 12 CHAPTER 1 파이썬 Q&A 세션
에상관없이실질적으로소프트웨어를작성하는거의모든조직이파이썬을사용한다고말할 수있다. 또한, 파이썬이이모든상황에서충분히잘동작한다는것역시이미입증되었다. 파이썬으로무엇을할수있는가? 파이썬은잘설계된프로그래밍언어일뿐만아니라, 개발자들이매일처리하는실제업무를수행하는데매우유용하다. 일반적으로파이썬은별도의컴포넌트에대한스크립트를작성하거나독립적인프로그램을구현하기위한도구로서다양한영역에서사용된다. 실제로, 파이썬은범용언어로서사실상역할에제한이거의없으며, 여러분은웹사이트개발및게임에서부터로봇과우주선의제어에이르기까지대부분의곳에서사용할수있다. 그러나현재파이썬의가장일반적인역할은크게몇가지로나눌수있을것같다. 다음몇몇절에서는각영역에서사용되는도구들뿐만아니라, 오늘날파이썬의가장일반적인응용영역중일부에대해설명한다. 우리는여기서언급된도구들에대해서깊이다룰수는없다. 이러한주제에대해관심이있다면, 파이썬웹사이트또는다른자료들을통해좀더자세한내용을살펴보도록하자. 시스템프로그래밍 파이썬은운영체제서비스에대해내장된인터페이스를제공한다. 따라서이식성을고려한시스템관리도구와유틸리티를작성하기에매우이상적이다 ( 때로는셸도구라고불린다 ). 파이썬프로그램들은파일과디렉터리트리를탐색하고, 다른프로그램을실행하며, 프로세스와스레드를사용한병렬처리와같은일들을할수있다. 파이썬의표준라이브러리는일반적인모든 OS 도구들에대한 POSIX 바인딩과지원을한다. 예로는환경변수, 파일, 소켓, 파이프, 프로세스, 멀티스레드, 정규표현식패턴매칭, 명령라인인수, 표준스트림인터페이스, 셸명령실행기, 파일이름확장, zip 파일도구들, XML 과 JSON 분석기, CSV 파일핸들러등이있다. 또한, 파이썬시스템인터페이스의대부분은이식성을고려해설계되었다. 예를들어, 일반적으로디렉터리트리를복사하는스크립트는모든주요파이썬플랫폼에서변경없이실행된다. 이는 2장에서다룰예정이며, 이브온라인 (EVE Online) 에서사용된스택리스 (Stackless) 파이썬구현은멀티프로세싱요구에대한고급솔루션을제공한다. 파이썬으로무엇을할수있는가? 13
GUI 파이썬의단순하고빠른실행으로인해데스크톱의 GUI( 그래픽사용자인터페이스 ) 프로그래밍을위한도구로도잘어울린다. 파이썬은일관성있고이식성을고려한 GUI를구현하기위해 tkinter(2.x 버전에서는 Tkinter) 라고불리는 Tk GUI API에대한표준객체지향인터페이스를제공한다. Python/tkinter GUI는마이크로소프트윈도우, 유닉스와리눅스의 X 윈도, 그리고맥 OS( 클래식과 OS X 모두 ) 에서변경없이실행된다. 무료확장패키지인 PMW는 tkinter 툴킷에고급위젯을추가한다. 또한, C++ 라이브러리기반의 wxpython GUI API는파이썬에서이식성을고려한 GUI를만들기위한또다른툴킷을제공한다. Dabo와같은보다높은수준의툴킷은 wxpython과 tkinter 같은 API 기반위에만들어진다. 여러분은또한 Qt를위한 PyQt, GTK를위한 PyGTK, MFC를위한 PyWin32,.NET을위한 IronPython, 그리고 Swing 을위한 Jython( 자이썬. 파이썬의자바버전이며 2장에서언급한다 ) 또는 JPype와같은적절한라이브러리를사용하여파이썬에서다른툴킷이제공하는 GUI 지원을사용할수있다. 웹브라우저에서실행되거나단순한인터페이스를요구하는애플리케이션들을위해다음절에서설명하는 Jython과파이썬의웹프레임워크와서버사이드 CGI 스크립트는추가적인사용자인터페이스옵션들을제공한다. 인터넷스크립트 파이썬은클라이언트와서버모드에서다양한종류의네트워크작업을수행할수있도록표준인터넷모듈을함께제공한다. 파이썬스크립트는소켓을통한통신, 서버측 CGI 스크립트로전송된폼정보추출, FTP를통한파일전송, XML과 JSON 문서의분석과생성, 이메일의보내기, 받기, 작성하기, 분석하기, URL로웹페이지가져오기, 가져온웹페이지분석하기, XML-RPC, SOAP, 텔넷을통한통신등을포함한다양한일을할수있다. 파이썬라이브러리는이러한작업들을매우단순하게만든다. 또한, 파이썬에서인터넷프로그래밍을위한다양한서드파티도구들을웹에서이용할수있다. 예를들어, HTMLGen 시스템은파이썬클래스기반설명 ( 텍스트 ) 으로부터 HTML 파일을생성하며, mod_python 패키지는아파치웹서버안에서파이썬을효율적으로실행하고파이썬서버페이지를통해서버측템플릿을지원한다. 그리고 Jython 시스템은원활한파이썬 / 자바통합을제공하고클라이언트에서실행되는서버측애플릿의코딩을지원한다. 14 CHAPTER 1 파이썬 Q&A 세션
또한 Django, TurboGears, web2py, Pylons, Zope, WebWare 와같은성숙한웹개발프레임워크패키지들은파이썬을이용하여완벽한기능을갖춘상품성있는웹사이트의빠른개발을지원한다. 이들중대부분은완벽한기업용수준의웹개발솔루션을제공하기위해객체관계 매퍼 (object-relational mapper), 모델 / 뷰 / 컨트롤러아키텍처, 서버측스크립트와템플릿, 그리고 AJAX 지원과같은기능을포함하고있다. 최근파이썬은 IronPython의실버라이트, pyjs(pyjamas), 파이썬을자바스크립트로변환하는컴파일러, AJAX 프레임워크, 그리고위젯집합과같은도구들을사용하여리치인터넷애플리케이션 (Rich Internet Application, RIA) 으로확장했다. 또한, 파이썬은앱엔진 (App Engine) 과바로다음의데이터베이스절에서설명할다른도구들을이용하여클라우드컴퓨팅으로영역으로도확장했다. 웹이진화하는방향에맞춰빠르게확장해가고있는것이다. 컴포넌트통합 우리는앞서파이썬을제어언어로서설명할때파이썬의컴포넌트통합역할에대해서언급했다. C와 C++ 시스템에내장될수있고확장될수있는파이썬의능력은, 다른시스템과컴포넌트의동작을스크립팅하기위한유연한통합언어역할을한다. 예를들어, 파이썬에 C 라이브러리를통합함으로써파이썬이라이브러리의구성요소들을실행하고테스트하는것이가능하며, 파이썬을제품에내장함으로써전체제품에대한재컴파일이나제품과함께소스를제공하지않고서도현장에서직접커스터마이징코드를작성하는것도가능해진다. SWIG와 SIP 코드생성기와같은도구들은컴파일된컴포넌트들을스크립트에서사용하기위해파이썬으로링크하는데필요한많은일을자동화한다. 그리고 Cython 시스템은개발자들이파이썬과 C 같은코드를서로혼합해서사용할수있도록해준다. 윈도우에서파이썬의 COM 지원, 자바 (Java) 기반구현인 Jython, 그리고.NET 기반구현인 IronPython과같은거대한프레임워크들은컴포넌트스크립트를작성하기위한또다른방법을제공한다. 예를들어, 윈도우에서의파이썬스크립트는워드와엑셀에대한스크립트를작성하거나실버라이트등에접근하기위한프레임워크를사용할수있다. 파이썬으로무엇을할수있는가? 15
데이터베이스프로그래밍 기존데이터베이스에대한요구들을위해파이썬에는일반적으로사용되는관계형데이터베이스시스템인터페이스가존재한다 ( 사이베이스 (Sybase) 오라클 (Oracle), 인포믹스 (Infomix), ODBC, MySQL, PostgreSQL, SQLite 등 ). 또한파이썬세상에서는내부의다양한데이터베이스시스템을동일하게바라보며, 파이썬스크립트에서 SQL 데이터베이스시스템에접근하기위한이식성을고려한데이터베이스 API를정의하고있다. 예를들어, 벤더인터페이스들이이식성을고려한 API를구현하고있기때문에무료 MySQL 시스템과함께동작하도록작성된스크립트대부분은다른시스템 ( 오라클같은 ) 에서도변경없이잘동작할것이다. 일반적으로여러분이해야할일은내부의벤더인터페이스를변경하는일밖에없다. SQL 데이터베이스엔진에포함된프로세스내장형 SQLite는파이썬 2.5 이후부터파이썬표준의일부가되었으며, 프로토타입을작성하거나프로그램의기본적인저장소로사용될수있다. 비SQL 부분에서파이썬의표준 pickle 모듈은간단한객체영속시스템 (object persistence system) 을제공한다. 객체영속시스템은프로그램이전체파이썬객체들을파일이나파일과유사한대상에쉽게저장하고복구할수있는기능을제공한다. 또한, 여러분은웹에서파이썬스크립트에서사용할수있는완벽한객체기반의데이터베이스시스템을제공하는 ZODB와 Durus라는이름의서드파티오픈소스시스템을찾을수있을것이다. 또다른것으로는객체관계형매퍼 (Object Relational Mapper, ORM) 를구현한 SQLObject 와 SQLAlchemy는파이썬클래스모델을관계형테이블에이식한다. 그리고고성능, 비SQL, 오픈소스 JSON 스타일문서데이터베이스인 MongoDB( 몽고디비 ) 에대한인터페이스인 PyMongo( 파이몽고 ) 는파이썬의리스트또는딕셔너리와매우유사한구조에데이터를저장한다. 그리고이텍스트는파이썬자체의표준라이브러리 json 모듈을이용하여분석하거나생성될수있다. 그리고또다른시스템들은파이썬클래스로데이터를모델화하는구글앱엔진데이터저장소를포함하여데이터를저장하기위한더욱특별한방법을제공하며, 애저 (Azure), 파이클라우드 (PiCloud), 오픈스택 (OpenStack), 스타카토 (Stackato) 를포함한신생클라우드스토리지들같은대규모확장성을제공한다 빠른프로토타입개발 파이썬프로그램의입장에서파이썬으로작성된컴포넌트와 C 로작성된컴포넌트는동일하 게보인다. 이때문에초기에파이썬으로프로토타입을개발하고나중에시제품을개발할때 16 CHAPTER 1 파이썬 Q&A 세션
일부컴포넌트를선택적으로 C나 C++ 같은컴파일언어로변경하는것이가능하다. 일부다른프로토타입언어와달리, 파이썬은프로토타입이결정되면모든코드를완벽히재작성하지않아도된다. C++ 같은언어의고성능이필요하지않는시스템요소들은유지보수와사용의용이성을위해파이썬코드로남겨둘수있다. 수치및과학프로그래밍 파이썬은또한수치프로그래밍에서비중있게사용된다. 수치프로그래밍은전통적으로스크립트언어의범위가아닌것으로간주되는영역이지만, 파이썬의가장강력한사용사례의하나로성장했다. 여기서눈에띄는앞서언급한파이썬의고성능수치프로그래밍확장모듈인 NumPy는배열객체, 표준수학라이브러리에대한인터페이스등과같은고급도구들을포함하고있다. NumPy 는속도를위해파이썬을컴파일언어로작성된수치루틴과통합함으로써, 파이썬을포트란또는 C++ 와같은전통적인컴파일언어로작성된기존코드를대체할수있는정교하고편리한수치프로그래밍도구로만든다. 그외의파이썬수치도구들은애니메이션, 3D 시각화, 병렬처리등을지원한다. 예를들어, 유명한 SciPy와 ScientificPython 확장모듈은추가적인과학프로그래밍도구들의라이브러리를제공하며, NumPy 를핵심구성요소로사용한다. 또한 (2장에서언급하는 ) 파이썬의 PyPy 구현은수치영역에서일반적으로사용되는무거운알고리즘코드들이 PyPy에서극적으로빠르게실행될수있기때문에이영역에서부분적으로탄력을받고있는데, 보통열배에서 100배정도빠르다. 게임, 이미지, 데이터마이닝, 로봇, 엑셀등 파이썬은일반적으로이책에서다루는것보다더많은영역에서사용된다. 예를들어, 여러분은파이썬을사용하여다음과같은일이가능한다양한도구를발견할수있다. pygame, cgkit, piglet, PySoy, Panda3D 등을이용한게임프로그래밍과멀티미디어 PySerial 확장모듈을이용한윈도우, 리눅스등의환경에서시리얼포트통신 PIL과 PIL의새버전인 Pillow fork, PyOpenGL, Blender, Maya 등을이용한이미지처리 PyRo 툴킷을이용한로봇제어프로그래밍 NLTK 패키지를이용한자연어분석 파이썬으로무엇을할수있는가? 17
라즈베리파이 (Raspberry Pi) 와아두이노 (Arduino) 보드제어 구글안드로이드 (Android) 와애플 ios에대한파이썬포트를이용한모바일컴퓨팅 PyXLL 또는 DataNitro 애드인 (add-in) 을이용한엑셀스프레드시트함수와매크로프로그래밍 PyMedia, ID3, PIL/Pillow 등을이용한미디어파일콘텐츠와메타데이터태그처리 PyBrain 신경망라이브러리와 Milk 머신러닝툴킷을이용한인공지능 PyCLIPS, Pyke, Pyrolog, pydatalog 를이용한전문가시스템프로그래밍 파이썬으로작성되고파이썬으로커스터마이징할수있는 zenoss를이용한네트워크모니터링 PythonCAD, PythonOCC, FreeCAD 등을이용한파이썬스크립트를사용한설계와모델링 ReportLab, Sphinx, Cheetah, PyPDF 등을이용한문서처리와생성 Mayavi, matplotlib, VTK, VPython 등을이용한데이터시각화 xml 라이브러리패키지, xmlrpclib 모듈, 그리고서드파티확장모듈을이용한 XML 분석 json과 csv 모듈을이용한 JSON, CSV 파일처리 Orange 프레임워크, Pattern 번들, Scrapy, 그리고커스텀코드를사용한데이터마이닝여러분은심지어 PySolFC 프로그램을이용하여솔리테어게임을플레이할수있다. 물론일상적인시스템관리, 이메일처리, 문서와미디어라이브러리관리등과같은다소전문적이지않은영역에서항상여러분만의파이썬스크립트를작성할수도있다. 여러분은 PyPI 웹사이트와웹검색을통해다양한분야의지원에대한링크를찾을수있을것이다 ( 구글을검색하거나 https://www.python.org에서링크를찾아보도록하자 ). 파이썬의광범위한사용에도불구하고, 이러한특정영역들의대부분은주로파이썬의컴포넌트통합역할의실제구현사례일뿐이다. C와같은컴파일언어로작성된컴포넌트라이브러리의프론트엔드로파이썬을추가함으로써파이썬을다양한영역에서스크립트를작성하기위한유용한언어로만들수있다. 이렇듯파이썬은통합을지원하는범용언어로써다양한분야에적용될수있다. 18 CHAPTER 1 파이썬 Q&A 세션
파이썬은어떻게개발되고유지되는가? 파이썬은유명한오픈소스시스템으로서많은상용소프트웨어개발자들이주목할만한속도로이슈에대응하고개발해가는거대하고활동적인개발커뮤니티를갖고있다. 파이썬개발자들은소스제어시스템을사용하여온라인으로협력하며일한다. 변경사항은파이썬개선제안서 (Python Enhancement Proposal, 이하 PEP) 또는다른문서작성을포함한공식적인규약에따라서개발되어파이썬의회귀테스트시스템으로이어진다. 오늘날파이썬을수정하는일은거의상업용소프트웨어를수정하는것과유사한과정을거친다. 코드작성자에게이메일만보내면충분했던파이썬초기시절과는거리가있지만, 좋은점은그만큼거대한사용자기반을가지고있다는것이다. 공식적인비영리그룹인파이썬소프트웨어재단 (Python Software Foundation, 이하 PSF) 은콘퍼런스를개최하고지적재산권문제들을처리한다. 수많은파이썬콘퍼런스들이전세계적으로개최되고있다. 그중에서도오라일리 (O Reilly) 의오스콘 (OSCON) 과 PSF의파이콘 (PyCon) 이가장큰콘퍼런스다. 전자는다양한오픈소스프로젝트에대해이야기하며, 후자는최근몇년사이에강력한성장을경험하고있는파이썬만을위한행사다. 파이콘 2012와 2013은각각참석자가 2,500명에이르렀다. 사실, 파이콘 2013은 2012년의깜짝매진후이정도수준으로행사를제한해야만했다 ( 그리고기술분야와비기술분야모두에서폭넓은관심을끌기위해운영되었다 ). 초기몇년동안은참석자가매년두배씩증가하는모습을보였는데, 예를들어 2007년의 586명에서 2008년에는 1,000명으로증가했다. 모든참석자가하나의레스토랑테이블에둘러앉을수있었던초기레퍼런스를기억하는사람들에게이와같은파이썬의성장은매우인상적이었다. 오픈소스장단점 파이썬은활발한개발자커뮤니티를누리고있지만, 필연적으로따르는단점에도주목해야한다. 또한, 오픈소스소프트웨어는무질서하고때로는무정부상태인것처럼보일수있다. 그리고이전절에서넌지시말한것처럼개발이항상순조롭게만진행되는것은아니다. 일부변경사항들은여전히공식적인절차와는다르게온전히일부사람들의노력으로만관리되며, 프로세스의통제에도불구하고여전히실수가발생한다 ( 예를들어, 파이썬 3.2.0 은윈도우에서콘솔 input 함수의문제를포함한상태로배포되었다 ). 파이썬은어떻게개발되고유지되는가? 19
게다가오픈소스프로젝트는현재개발자들의영리적인이익을개인적인호기심으로바꾸는것이기때문에여러분의성향과잘맞을수도있고아닐수도있다. 여러분이회사에인질로잡혀있는건아니지만, 시스템을바꾸는데여가시간을쓸지말지는여러분의의지에달렸다. 오픈소스소프트웨어는종종일부사람들의주도로진화되지만, 그영향은많은사람에게퍼져나간다는긍정적인효과가있다. 그러나실제로이러한오픈소스의장단점은기존에이미안정화된버전들보다는최첨단기능을포함한최신릴리즈에더많은영향을준다. 예를들어여러분이파이썬 2.X 에서여전히고전클래스를사용하고있다면, 2000년대초중반에나타난클래스기능의급증과새로운스타일의클래스로의변화에거의영향을받지않는다. 비록이것들이 3.X 에서는다양한기능과함께필수적인요소가되었지만, 오늘날많은 2.X 사용자들은여전히이러한이슈를운좋게피해가고있다. 파이썬의기술적인강점은무엇인가? 당연히이질문은이미경험이있는개발자들의질문이다. 만약여러분이아직프로그래밍에대한배경지식이없다면, 다음몇개의절에서나오는용어들은여러분을당황케만들것이다. 우리가책을진행하면서이러한용어들에대해서는좀더자세히알아볼것이므로걱정할필요는없다. 여기서는개발자들을위해파이썬이가지고있는기술적인특징들에대해빠르게소개할것이다. 파이썬은객체기반이며함수형언어 파이썬은완전한객체지향언어다. 파이썬의클래스모델 (class model) 은다형성, 연산자오버로딩, 그리고다중상속과같은고급개념을지원한다. 하지만파이썬의간단한구문과입력으로인해객체지향프로그래밍의적용이매우쉽다. 실제로여러분이이용어들을이해하지못한다면, 이용어들을다른객체지향프로그래밍언어들보다파이썬을통해배우는것이훨씬더쉽다는것을느낄수있을것이다. 파이썬의객체지향프로그래밍의특성은강력한코드구조와재사용장치를제공한다는점이다. 그리고파이썬을다른객체지향시스템언어들을위한훌륭한스크립트도구로쓰이게한다. 예를들어, 파이썬프로그램들은적절한연결코드를사용하여 C++, 자바, 그리고 C# 20 CHAPTER 1 파이썬 Q&A 세션
으로구현된특수한클래스들을서브클래스로사용할수있다. 파이썬에서객체지향프로그래밍의사용은선택사항이라는것도매우중요하다. 여러분은한번에객체전문가가되지않아도파이썬에대해많은것을배울수있다. C++ 와마찬가지로파이썬은절차적프로그래밍모드와객체지향프로그래밍모드둘다지원한다. 파이썬의객체지향기능은객체지향제약이허용될때적용된다. 파이썬에서객체지향개발이필수가아니라는사실은설계단계가배제된빠른개발을진행하고자할때특히유용하다. 파이썬은기존의절차적 ( 문장기반 ) 그리고객체지향적 ( 클래스기반 ) 패러다임뿐아니라, 함수형프로그래밍에대한기본적인지원을제공한다. 함수형프로그래밍은제너레이터 (generator), 컴프리헨션 (comprehension) 4, 클로저 (closure), 맵 (map), 데코레이터 (decorator), 익명함수람다 (lambda), 그리고 1급함수 (first-class function) 를포함한일반적인기준들을포함한다. 이는기존의객체지향프로그래밍도구들을보안하거나대체하는역할을모두수행할수있다. 파이썬은무료 파이썬의사용과배포는완전히무료다. Tcl( 티씨엘 ), 펄 (Perl), 리눅스 (Linux) 그리고아파치 (Apache) 와같은다른오픈소스소프트웨어와마찬가지로, 파이썬의전체소스코드를인터넷에서무료로내려받을수있다. 해당소스를여러분의시스템에복사하거나, 내장하거나, 또는여러분의제품에포함하여판매해도아무런제한이없다. 심지어여러분이의지만있다면파이썬소스코드자체를판매할수도있다. 그러나오해는말자. 무료 (free) 가기술지원이제공되지않는다 (unsupported) 는것을의미하지는않는다. 오히려파이썬온라인커뮤니티는대부분의상업용소프트웨어의헬프데스크에필적할만한속도로사용자들의질문에빠르게대응한다. 게다가파이썬은전체소스가함께제공되기때문에개발자들에게파이썬자체의코드를보거나수정할수있는권한을제공한다. 비록프로그래밍언어의구현을공부하거나수정하는것이모든이에게즐거운일은아니지만, 필요한경우언어자체를수정할수있다는사실을아는것은많은위안이된다. 그러므로여러분에게는최후의수단이자최고의문서인소스코드가있으니변덕스러운상업적 4 옮긴이파이썬에서컴프리헨션 (comprehension) 은다른반복가능객체를만드는방법을제공하는것을의미한다. 컴프리헨션을 내포, 지능형등여러단어로번역할수있으나, 파이썬커뮤니티안에서컴프리헨션이가장많이사용되고있으므로이책에서 는그대로컴프리헨션으로번역했다. 파이썬의기술적인강점은무엇인가? 21
업체에의존하지않아도된다. 앞서설명했듯이, 파이썬의개발은주로인터넷을통해협업하는커뮤니티에서이뤄진다. 이커뮤니티는파이썬의최초창시자이자자비로운종신독재자 (Benevolent Dictator for Life, BDFL) 인귀도반로섬 (Guidovan Rossum) 과수천명의공헌자로구성되어있다. 언어에대한변경사항은공식적인개선절차를따라야하며, 귀도반로섬과수많은개발자에의해철저히검사된다. 이러한절차는파이썬이몇몇다른언어와시스템보다변화에대해보수적이도록만드는경향이있다. 파이썬이버전 3과 2로나뉘는동안이러한전통이의도적으로완전히버려진것같겠지만, 파이썬의각코드에는보수적인경향이여전히남아있다. 파이썬은이식성이좋다 파이썬의표준구현은이식성을고려한표준 ANSI C로구현되어있으며, 현재사용중인거의모든주요플랫폼에서컴파일되고실행된다. 예를들어, 오늘날파이썬프로그램들은 PDA 에서부터슈퍼컴퓨터에이르기까지거의모든곳에서실행된다. 파이썬이실행되는환경은다음과같다. 리눅스와유닉스시스템 마이크로소프트윈도우 맥 OS( 맥 OS X과구버전포함 ) BeOS, OS/2, VMS, 그리고 QNX VxWorks 와같은실시간시스템 크레이 (cray) 슈퍼컴퓨터와 IBM 메인프레임 팜 OS(Palm OS), 포켓PC(PocketPC) 그리고리눅스가실행되는 PDA 심비안 OS(Symbian OS) 와윈도우모바일 (Windows Mobile) 이실행되는휴대폰 게임콘솔과아이팟 (ipod) 구글안드로이드와애플 ios가실행되는태블릿과스마트폰 그외여러가지파이썬인터프리터와마찬가지로, 파이썬과함께제공되는표준라이브러리모듈역시플랫폼에상관없이높은이식성을갖도록구현되어있다. 게다가파이썬프로그램은호환성있는파 22 CHAPTER 1 파이썬 Q&A 세션
이썬버전이설치된플랫폼이라면어디서나동일하게실행되는이식성을고려한바이트코드로자동컴파일된다 ( 자세한내용은다음장에서다룬다 ). 이말의의미는파이썬의핵심언어와표준라이브러리를사용하는파이썬프로그램은파이썬인터프리터가포함된리눅스, 윈도우그리고대부분의시스템에서동일하게실행된다는것이다. 파이썬의플랫폼별구현은각플랫폼고유의확장기능 ( 윈도우에서 COM 지원 ) 을포함하고있지만, 핵심적인파이썬언어자체와라이브러리는어디서나동일하게실행된다. 또한앞서설명했듯이파이썬은 tkinter(2.x 부터 Tkinter) 라고불리는 Tk GUI 툴킷에대한인터페이스를포함하고있으며, 이툴킷은파이썬프로그램이프로그램의변경없이대부분의주요 GUI 데스크톱플랫폼에서실행되는잘갖춰진그래픽사용자인터페이스를구현할수있도록한다. 파이썬은강력하다 파이썬은기능적인측면에서하이브리드언어에가깝다. 파이썬의툴셋으로인해파이썬은 Tcl( 티씨엘 ), 스킴 (Scheme), 펄 (Perl) 과같은전통적인스크립트언어와 C, C++, 자바와같은시스템개발언어사이에놓여있다. 파이썬은스크립트언어가가진단순함과쉬운사용법, 그리고컴파일언어에서발견할수있는고급소프트웨어엔지니어링도구로서의특징을모두제공한다. 몇몇다른스크립트언어와는달리, 파이썬은이러한조합으로대규모개발프로젝트에서도유용하게사용할수있다. 파이썬의툴박스에서여러분이발견할수있는주요한것들을여기서미리살펴보자. 동적타이핑파이썬은프로그램실행시프로그램이사용하는객체들의종류를기억하고관리한다. 파이썬은여러분의코드에서복잡한타입과크기에대한선언을요구하지않는다. 6장에서볼수있는것처럼실제로파이썬어디에서도변수나타입의선언을발견할수없다. 파이썬코드는데이터타입을제한하기않기때문에이는일반적으로모든범위의객체에자동으로적용할수있다. 자동메모리관리파이썬은객체가필요할때자동으로할당하고, 더이상필요하지않을때자동으로반환한다. 그리고대부분은필요에따라크기를늘리거나줄일수있다. 곧배우겠지만, 메모리관리에대한상세한내용은파이썬이스스로처리하기때문에여러분은이에대해신경쓸필요가없다. 파이썬의기술적인강점은무엇인가? 23
대규모시스템을위한프로그래밍지원대규모시스템을만들기위해파이썬은모듈, 클래스그리고예외 (exception) 와같은도구들을제공한다. 이러한도구들은시스템을컴포넌트로구성할수있게하고, 코드의재사용과커스터마이징을위해객체지향프로그래밍을사용하며, 이벤트와에러를우아하게 (gracefully) 처리한다. 앞서설명한파이썬의함수형프로그래밍도구는같은목적을이루기위한몇가지추가적인방법을제공한다. 내장객체타입파이썬은리스트 (List) 와딕셔너리 (Dictionary), 그리고언어의본질적인부분에해당하는문자열 (String) 과같은일반적으로사용되는데이터구조를제공한다. 곧살펴보겠지만, 이러한데이터구조는매우사용하기쉽고유연하다. 예를들어, 내장객체는필요에따라크기를늘리거나줄일수있고, 복잡한정보를표현하기위해임의로중첩될수있다. 내장된도구이러한모든객체타입을처리하기위해파이썬은연결 (concatenation), 슬라이싱 (slicing), 정렬 (sorting), 매핑 (mapping) 과같은강력한표준연산을함께제공한다. 라이브러리유틸리티파이썬은좀더구체적인작업을위해정규표현식매칭부터네트워킹까지거의모든것을미리작성된거대한라이브러리묶음으로제공한다. 파이썬언어자체를배우고나면애플리케이션수준에서의작업대부분은라이브러리도구에서발생한다. 서드파티유틸리티파이썬은오픈소스이기때문에내장기능에서지원하는것이상의도구를개발하는데기여하도록항상장려된다. 여러분은웹에서 COM, 이미지처리, 수치제어프로그래밍, XML, 데이터베이스접근을포함한다양한도구를무료로찾을수있다. 이러한다양한도구의제공에도불구하고파이썬자체는지극히단순한구문과구조를유지하고있다. 그결과파이썬은스크립트언어의모든유용성을가진강력한프로그래밍도구가되었다. 파이썬은다른언어와함께사용할수있다 파이썬프로그램은다른언어로작성된컴포넌트에다양한방법으로쉽게연결될수있다. 예를 들어, 파이썬의 C API 를이용하면 C 프로그램에서파이썬을호출하거나파이썬프로그램에서 24 CHAPTER 1 파이썬 Q&A 세션
C 프로그램을호출할수있다. 이말은곧필요하다면 C 언어로작성된기능을파이썬시스템에추가할수있고, 다른환경이나시스템에서파이썬프로그램을이용할수있음을의미한다. 예를들어, C 또는 C++ 같은언어로작성된라이브러리와파이썬을연결하면화면설계언어나커스텀도구로유용하게사용할수있다. 앞서언급했듯이, 파이썬은빠른프로토타이핑에유용하다. 신속한개발속도를위해시스템을먼저파이썬으로구현한다음, 제품에대한성능요구사항이발생할때하나씩 C 코드로옮겨구현한다. 파이썬은상대적으로사용하기쉽다 대부분의사람들이보기에파이썬프로그래밍은 C++, 자바및 C# 과같은다른언어들에비해놀랄만큼단순하다. 파이썬프로그램을실행하기위해서단순히코드를작성하고실행하기만하면된다. 또한, 파이썬에는 C 또는 C++ 와같은다른언어에서필요한중간단계인컴파일이나링크단계가존재하지않는다. 게다가파이썬은프로그램을즉시실행시키기때문에대화형프로그래밍과프로그램수정후빠른전환이가능하다. 대부분의경우에여러분은타이핑한즉시, 프로그램의수정내용을확인할수있다. 물론, 빠른개발주기전환은파이썬의많은유용한것들중하나일뿐이다. 파이썬은계획적으로단순한구문과내장된강력한도구들을제공하며, 일부영역에서실행가능한의사코드 (executable pseudocode) 라고불리기까지한다. 또한다른언어들에존재하는복잡한많은것들을제거했으므로일반적으로널리사용되는다른언어들로작성된같은프로그램보다더단순하고, 더작으며, 더유연하다. 파이썬은상대적으로배우기쉽다 이말이곧이책의핵심이다. 특히, 파이썬언어자체는널리사용되는다른언어들에비해서매우쉽다. 실제로여러분이경험많은프로그래머이고, 성급하게파이썬전문가가되려고만하지않는다면단몇시간안에언어의일부영역을선택적으로사용할수있고, 단며칠정도의시간이면작은규모의파이썬프로그램을어렵지않게작성할수있을것이다. 물론, 파이썬을실질적으로마스터하는것이그리간단한문제는아니므로우리는이작업에이책의나머지부분을할애할계획이다. 파이썬을마스터하기위해필요한진정한투자는그만큼충분히가치있는일이다. 결국여러분은거의모든컴퓨터애플리케이션영역에적용할 파이썬의기술적인강점은무엇인가? 25
수있는프로그래밍기술을얻게되며, 파이썬의학습곡선이다른프로그래밍언어들보다훨씬완만하다는사실을알게될것이다. 이는커스터마이징이나제어를위해파이썬계층을노출하고있는시스템의최종사용자뿐만아니라, 업무에사용할새로운언어를찾고있는개발자들에게도매우좋은소식이다. 오늘날많은시스템은개발사의지원없이최종사용자가자신들만의커스터마이징을위한코드를작성하기위해서충분히파이썬을배울수있다는사실에의존하고있다. 또한파이썬은경력과상관없이단지재미를위해프로그램을개발하는거대한사용자그룹을양산했으며, 완전한소프트웨어개발기술을필요로하지않을수도있다. 파이썬은몬티파이썬의이름을딴것이다 이주제는기술적인내용은아니지만내가꼭알려주고싶은, 파이썬세계에서놀라울만큼잘숨겨진내용이다. 사실, 파이썬관련책과아이콘에있는다양한파충류에도불구하고파이썬이라는이름은영국코미디그룹몬티파이썬 (Monty Python)(1970년대 BBC 코미디시리즈인몬티파이썬의플라잉서커스 (Monty Python s Flying Circus) 와영화몬티파이썬 (Monty Python), 그리고오늘날까지여전히인기가많은거룩한잔 (Holy Grail) 을포함한몇몇장편영화의제작사 ) 에서유래한것이다. 수많은소프트웨어개발자들처럼파이썬의창시자또한몬티파이썬의팬이었다 ( 확실히두분야사이에는어떤조화가있는것같다 ). 파이썬의이러한과거는필연적으로파이썬코드예제에유머러스한특징들을추가하게된다. 예를들어, 전통적인일반변수이름인 foo 와 bar 는파이썬세계에서 spam 과 eggs 가된다. 가끔 Brian, ni, 그리고 shrubbery 또한마찬가지로이름을빌려온것이다. 심지어이는파이썬커뮤니티전반에도영향을미쳤다. 일부이벤트들은파이썬콘퍼런스에서 스페인종교재판 처럼정기적으로발표된다. 물론이모든것은몬티파이썬쇼에익숙할경우무척재미있지만, 그렇지않다면재미가없다. 이책에서보게될많은예제를포함하여쇼의내용을참조한예제를이해하기위해몬티파이썬의작품들에굳이익숙해질필요는없다. 그러나이제여러분은적어도파이썬이름의어원만큼은확실히알게되었다. 26 CHAPTER 1 파이썬 Q&A 세션
파이썬은다른언어와어떻게비교될수있는가? 마지막으로, 사람들은기존에알고있던지식들사이에서파이썬을이해하기위해파이썬을펄, Tcl 그리고자바와같은언어들과비교한다. 이절은이주제에대한일반적인의견을요약한것이다. 나는서로를비교하고비난해대는방법으로이기는것을좋아하지않는다는것을미리말해두고싶다. 이러한방법은장기적으로효과가없으며, 이책을쓴목적과도부합하지않는다. 게다가이것은제로섬게임이아니다. 대부분의프로그래머는다양한언어를사용한다. 그럼에도불구하고프로그래밍도구들은고려해볼만한선택의기회와장단점을제시해야한다. 결국, 파이썬이다른언어들보다더나은뭔가를제공하지못한다면처음부터사용하지않았을것이다. 우리는이미이전에성능의장단점에대해서이야기했으므로여기서는기능의장단점에초점을맞출것이다. 다른언어들또한매우유용하지만, 많은사람이파이썬에서다음과같은점을발견한다. 파이썬은 Tcl보다더강력하다. 파이썬은 대규모프로그래밍 에대한강력한지원으로거대한시스템개발에활용할수있으며, 파이썬의애플리케이션도구라이브러리는매우광범위하다. 파이썬은펄 (Perl) 보다가독성이좋다. 파이썬은명료한구문을가지고있으며, 단순하고일관성있게설계되었다. 이는결국파이썬이재사용할수있고, 유지보수하기쉬우며, 프로그램의버그를줄이는데도움이되도록만든다. 파이썬은자바와 C# 보다더단순하며사용하기쉽다. 파이썬은스크립트언어이지만, 자바와 C# 은 C++ 같은거대한객체지향프로그래밍시스템언어의복잡성과구문을대부분이어받고있다. 파이썬은 C++ 보다더단순하며사용하기쉽다. 파이썬코드는같은 C++ 코드보다더단순하고, 종종 1/3 에서 1/5 수준의크기밖에되지않는다. 하지만파이썬은스크립트언어로서때로는 C++ 언어가제공하지못하는다른역할도제공한다. 파이썬은 C보다더단순하며, 고수준언어다. 파이썬의내부하드웨어구조로부터독립적인구조는 C나 C++ 관련언어들보다코드를덜복잡하고, 잘구조화되며, 접근하기쉽게만든다. 파이썬은다른언어와어떻게비교될수있는가? 27
파이썬은비주얼베이직 (Visual Basic) 보다더강력하고다양한용도로사용되며, 다양한플랫폼을지원한다. 파이썬은비주얼베이직보다더널리사용되는풍부한언어이며, 파이썬이오픈소스라는사실은어느특정한회사에의해지배되지않는다는것을의미한다. 파이썬은 PHP보다가독성이좋으며, 더다양한용도로사용된다. 파이썬은 PHP와마찬가지로웹사이트를만드는데도사용되지만, 로봇에서부터애니메이션, 그리고게임에이르기까지거의모든컴퓨터영역에서사용된다. 파이썬은자바스크립트 (JavaScript) 보다강력하며, 더다양한용도로사용된다. 또한매우큰툴셋을제공하는데, 이툴셋은웹개발에서만사용할수있을뿐아니라과학적인모델링이나계측등에서도사용된다. 파이썬은루비 (Ruby) 보다더가독성이좋고잘정착되어있으며, 루비보다구문이덜복잡하다. 파이썬에서객체지향프로그래밍의적용은전적으로사용자나프로젝트의선택사항이다. 파이썬은루아 (Lua) 보다더욱성숙하며, 다양한주제에초점을맞추고있다. 또한, 많은기능과광범위한라이브러리로인해루아보다더다양한분야에적용할수있으며, Tcl과같이다른언어들간의연결언어로서의기능도포함하고있다. 파이썬은 Smalltak, Lisp, Prolog 보다덜난해하다. 이같은언어의동적인특징도가지고있지만, 개발자와커스터마이징가능한시스템의최종사용자들이접근할수있는기본구문도가지고있다. 특히단순히텍스트파일을읽는것이상의일을하는프로그램이나, 미래에다른사람이볼수있거나, 또는여러분이읽게될프로그램의경우, 오늘날여러분이사용할수있는어떤스크립트나프로그래밍언어보다더좋은언어라는것을어렵지않게발견할수있다. 또한, 여러분의프로그램이고성능을필요로하지않을때파이썬은종종 C, C++ 및자바와같은시스템개발언어의현실적인대안이되기도한다. 파이썬코드는종종같은목적을달성하면서도작성과디버깅이훨씬더쉽고, 유지보수하기도편하다. 물론, 나는 1992년부터정식파이썬에반젤리스트였기에이러한내의견을받아들일지는여러분의몫이다 ( 그리고다른언어의지지자들의생각은다를수있다 ). 그러나파이썬을이해하기위해많은노력을한개발자들의일반적인경험을충분히반영했다는것을알아주었으면한다. 28 CHAPTER 1 파이썬 Q&A 세션
이장의요약 그리고여기서이제이책의과대광고를끝내겠다. 이장에서우리는사람들이프로그래밍시에파이썬을선택하는몇가지이유에대해서알아보았으며, 오늘날파이썬을사용하는대표적인사례들을통해파이썬이어떻게적용되고보여지는지도살펴보았다. 나의목표는파이썬을가르치는것이지판매하는것이아니다. 언어를판단하는가장좋은방법은실제동작을보는것이므로이책의나머지부분은이장에서그럴싸하게설명한언어의세부내용에전적으로초점을맞출것이다. 다음두장은파이썬에대한기술적인소개를시작하겠다. 이두장에서는파이썬프로그램을실행하는방법을탐구하고, 파이썬의바이트코드실행모델을간단히살펴보며, 코드를절약하기위한모듈파일의기본에대해소개한다. 이두장의목표는이책의나머지부분의예제와실습문제를실행할수있는충분한정보를제공하는것이다. 실제로 4장이전에는프로그래밍을시작하지않지만, 그전에프로그램의구동에대해충분히이해하고있는지확인하도록하자. 학습테스트 : 퀴즈 핵심개념의복습을돕기위해설명한주제에대하여오픈북형식의퀴즈로각장을마감하겠다. 이퀴즈에대한정답은질문바로다음에있으며, 정답은종종질문의배경에대한추가적인정보를제공하므로퀴즈에대한답을여러분스스로구한다음, 정답을꼭확인하기바란다. 퀴즈이외에책의각파트의끝에는여러분의파이썬코딩시작을돕기위한파트실습문제들이있다. 다음은첫번째퀴즈다. 행운을빌며, 퀴즈를푸는동안필요하다면언제든지이장의내용을참조하도록하자. 1. 사람들이파이썬을선택하는여섯가지주요이유는무엇인가? 2. 오늘날파이썬을사용하는유명한회사나단체네개를말해보시오. 3. 애플리케이션개발에파이썬을선택하지않는다면그이유는무엇인가? 4. 파이썬으로무엇을할수있는가? 5. 파이썬의 import this문의의미는무엇인가? 6. 책또는웹의많은예제에서 spam 을볼수있는이유는무엇인가? 7. 여러분이좋아하는색은무엇인가? 학습테스트 : 퀴즈 29
학습테스트 : 정답 여러분은이퀴즈에어떻게답했는가? 다음은내가생각한정답이며, 일부퀴즈의경우에는다양한정답이있을수있다. 다시말하지만, 여러분이생각한정답이확실하다고생각해도질문에대한추가적인정보를얻을수있으니정답을반드시확인하기바란다. 다음정답중에이해되지않는부분이있다면이장의본문을참고하자. 1. 소프트웨어품질, 개발자생산성, 프로그램이식성, 라이브러리지원, 컴포넌트통합, 그리고즐거움. 이중에서품질과생산성이사람들이파이썬의사용을선택한주된이유인것같다. 2. 구글, 인더스트리얼라이트 & 매직 (Industrial Light&Magic), CCP 게임즈, 제트프로펄션연구소 (Jet Propulsion Lab), ESRI 등. 소프트웨어를개발하는거의모든조직에서장기적인전략적제품개발또는테스트및시스템관리와같은단기적인개발을위해파이썬을다양한방식으로사용하고있다. 3. 파이썬의가장큰단점은성능이다. 파이썬은 C와 C++ 와같이완전한컴파일언어처럼빠르게실행되지않는다. 한편으로파이썬은일반적인대부분의애플리케이션에서사용하기에충분히빠르며, 파이썬코드는인터프리터의 C 코드에연결되어실행되기때문에어쨌든 C의실행속도에가깝게실행된다. 속도가중요한경우, 애플리케이션의수치연산부분에대해컴파일된확장기능을이용할수있다. 4. 웹사이트개발뿐만아니라게임에서부터로봇과우주선의제어에이르기까지컴퓨터로할수있는거의모든것에서파이썬을사용할수있다. 5. 이내용은이미각주에서언급된내용이다. import this는파이썬언어의기초를이루는기본설계철학의일부를출력하는파이썬내부의이스터에그를실행시킨다. 다음장에서이문 (statement) 을실행시키는방법을배우게될것이다. 6. spam 은유명한몬티파이썬풍자에서참조한것이며, 식당에서음식을주문하려는사람들은스팸에대해노래하는바이킹의합창에의해묻힌다. 아, 그리고 spam 은파이썬스크립트에서흔한변수이름이다. 7. 파랑. 아니, 노랑!( 몬티파이썬과성배에나오는대사 ) 30 CHAPTER 1 파이썬 Q&A 세션
파이썬은예술이아닌기술 1990년대초소프트웨어무대에파이썬이처음등장했을때, 파이썬은자신의지지자들과또다른인기있는스크립트언어인펄사이에어떤고전적인갈등을양산했다. 개인적으로나는오늘날의이논쟁이매우피곤하고부당하다고생각한다. 개발자들은스스로결론을내릴만큼충분히똑똑하다. 여전히이내용은내가강의를다닐때가장흔히받는질문의주제중하나이며, 사람들이파이썬을선택하는주된이유중하나이기도하다는점을강조한다. 여기서이에관한몇가지짧은이야기를하는것이좋을것같다. 짧은이야기란 여러분이펄에서할수있는것은파이썬에서도할수있지만, 작성된후에코드를쉽게읽을수있어야한다. 는게전부다. 파이썬과펄의활용범위는대부분겹치지만, 파이썬은가독성좋은코드를생산하는데더욱초점을맞춘다. 많은경우에파이썬의향상된가독성이더나은코드재사용성과유지보수성으로이어지며, 일회용프로그램이아닌장기간유지보수해야하는프로그램을위한더나은선택이되도록만든다. 하지만펄코드는작성하기는쉬워도읽기는어려울수있다. 대부분의소프트웨어가처음작성할때예상했던것보다훨씬더긴수명을가지고있음을감안할때, 많은사람이파이썬이보다더효율적인도구라고생각한다. 다소긴이야기는두언어설계자의배경을반영하고있다는것이다. 파이썬은수학자의의해고안되었기때문에자연스럽게고도의균일성과일관성을가진직교 (orthogonal) 언어로만들어졌다. 반면펄은언어학자에의해만들어졌으며, 문맥에따른민감도와넓은다양성을가진자연어에가까운프로그래밍도구다. 잘알려진펄의모토처럼어떤일을하는데에는한가지이상의방법이있다 (there s more than one way to do it). 이러한사고방식을감안하여펄언어와펄언어의사용자커뮤니티둘모두는코드를작성할때구속되지않는표현의자유를장려했다. 한사람의펄코드는다른사람의펄코드와근본적으로다를수있다. 사실, 독특하고어려운코드를작성하는것은종종펄사용자들사이에서자부심의원천이된다. 그러나오래된코드를유지보수해본사람이라면누구나증명할수있는것처럼, 예술적인면에서의표현의자유는바람직하지만, 기술적인면에서는그렇지않다. 기술에서는최소한의기능과예측가능성이필요하다. 기술에서표현의자유는오히려유지보수를악몽으로이끌수있다. 일부펄사용자는너무많은자유의결과로인해코드를수정해나가는것보다차라리처음부터새로작성하는것이더쉬울때가있다고나에게털어놓기도했다. 다음내용을생각해보자. 사람들이그림이나조각을만들때그들은대부분자신을위해일하며, 그들의작품을나중에누군가변경할가능성은포함되어있지않다. 이것은바로예술과기술사이의중요한차이다. 반면, 소프트웨어를작성할때는대부분자신을위해소프트웨어를작성하지않는다. 사실, 컴퓨터를위해작성하는것도아니다. 좋은프로그래머는유지보수나재사용을위해해당코드를읽어야만하는다음사람을위해코드가작성된다는것을알고있다. 코드를유지보수해야하는사람이해당코드를이해할수없다면, 현실적인개발시나리오에서는모든코드가쓸모없어진다. 즉, 프로그래밍은독창적이고모호한것이아니라여러분의프로그램이어떻게그목적을명확하게전달하는지에대한것이다. 많은사람이파이썬이다른스크립트언어와가장명확하게차별화된것으로보는부분이바로가독성에초점을맞추었다는점이다. 파이썬의구문모델은가독성있는코드의생성을거의강제하고있다. 그래서파이썬프로그램들은전체소프트웨어개발주기에좀더직접적인영향을준다. 그리고 학습테스트 : 정답 31
파이썬은제한된상호작용, 코드의균일성, 기능의일관성과같은개념들을강조하므로코드가작성된후오랫동안사용될수있도록육성한다. 장기적으로보면, 파이썬이코드품질에주안점을둔것은프로그래머의만족도뿐만아니라생산성을본질적으로증대시킨다. 물론파이썬프로그래머들도매우창의적일수있으며, 앞으로볼수있는것처럼파이썬또한일부작업에대해서다양한방안을제공한다. 오늘날에는때로너무많은방안이제공되며, 이것은우리가이책에서곧직면하게될문제다. 사실, 여기이내용은 품질은취약한상태로판명되었으며, 기술못지않게사람에의존적이다 라는교훈적인이야기로읽힐수도있다. 파이썬은역사적으로다른스크립팅언어가때로는하지못했던방식으로좋은엔지니어링을장려했지만, 나머지품질이야기는여러분에게달렸다. 적어도이러한내용은파이썬을사용하는많은사람사이에서일반적인의견중일부다. 물론, 여러분은파이썬이제공하는것을배움으로써스스로이러한주장에대해판단해야만한다. 이제여러분이파이썬을시작할수있도록다음장으로넘어가도록하자. 32 CHAPTER 1 파이썬 Q&A 세션
2 파이썬이프로그램을실행하는방법 CHAPTER 이장과다음장에서는여러분이코드를실행하는방법과파이썬이프로그램을실행하는방법에대해서빠르게살펴볼것이다. 이장에서는파이썬인터프리터가일반적으로프로그램을실행하는방법에대해배울것이다. 그리고서다음 3장에서는직접프로그램을작성하고실행하는방법을배운다. 프로그램을시작하는작업의상세한내용은본질적으로플랫폼에종속적이며, 이두장에서다뤄지는일부내용은여러분의환경에는적용되지않을수도있다. 그러므로파이썬에경험이있는독자라면이책을읽는의도에따라자유롭게이장을건너뛰어도괜찮다. 마찬가지로, 과거에비슷한언어를사용해본독자와언어를빠르게사용해보기를원하는독자는나중에참고할수있도록이장에표시를해두고빠르게넘어갈수도있다. 그외의독자들은파이썬코드를작성하는방법을배우기전에우리가작성한코드를파이썬이실행하는방법에대해서간단히살펴보자. 파이썬인터프리터소개 지금까지프로그래밍언어로서의파이썬에대해서이야기를했다. 그러나현재파이썬이구현된것처럼파이썬또한인터프리터 (interpreter) 라고불리는소프트웨어패키지다. 인터프리터는다른프로그램을실행시키는프로그램의한종류다. 여러분이파이썬프로그램을작성하면, 33
파이썬인터프리터는여러분이작성한프로그램을읽고프로그램이포함하고있는명령을수행한다. 사실상인터프리터는여러분이작성한코드와여러분의장비에포함된컴퓨터하드웨어사이의소프트웨어로직계층에해당한다. 여러분의장비에파이썬패키지가설치되면많은컴포넌트가생성된다 ( 기본적으로는인터프리터와지원라이브러리 ). 파이썬인터프리터는사용하는방법에따라실행가능한프로그램의형태또는다른프로그램에연결되는라이브러리묶음형태로설치될수있다. 여러분이실행하는파이썬의형태에따라인터프리터자체는 C 프로그램으로구현되거나, 자바클래스의집합이거나, 또는다양한방법으로구현될수있다. 인터프리터의형태에상관없이여러분이작성한파이썬코드는항상이인터프리터에의해실행되므로파이썬코드를실행하기위해서는여러분의컴퓨터에파이썬인터프리터를설치해야만한다. 파이썬설치과정은플랫폼에따라다르며, 상세한내용은이책의부록 A에서다룬다. 간단히살펴보면다음과같다. 윈도우사용자는파이썬자동설치실행파일을가져와실행한다. 실행과정의모든메시지에대해단순히더블클릭그리고 예 또는 다음 을입력하기만하면된다. 리눅스와맥 OS X 사용자는아마도파이썬이이미설치되어있을것이다. 이두플랫폼에서는표준컴포넌트로채택되어있다. 몇몇리눅스와맥 OS X 사용자들은 ( 그리고대부분의유닉스사용자들은 ) 전체소스코드를포함한배포패키지로부터컴파일하여파이썬을사용한다. 리눅스사용자들은 RPM 파일을통해서사용할수있고, 맥 OS X 사용자들은다양한맥전용의설치패키지를통해서사용할수있다. 그외의다른플랫폼들또한플랫폼에따른관련된설치방법을제공한다. 예를들어, 파이썬은휴대폰, 태블릿, 게임콘솔그리고아이팟에서도사용할수있지만, 설치방법은매우다양하다. 파이썬자체는파이썬메인사이트인 https://www.python.org의다운로드페이지에서가져올수있으며, 이외에도다양한다른배포채널을통해서도받을수있다. 설치하기전에이미파이썬이설치되어있지는않은지확인하자. 여러분이윈도우 10 또는그이전버전에서작업하고있다면, 그림 2-1 에서볼수있듯이일반적으로시작메뉴에서파이썬을찾을수있다. 다음장에서이그림에나타난메뉴옵션에대해서다룰것이다. 유닉스와리눅스에서의파이 34 CHAPTER 2 파이썬이프로그램을실행하는방법
썬은보통 /usr 디렉터리트리아래에존재한다. 설치과정의상세한내용은플랫폼에따라다르기때문에여기서는다루지않는다. 설치과정에대한좀더상세한내용은부록 A를참고하자. 이장과다음장의목적을위해나는독자가이미파이썬을설치했다고가정하고설명할것이다. 프로그램실행 파이썬스크립트를작성하고실행하는것의의미는이일을바라보는관점이프로그래머인지, 파이썬인터프리터인지에따라다르다. 두관점모두파이썬프로그래밍에대한중요한견해를제공한다. 프로그래머의관점 파이썬프로그램의가장간단한형태는단순히파이썬문을포함하고있는하나의텍스트파일이다. 예를들어, 다음의 script0.py라는이름의파일은내가생각해낼수있는가장간단한파이썬스크립트중하나이지만, 완전한기능을포함한파이썬프로그램이다. print('hello world') print(2 ** 100) 이파일은인용부호에포함된텍스트와수치표현 (2의 100제곱 ) 의결과를출력스트림으로단순히출력하는두개의파이썬 print문을포함하고있다. 이코드의구문에대해서는아직생각하지않아도된다. 이장에서는단지실행하는방법에대해서만이야기할것이다. 다음장에서 print문과파이썬이어떻게 2의 100제곱을오버플로우없이계산할수있는지에대해서설명할것이다. 여러분은여러분이선호하는어떠한텍스트편집기로도위코드가포함된파일을만들수있다. 관례적으로, 파이썬프로그램은.py로끝나는이름으로제공된다. 엄밀히말하면, 이이름지정방식은 임포트 (imported) 되는파일에만반드시요구되는사항이다. 임포트에대해서는다음장에서설명한다. 그러나대부분의파이썬파일들은일관성을위해파일끝에.py를붙이는규칙을따른다. 프로그램실행 35
그림 2-1 윈도우 10 또는이전버전에파이썬을설치한후시작화면의모습이다. 설치항목들은파이썬배포버전에따라다를수있지만, IDLE은개발 GUI 도구를실행하고, Python은간단한대화형세션을실행한다. 그리고표준매뉴얼과 PyDoc 문서엔진 (Module Docs) 이포함되어있다. 윈도우 8과다른플랫폼의설치모습은제3장과부록 A를참고하자. 이문들을텍스트파일에입력한다음, 파일을실행하기위해파이썬을호출해야한다. 파일을실행한다는것은파일에포함된모든문을위에서아래로한라인씩실행한다는것을의미한다. 다음장에서볼수있는것처럼셸명령라인이나파이썬프로그램아이콘을클릭하거나, IDE 도구안에서실행하거나, 또는기타표준적인다양한방법으로파이썬프로그램파일을실행할수있다. 파일이별문제없이실행되었다면두개의 print문이보여주는결과를컴퓨터어딘가에서볼수있을것이다 ( 기본적으로프로그램을실행한같은창에서결과를볼수있다 ). hello world 1267650600228229401496703205376 예를들어, 다음은내가작성한파이썬파일에바보같은오타가있지는않은지확인하기위 해윈도우가설치된노트북의명령프롬프트창의명령라인에서스크립트를실행했을때어 떤일이발생했는지보여준다. 36 CHAPTER 2 파이썬이프로그램을실행하는방법