정보교육을위한파이썬 정보탐색 Version 0.0.9-d2 저자 : Charles Severance 번역 : 이광춘, 한정수 (xwmooc)
Copyright 2009- Charles Severance. Printing history: October 2013: Major revision to Chapters 13 and 14 to switch to JSON and use OAuth. Added new chapter on Visualization. September 2013: Published book on Amazon CreateSpace January 2010: Published book using the University of Michigan Espresso Book machine. December 2009: Major revision to chapters 2-10 from Think Python: How to Think Like a Computer Scientist and writing chapters 1 and 11-15 to produce Python for Informatics: Exploring Information June 2008: Major revision, changed title to Think Python: How to Think Like a Computer Scientist. August 2007: Major revision, changed title to How to Think Like a (Python) Programmer. April 2002: First edition of How to Think Like a Computer Scientist. This work is licensed under a Creative Common Attribution-NonCommercial-ShareAlike 3.0 Unported License. This license is available at creativecommons.org/licenses/ by-nc-sa/3.0/. You can see what the author considers commercial and non-commercial uses of this material as well as license exemptions in the Appendix titled Copyright Detail. The LATEX source for the Think Python: How to Think Like a Computer Scientist version of this book is available from http://www.thinkpython.com.
Chapter 1 왜 프로그래밍을 배워야 하는가? 컴퓨터 프로그램을 만드는 행위(프로그래밍)는 매우 창의적이며 향후 뿌린 것 이상으로 얻을 것이 많다. 프로그램을 만드는 이유는 어려운 자료분석의 문제를 해결하려는 것에서부터 다른사람의 문제를 해결해주는 재미를 느끼는 것까지 다양한 이유가 있다. 이 책에서 모든 사람이 어떻게 프로그램을 만드는지를 알 고, 프로그램을 만드는지를 알게되면, 새로 습득한 프로그래밍 기술로 원하는 것을 해결할 수 있는 것을 배우게 된다. 우리의 일상은 노트북부터 핸드폰까지 다양한 컴퓨터에 둘러싸여 있다. 이러한 컴퓨터가 개인비서로 우리를 위해서 많은 일을 대신해 준다고 생각한다. 일상생 활에서 접하는 컴퓨터 하드웨어는 우리에게 다음에 무엇을 하면 좋겠습니까? 라는 질문을 지속적으로 물어보게 만들어 졌다. What Next? What Next? What Next? What Next? What Next? What Next? PDA 프로그래머는 운영체제와 하드웨어에 응용 프로그램을 만들었고, 결국 많은 것 들을 도와주는 PDA(Persoanl Digital Assistant)로 진화했다. 컴퓨터는 빠르며, 큰 저장소를 가지고 있어 우리가 컴퓨터에게 다음꺼 실행해(do next)를 컴퓨터 가 이해할 수 있는 말로 지시를 하게되면 우리에게 매우 유용할 수 있다. 예를 들어, 다음의 세 문단을 보고 가장 많이 나오는 문단의 단어를 찾아보고 얼마나 나오는지를 알려주세요라고 컴퓨터에게 시킬 수 있다. 사람이 몇초만에 단어를 읽고 이해할 수는 있지만, 그 단어가 몇번 나오는지를 세는 것은 매우 고생스렁운 과정이다. 왜냐하면 사람은 지루하고 반복되는 일의 문제를 해결하 는데 적합하지 않기 때문이다. 컴퓨터는 정반대이다. 논문이나 책에서 텍스트를 읽고 이해하는 것은 컴퓨터에게 어렵다. 하지만 단어를 세고 가장 많이 사용되는 단어를 말해주는 것은 컴퓨터에게는 무척이나 쉽다. python words.py
Chapter 1. 왜 프로그래밍을 배워야 하는가? 2 Enter file:words.txt to 16 우리의 개인 정보분석 비서는 to 라는 단어가 가장 많이 사용되었고 16번 나왔 다고 바로 답을 준다. 사람이 잘하지 못하는 점을 컴퓨터가 잘할 수 있다는 사실을 이해하면 왜 컴퓨 터 언어로 컴퓨터와 대화해야 하는지를 알 수 있다. 컴퓨터와 대화할 수 있는 언어(Python)를 배우게되면 지루하고 반복되는 일을 컴퓨터가 처리하게 하면 더 많은 시간을 창의적이고, 직관적이며, 창조적인 시간을 컴퓨터와 함께 할 수 있다. 1.1 창의성과 동기 이책은 직업 프로그래머를 위해서 저작된 것은 아니지만, 직업적으로 프로그램 을 만드는 작업은 개인적으로나 경제적인면에서 꽤 매력적인 일이다. 특히, 유 용하며, 심미적이고, 똑똑한 프로그램을 다른 사람이 사용할 수 있도록 만드는 것은 매우 창의적인 일이다. 컴퓨터는 다양한 그룹의 프로그래머들이 사용자의 관심과 시선을 빼았기 위해서 경쟁적으로 다양한 프로그램을 가지고 있다. 이렇 게 개발된 프로그램은 사용자가 원하는 바를 충족시키고 훌륭한 사용자 경험을 주려고 노력한다. 이러한 상황에서 사용자가 소프트웨어를 고르게 될 때 고객의 선택에 대해서 프로그래머는 직접적으로 보상을 받게된다. 만약 프로그램을 프로그래머 집단의 창의적인 결과물로 바라본다면, 아마도 다 음의 그림이 PDA 컴퓨터에 의미가 있을 듯 하다. Pick Me! Pick Me! Pick Me! Pick Me! Pick Me! Buy Me :) PDA 우선은 프로그래을 만드는 주된 동기가 사업을 위한다던가 사용자를 기쁘게 한 다기 보다는 일상생활에서 맞닥드리는 자료와 정보를 잘 다뤄 좀더 생산적으로 우리의 삶을 만드는데 초점을 잡아보자. 프로그램을 만들기 시작할 때 여러분 모두는 프로그래머이면서 동시에 자신이 만든 프로그램의 사용자가 된다. 프로 그래머로서 기술을 습득하고 프로그래밍 자체로 창의적으로 느껴진다면, 여러 분은 다른 사람을 위해 프로그램을 개발하게 준비가 된 것이다. 1.2 컴퓨터 하드웨어 아키텍처 소프트웨어 개발을 위해 컴퓨터에 지시 명령어를 전달하기 위한 컴퓨터 언어 를 배우기 전에, 컴퓨터가 어떻게 구성되어 있는지 이해할 필요가 있다. 컴퓨터 혹은 핸드폰을 분해해서 안쪽을 살펴보면, 다음의 주요 부품을 발견할 수 있다.
1.2. 컴퓨터 하드웨어 아키텍처 Software Input Output Devices 3 What Next? Central Processing Unit Main Memory Network Secondary Memory 주요 부품을 살펴보자. 중앙처리장치(Central Processing Unit, CPU): 다음은 무엇을 할까요? ( What is next? ) 명령어를 처리하는 주요 부분이다. 컴퓨터가 3.0 GHz 라면 초당 명령어(다음은 무엇을 할까요? What is next?)를 삼백만번 처 리할 수 있다고 계속 물을 수 있다. CPU의 처리속도를 따라서 컴퓨터와 빠르게 대화하는 것을 배울 것이다. 주 기억장치(Main Memory): 주기억장치는 중앙처리장치(CPU)가 급하 게 명령어를 처리하기 위해 필요로 하는 정보를 저장하는 용도로 사용된 다. 주 기억장치는 중앙처리장치만큼이나 빠르다. 그러나 주기억장치에 저장된 정보는 컴퓨터가 꺼지면 자동으로 지워진다. 보조 기억장치 보조 기억장치는 정보를 저장하기 위해 사용되지만, 주기억장치보다 속 도가 느리다. 전기가 나갔을 때도 정보를 기억하는 것이 장점이다. 휴대용 USB 기억장치나 이동 MP3 플레이어에 사용되는 USB의 플래쉬 메모리 나 디스크 드라이브가 여기에 속한다. 입출력장치(Input Output Devices): 간단하게 화면, 키보드, 마우스, 마 이크, 스피커, 터치패드가 포함된다. 컴퓨터와 사람이 상호작용하는 방식 이다. 네트워크(Network): 요즘 거의 모든 컴퓨터는 네트워크로 정보를 주고 받 는 네트쿼크 커넥션(Network Connection) 하드웨어를 가지고 있다. 네트 워크는 정보를 저장하는 느린 저장소로 혹은 때때로 원하는 정보를 가져 오지 못하는 것으로 보조 기억장치(Secondary memory)로 생각할 수 있다. 어떻게 이러한 주요 부품들이 작동하는지에 대한 자세한 사항은 컴퓨터를 만드 는 사람에게 달려있지만, 프로그램을 만들때 컴퓨터 주요부품에 대해서 언급되 어 컴퓨터 전문용어를 습득하고 이해하는 것은 도움이 된다. 프로그래머로서 여러분들은 사용자가 원하는 자료를 분석하고 문제를 풀 수 있 는 컴퓨터 자원들을 사용하고 오케스트레이션하는 것이다.
Chapter 1. 왜 프로그래밍을 배워야 하는가? 4 Software Input Output Devices What Next? Central Processing Unit Main Memory Network Secondary Memory You 프로그래머로 중앙처리장치(CPU)와 대화하며 다음은 무엇을 수행하세요 라 고 지시할 것이다. 때때로 중앙처리장치(CPU)에게 주 기억장치, 보조 기억장치, 네트워크, 입출력 장치를 사용하라고 지시할 것이다. 프로그래머는 컴퓨터의 다음은 무엇을 수행할까요 에 대한 답을 하는 사람이 기도 하다. 하지만, 컴퓨터에 답하기 위해서 5mm 크기로 컴퓨터에 프로그래 머를 집어넣고 초당 30억개의 명령어로 답을 하는 것은 매우 불편할 것이다. 그래서, 미리 컴퓨터에게 수행할 명령문을 써놔야한다. 이렇게 미리 작성된 명 령문의 집합을 프로그램(Program)이라고 하며, 명령어 집합을 작성하고 명령 어 집합이 올바르게 작성될 수 있도록 하는 행위를 프로그래밍(Programming) 이라고 부른다. 1.3 프로그래밍 이해하기 책의 나머지 장을 통해서 책을 읽고 있는 당신을 프로그래밍의 장인으로 인도할 것입니다. 종국에는 책을 읽고 있는 여러분은 프로그래머가 될 것입니다. 아마 도 전문적인 프로그러머는 아닐지라도 적어도 자료/정보 분석 문제를 보고 그 문제를 풀수 있는 기술을 가지게는 될 것입니다. 이런 점에서 프로그래머가 되려면 두가지 기술이 필요로 합니다. 첫째, 파이썬같은 프로그래밍 언어 - 어휘와 문법을 알 필요가 있습니다. 단어를 새로운 언어에 맞추어 쓸 수 있어야 하며 새로운 언어를 잘 표현된 문장으로 구성하는지를 알아야 합니다. 둘째, 스토리(Story)를 말 할 수 있어야 합니다. 스토리를 만들때, 독자에 게 우리의 아이디어(idea)를 전달하기 위해서 단어와 문장을 조합합니다. 스토리를 만들 때 기술과 예술적인 면이 있으며, 기술과 예술적인 면은 여러번 쓰기 연습을 통하고 피트백을 받으므로써 향상됩니다. 프로그래 밍에서, 우리가 만든 프로그램은 스토리이고, 풀려고 하는 문제는 아이 디어 에 해당합니다.
1.4. 단어와 문장 5 파이썬과 같은 프로그래밍 언어를 배우게 되면, 자바스크립트나 C++ 같은 두 번째 언어를 배우는 것은 무척이나 쉽습니다. 새로운 프로그래밍 언어는 매우 다른 어휘와 문법을 가지지만, 문제푸는 기술을 배우기만 하면, 모든 프로그래 밍 언어에서로 동일하게 접근할 수 있습니다. 파이썬의 어휘와 문단은 금방 배웁니다. 새로운 종류의 문제를 풀기위해 논리 적인 프로그램을 짜는 것은 오래 걸립니다. 여러분은 작문을 배우듯이 프로그래 밍을 배우게 될 것입니다. 프로그래밍을 읽고 설명하는 것으로 시작해서 간단한 프로그램을 작성하고, 점차적으로 복잡한 프로그램을 작성하게될 것입니다. 어 느 순간에 명상에 잠기게 되고, 문제해결과 프로그램의 패턴을 보게되고, 좀더 자연스럽게 어떻게 문제를 받아들여 그 문제를 해결할 수 있는 프로그램을 작성 하게 될 것입니다. 그리고, 그 순간에 도착하게 되면, 프로그래밍은 매우 즐겁고 창의적인 과정이 될 것입니다. 파이썬 프로그램의 어휘와 구조로 시작을 합니다. 간단한 예제가 언제 처음으로 프로그램을 읽기 시작했는지를 일깨워 주니 인내심을 가지세요. 1.4 단어와 문장 사람의 언어와 달리, 파이썬의 어휘는 실질적으로 매우 적다. 어휘를 예약어 (researved words)로 부른다. 이들 단어는 파이썬에 매우 특별한 의미를 가진다. 파이썬 프로그램에서 파이썬이 이들 단어를 보게되면, 이들 단어는 파이썬에게 단 하나의 유일한 의미를 지니게 된다. 후에 여러분들이 프로그램을 작성할 때 여러분들이 만든 자신만의 단어를 작성하게 되는데 이를 변수(Variable)라고 합니다. 여러분의 변수의 이름을 지을 때 폭넓은 자유를 가질 수 있지만, 변수의 이름으로 파이썬의 예약어를 사용할 수는 없습니다. 이런 점에서 강아지를 훈련시킬 때 앉아, 기달려, 가져와 같은 특별한 어휘 를 사용합니다. 강아지에게 이런 특별한 예약어를 사용하지 않을 때, 강아지는 주인이 특별한 어휘를 사용하지 않을 때 주인을 물끄러미 쳐다보기만 합니다. 예를 들어, 여러분이 더 많은 사람들이 건강을 전반적으로 향상하는 방향으로 가자 원한다 고 말하면, 강아지가 든는 것은 뭐라 뭐라 뭐라 walk 뭐라 이렇 게 들릴 것이다. 왜냐하면 가자 가 강아지의 언어에는 예약어1 이기 때문이다. 이러한 사실은 개와 사람사이에는 예약어가 없다는 것을 의미할지도 모른다. 사람이 파이썬에게 말을 하는 예약어는 다음과 같은 것이 있다. and as assert break class continue def del elif else except exec finally for from global if import in is lambda 1 http://xkcd.com/231/ not or pass print raise return try while with yield
Chapter 1. 왜 프로그래밍을 배워야 하는가? 6 강아지의 사례와는다르게 파이썬은 이미 완벽하게 훈련이 되어 있다. 여러분이 try 라고 말하면, 파이썬은 여러분이 매번 try 라고 말할 때마다 실패 없이 시도를 할 것이다. 이러한 예약어를 배울 것이고 어떻게 잘 사용되는지도 함께 배울것이지만, 지 금은 파이썬에 말하는 것에 집중할 것이다. 파이썬에게 말하는 것 중 좋은 것은 다음과 같은 메세지를 던지는 것으로도 파이썬에 말을 할 수 있다는 것이다. print 'Hello world!' 이 간단한 문장이 파이썬의 구문(Syntax)론적으로 완벽하다. 위 문장은 예약어 print 로 시작해서 출력하고자 하는 문자열을 작은 따옴표로 감싸안아 올바르 게 파이썬에게 전달했다. 1.5 파이썬과 대화하기 파이썬으로 우리가 알고 있는 단어를 가지고 간단한 문장을 만들었고, 새로운 언어 기술을 시험하기 위해서 파이썬과 대화를 어떻게 하는지 알 필요가 있다. 파이썬과 대화를 시작하기 전에, 파이썬 소프트웨어를 컴퓨터에 설치하고 컴 퓨터에서 파이썬을 어떻게 실행하는지를 배워야 한다. 이번장에서 다루기에는 너무 구체적이고 자세한 사항이기 때문에 www.pythonlearn.com을 참조하는 것을 권고한다. 자세한 설치 방법과 화면을 캡쳐하여 윈도우와 매킨토쉬 시스 템 및 실행하는 방법을 설명하였다. 설치가 마무리되고 터미널이나 명령어 실 행창에서 python을 치게되면 파이썬 인터프리터가 인터랙티브 모드로 실행을 시작하고 다음과 같은 것이 화면에 뿌려진다. Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> >>> 프롬프트는 파이썬 인터프리터가 여러분에게 요청하는 방식이다. 다음에 파이썬이 무엇을 실행하기를 원합니까? 파이썬은 여러분과 대화를 나눌 준비 가 되었다. 이제 남은 것은 파이썬 언어로 어떻게 말하는 지를 여러분이 아는 것이고 여러분은 대화를 할 수 있다. 예를들어 여러분이 가장 간단한 파이썬 언어의 단어나 문장 조차도 알수가 없 다고 가정해 봅시다. 우주 비행사가 저 멀리 떨어진 행성에 착륙할 때 사용하는 간단한 말을 사용하여 행성의 거주민에게 대화를 시도한다고 생각해 봅시다. >>> I come in peace, please take me to your leader File "<stdin>", line 1 I come in peace, please take me to your leader ˆ SyntaxError: invalid syntax >>>
1.5. 파이썬과 대화하기 7 잘 되는것 같지 않습니다. 뭔가 빨리 다른 생각을 하지 않는다면, 행성의 거주민 은 창으로 찔르고, 기름에 잘 발라 불위에서 바베큐를 만들어 저녁으로 먹을 듯 합니다. 운 좋게도 기나긴 우주 여행중 이책의 복사본을 가지고 와서 다음과 같이 빠르게 친다고 생각해봅시다. >>> print 'Hello world!' Hello world! 훨씬 좋아보기고, 좀더 커뮤니케이션을 이어갈 수 있을 것으로 보입니다. >>> print 'You must be the legendary god that comes from the sky' You must be the legendary god that comes from the sky >>> print 'We have been waiting for you for a long time' We have been waiting for you for a long time >>> print 'Our legend says you will be very tasty with mustard' Our legend says you will be very tasty with mustard >>> print 'We will have a feast tonight unless you say File "<stdin>", line 1 print 'We will have a feast tonight unless you say ˆ SyntaxError: EOL while scanning string literal >>> 이번 대화는 잠시동안 잘 진행되다가 여러분이 파이썬 언어로 말하다가 정말 사소한 실수를 저질러 파이썬이 오류를 뱉어낸다. 이번에 파이썬이 놀랍도록 복잡하고 강력하고 파이썬과 의사소통을 할때 사용 하는 신택스(syntax)가 매우 까다롭다는 것은 알 수 있었다. 파이썬은 다른말로 똑똑(Intelligent)하지는 않다. 지금까지 여러분은 자신과 대화를 저절한 신택스 (syntax)를 가지고 대화를 했습니다. 여러분이 다른사람이 작성한 프로그램을 사용한다는 것은 여러분과 파이썬을 사용하는 다른 프로그래머가 파이썬을 중간 매개체로 대화를 하는 것으로 볼 수 있습니다. 파이썬은 프로그램을 만든 저작자가 어떻게 대화가 진행되어져야 하 는지를 표현하는 방식입니다. 다음 몇 장에 걸쳐서 여러분은 파이썬을 이용하여 여러분의 프로그램을 이용하는 다른 많은 프로그래머 중의 한명이 될 것입니다. 파이썬 인터프리터와 대화하는 첫 장을 끝내기 전에, 파이썬 행성의 거주자에게 안녕히 계세요 를 말하는 적절한 방법을 알아야 한다. >>> good-bye Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'good' is not defined >>> if you don't mind, I need to leave File "<stdin>", line 1 if you don't mind, I need to leave ˆ SyntaxError: invalid syntax >>> quit()
Chapter 1. 왜 프로그래밍을 배워야 하는가? 8 위 처음 두개의 시도는 다른 오류 메세지를 출력한다. 두번째 오류는 다른데 이유는 if가 예약어이기 때문에 파이썬은 이 예약어를 보고 뭔가 다른 것을 말한 다고 생각하지만, 잠시 후 문장의 신택스가 잘못됐다고 판정하고 오류를 뱉어 낸다. 파이썬에게 안녕히 계세요 를 말하는 올바른 방식은 인터렉티브 >>> 프롬프 트에서 quit()를 입력하는 것이다. 1.6 전문용어: 인터프리터와 컴파일러 파이썬은 사람이 읽고 쓸수 있고 컴퓨터도 읽고 쓸 수 있도록 고안된 하이레벨 (High-level) 언어이다. 다른 하이레벨 언어는 자바, C++, PHP, 루비, 베이직, 펄, 자바스크립트 등 다수가 있다. 중앙처리장치(CPU)내에서 실제 하드웨어 수준 에서 이런 하이레벨 언어를 이해하지 못한다. 중앙처리장치는 우리가 기계어(machine-language)로 부르는 언어만 이해한다. 기계어는 매우 간단하고 솔직히 작성하기에는 매우 지루하다. 왜냐하면 모두 0 과 1로만 표현되기 때문이다. 01010001110100100101010000001111 11100110000011101010010101101101... 0과 1로만 되어 있기 때문에 기계어가 간단해 보이지만, 시택스는 복잡하고 파이 썬보다 훨씬 어렵다. 그래서 매우 소수의 프로그래머만이 기계어를 쓸수 있다. 대신에 파이썬과 자바스크립트 같은 하이레벨 언어로 프로그래머가 작성할 수 있도록 다양한 번역기(translator)를 만들었다. 이들 번역기는 프로그램을 중앙 처리장치에 의해서 실제 실행이 가능한 기계어로 변환하여 준다. 기계어는 컴퓨터하드웨어에 묶여있기 때문에 기계어는 다른 형식의 하드웨어 에 이식(portable)이 되지 않는다. 하이레벨 언어로 작성된 프로그램은 새로운 하드웨어위에 다른 인터프리터를 이용하여 옮겨 실행이 가능하고 다른 하드웨 어에 사용할 수 있도록 프로그램을 다시 컴파일하여 사용할 수 있다. 프로그래밍 언어의 번역기는 두가지 범주가 있다. (1) 인터프리터 (2) 컴파일러 인터프리터는 프로그래머에 의해서 쓰여진 소스코드를 읽고, 소스코드를 파싱 하고, 즉석에서 명령어를 해석한다. 파이썬은 인터프리터다. 파이썬을 인터렉트 브 모드로 실행할때, 파이썬 명령문을 쓰면, 파이썬이 즉성에서 처리하고, 다른 파이썬 명령어를 여러분으로부터 기다린다. 파이썬 명령어는 파이썬이 나중에 사용될 값을 기억하기를 바란다. 적당한 이름 을 잡아서 그 값을 기억시키고, 나중에 그 이름을 호출하여 값을 사용할 수 있다. 이러한 목적으로 값을 저장하는 것을 변수(variable)라고 한다. >>> x = 6 >>> print x 6 >>> y = x * 7
1.6. 전문용어: 인터프리터와 컴파일러 9 >>> print y 42 >>> 이 예제에서 파이썬이 x라는 라벨을 사용하여 6이라는 값을 저장하기를 바라고 나중에 사용코저 한다. print 예약어를 사용하여 파이썬이 잘 기억하고 있는지 를 검증한다. 그리고 x를 반환하여 7을 곱하고 새로운 변수 y에 값을 집어 넣는 다. 그리고 y에 현재 무엇이 저장되어 있는지 출력하라고 파이썬에게 요청한다. 파이썬에 한줄 한줄 명령어를 쳐 넣고 있지만, 파이썬은 앞쪽에 명령문에서 생 성된 자료가 나중의 실행 명령문에서 사용될 수 있도록 정렬된 명령문으로 처 리한다. 방금전 논리적이고 의미있는 순서로 4줄의 명령문을 가진 한 단락을 작성한 것이다. 위에서 본것처럼 파이썬과 대화를 주고받을 수 있는 것이 인터프리터의 본질이 다. 컴파일러는 완전한 프로그램을 하나의 파일에 담겨지고, 하이레벨 소스코 드가 기계어로 번역되고, 컴파일러가 나중에 실행되도록 기계어를 파일에 담아 놓는다. 윈도우를 사용한다면, 실행가능한 기계어 프로그램의 확장자가.exe (executable), 혹은.dll (dynamically loadable library)임을 확인할 수 있다. 리눅스와 매키토쉬에서는 실행화일을 의미하는 확장자는 없다. 텍스트 편집기에서 실행파일을 열게되면 다음과 같은 읽을 수 없는 좀 괴상한 출력을 화면상에서 확인할 수 있다. ˆ?ELFˆAˆAˆAˆ@ˆ@ˆ@ˆ@ˆ@ˆ@ˆ@ˆ@ˆ@ˆBˆ@ˆCˆ@ˆAˆ@ˆ@ˆ@\xa0\x82 ˆDˆH4ˆ@ˆ@ˆ@\x90ˆ]ˆ@ˆ@ˆ@ˆ@ˆ@ˆ@4ˆ@ ˆ@ˆGˆ@(ˆ@$ˆ@!ˆ@ˆFˆ@ ˆ@ˆ@4ˆ@ˆ@ˆ@4\x80ˆDˆH4\x80ˆDˆH\xe0ˆ@ˆ@ˆ@\xe0ˆ@ˆ@ˆ@ˆE ˆ@ˆ@ˆ@ˆDˆ@ˆ@ˆ@ˆCˆ@ˆ@ˆ@ˆTˆAˆ@ˆ@ˆT\x81ˆDˆHˆT\x81ˆDˆHˆS ˆ@ˆ@ˆ@ˆSˆ@ˆ@ˆ@ˆDˆ@ˆ@ˆ@ˆAˆ@ˆ@ˆ@ˆA\ˆDˆHQVhT\x83ˆDˆH\xe8... It is not easy to read or write machine language so it is nice that we have interpreters and compilers that allow us to write in a high-level language like Python or C. Now at this point in our discussion of compilers and interpreters, you should be wondering a bit about the Python interpreter itself. What language is it written in? Is it written in a compiled language? When we type python, what exactly is happening? The Python interpreter is written in a high level language called C. You can look at the actual source code for the Python interpreter by going to www.python.org and working your way to their source code. So Python is a program itself and it is compiled into machine code and when you installed Python on your computer (or the vendor installed it), you copied a machine-code copy of the translated Python program onto your system. In Windows the executable machine code for Python itself is likely in a file with a name like: C:\Python27\python.exe
Chapter 1. 왜 프로그래밍을 배워야 하는가? 10 That is more than you really need to know to be a Python programmer, but sometimes it pays to answer those little nagging questions right at the beginning. 1.7 프로그램 작성하기 파이썬 인터프리터에 명령어를 치는 것은 파이썬의 주요기능을 알아볼 수 있는 좋은 방법이지만 좀더 복잡한 문제를 해결하기 위해서는 권해드리지는 않습 니다. 프로그램을 작성할 때 스크립트(script)로 불리는 파일에 명령어 집합을 작성하 기 위해서 텍스트 편집기를 주로 사용합니다. 파이썬 스크립트는.py라는 확장 자를 가집니다. 스크립트를 실행하기 위해서 파이썬 인터프리터에게 파일의 이름을 말해줍니 다. 유니스나 윈도우 명령창에서 python hello.py를 치게 되면 다음과 같은 결과를 얻게 됩니다. csev$ print csev$ Hello csev$ cat hello.py 'Hello world!' python hello.py world! csev$ 은 운영시스템의 명령어 프롬프트이고, cat hello.py 는 문자열을 출력 하라는 한줄의 파이썬 프로그램을 표시하라는 명령어입니다. 인터랙트브 모드로 파이썬 코드를 보여달라는 방식 대신에 파이썬 인터프리터 를 호출하고 hello.py 파일에서 소스코드를 읽으라고 말하는 것입니다. 이 새로운 방식은 파이썬 프로그램을 끝내기 위해 quit()를 사용할 필요가 없 는 것이 좋은 점입니다. 파이썬이 파일에서 소스코드를 읽을 때, 파일 끝까지 읽게되면 파이썬은 자동으로 끝낼 줄을 알고 있습니다. 1.8 프로그램이란 무엇인가? 프로그램(Program)의 가장 기본적인 정의는 어떠한 일을 할 수 있도록 조작된 일련의 파이썬 명령문의 집합이다. 가장 간단한 hello.py 스크립트도 프로그램 이다. 한줄의 프로그램으로 특별히 유익하고 쓸모가 있는 것은 아니지만 엄격한 의미에서 파이썬 프로그램이 맞다. 프로그램을 이해하는 가장 쉬운 방법은 프로그램이 어떠한 문제를 풀려고 만들 어졌는지 문제를 먼저 생각하는 것이다. 그리고 그 문제를 풀려고 작성된 프로 그램을 살펴보는 것이다. 예를 들어 여러분이 페이스북의 일련의 게시된 글에 가장 자주 사용된 단어에 관심을 가지고 소셜 컴퓨팅 연구를 한다고 생각해 봅시다. 페이스북에 게시된
1.8. 프로그램이란 무엇인가? 11 글들을 출력하고 가장 흔한 단어를 찾으로 열심히 들여다 볼 것이지만 매우 오래 걸리고 실수하기 쉽습니다. 하지만 파이썬 프로그램을 이용하면, 빨리 정확하게 작업을 할 수 있는 파이썬 프로그램을 작성해서 주말에 뭔가 재미있는 일로 보낼 수 있습니다. 예를 들어 다음의 자동차(car)와 광대(clown)를 보고, 가장 많이 나오는 단어는 무엇이며 몇번 나왔는지 세어보세요. the clown ran after the car and the car ran into the tent and the tent fell down on the clown and the car 그리고, 몇백만줄의 텍스트를 보고서 동일한 일을 한다고 상상해 보세요. 솔직 히 수작업으로 단어를 세는 것보다 파이썬을 배워 프로그램을 배우는 것이 훨씬 빠를 것입니다. 더 좋은 소식은 이미 텍스트 파일에서 가장 자주 나오는 단어를 찾아내는 간단한 프로그램을 제시했고, 작성했고, 시험까지 했다. 이걸 가지고 여러분들은 바로 사용을 할 수 있기 때문에 수고를 덜 수 있다. name = raw_input('enter file:') handle = open(name, 'r') text = handle.read() words = text.split() counts = dict() for word in words: counts[word] = counts.get(word,0) + 1 bigcount = None bigword = None for word,count in counts.items(): if bigcount is None or count > bigcount: bigword = word bigcount = count print bigword, bigcount 이 프로그램을 사용하려고 파이썬을 알 필요도 없다. 10장에 걸쳐서 멋진 파 이썬 프로그램을 만드는 방법을 배우게 될 것입니다. 지금 여러분은 사용자로 단순히 프로그램을 사용하지만 이 프로그램이 얼마나 많은 수작업을 줄일 수 있는지 보여주고 있다. 코드를 작성하고 words.py로 저장하여 실행을 하거나, http://www.pythonlearn.com/code/에서 소스코드를 다운로드 받아 실행하 면 된다. 파이썬과 파이썬 언어가 중간의 중개자로서 여러분(사용자)과 저자(프로그래 머)사이에서 중개자의 역할을 훌륭히 하고 있는 것을 보여주고 있습니다. 파이 썬이 설치된 컴퓨터에서 누구나 사용할 수 있는 공통의 언어로 유용한 명령 순서 (즉, 프로그램)를 주고받는지 보여준다. 그래서 파이썬과 직접의사소통하지 않 고 파이썬을 통해서 서로 의사소통할 수 있다.
Chapter 1. 왜 프로그래밍을 배워야 하는가? 12 1.9 프로그램 구성요소 다음의 몇장에 걸쳐서 파이썬 어휘, 문장구조, 문단구조에 대해서 배울 것이다. 파이썬의 강력한 점에 대해서 배울 것이고, 유용한 프로그램을 작성하기 위해서 파이썬의 역량을 조합하는 법을 배울 것이다. 프로그램을 작성하기 위해서 사용하는 로우레벨(low-level) 패턴이 몇가지 있다. 파이썬을 위해서 만들어졌다기 보다는 기계어부터 하이레벨 언어에 이르기까 지 모든 언어에 공통된 사항이다. 입력: 컴퓨터 바깥세계에서 데이터를 가져온다. 파일로부터 데이터를 읽을 수 도 있고, 마이크나 GPS 같은 센서에서 데이터를 입력받을 수도 있다. 위 프로그램에서 사용자의 키보드로 데이터를 입력받아 입력값으로 사용된 사례이다. 출력: 화면에 프로그램의 결과값을 보여주거나 파일에 저장한다. 혹은 음악을 연주하거나 텍스트를 읽도록 스피커 같은 장치에 데이터를 보낸다. 순차 실행: 스크립트에 작성된 순서에 맞추어 한줄 한줄 실행된다. 조건 실행: 조건을 확인하고 명령문을 실행하거나 건너뛴다. 반복 실행: 반복적으로 명령문을 실행한다. 대체로 반복 실행시 변화를 수반 한다. 재사용: 명령어를 한번 작성하고 이름을 주어 저장하고 프로그램의 필요에 따 라 이름을 불러 몇차례 다시 사용한다. 너무나 간단하게 들리지만, 전혀 간단하지는 않다. 걸음거리를 간단히 한 다리 를 다를 다리 앞에 놓으세요 라고 말하는 것 같다. 프로그램을 짜는 예술 은 이러한 기본 요소를 조합하고 엮어 사용자에게 유용한 무언가를 만드는 것이다. 단어를 세는 프로그램은 위 프로그램의 기본요소를 하나만 빼고 모두 사용하여 작성되었다. 1.10 프로그램이 잘못되면? 파이썬과 처음에 대화를 할때, 파이썬 코드를 명확하게 작성하여 의사소통을 해 야한다. 작은 차이 혹은 실수는 파이썬이 여러분이 작성한 프로그램을 보다가 포기하게 만듭니다. 초보 파이썬 프로그래머는 파이썬이 오류에 대해서는 인정사정볼 것 없다고 생각합니다. 파이썬이 모든 사람을 좋아하는 것 같지만, 파이썬은 사적으로 사 람들을 알고 있고, 뒤끝이 있습니다. 이러한 사실로 인해서 파이썬은 완벽하게 작성된 프로그램만을 가지게 되고 잘못 작성되었어요 라고 뱉어내고 여러분 에게 고통을 줍니다.
1.10. 프로그램이 잘못되면? 13 >>> primt 'Hello world!' File "<stdin>", line 1 primt 'Hello world!' ˆ SyntaxError: invalid syntax >>> primt 'Hello world' File "<stdin>", line 1 primt 'Hello world' ˆ SyntaxError: invalid syntax >>> I hate you Python! File "<stdin>", line 1 I hate you Python! ˆ SyntaxError: invalid syntax >>> if you come out of there, I would teach you a lesson File "<stdin>", line 1 if you come out of there, I would teach you a lesson ˆ SyntaxError: invalid syntax >>> 파이썬과 다퉈봐야 얻을 것은 없어요. 파이썬은 도구고 감정이 없습니다. 여러 분이 필요로 할 때마다 여러분에게 봉사하고 기쁨을 주기 위해서 존재할 뿐입니 다. 오류 메세지가 심하게 들릴지는 모르지만 단지 파이썬이 도와달라고 하는 요청일 뿐입니다. 여러분이 입력한 것을 쭉 읽어보고 여러분이 입력한 것을 이 해할 수 없다고만 말할 뿐입니다. 파이썬은 어떤면에서 강아지와 닮았습니다. 맹목적으로 여러분을 사랑하고, 강 아지가 이해하는 몇몇 단어만 이해하며, 웃는 표정(>>> 명령 프롬프트)으로 여 러분이 무언가를 말하기만을 기다립니다. 파이썬이 SyntaxError: invalid syntax 을 뱉어낼 때, 꼬리를 흔들면서 뭔가 말씀하시는 것 같은데요... 주인님 말 씀을 이해하지 못하겠어요, 다시 말씀해 주세요 (>>>) 말하는 것과 같다. 여러분이 작성하는 프로그램이 점점 유용해지고 복잡해짐에 따라 3가지 유형의 오류를 마주치게 된다. 구문 오류(Syntax Error): 첫번째 마주치는 오류로 고치기 가장 쉽습니다. 구문 오류는 파이썬의 문법에 맞지 않는다는 것을 의미합니다. 파이썬은 구문 오류가 발생한 줄을 찾아 정확한 위치를 알려줍니다. 하지만, 파이썬이 제시하는 오류가 그 이전 프로그램 부문에서 발생했을 수도 있기 때문에 파이썬이 알려주는 곳 뿐만 아니라 그 앞쪽도 살펴볼 필요가 있다. 따라서 파이썬이 제시하는 구문 오류의 경우 오류가 난 곳은 오류를 고치기 위한 시작점으로 의미가 있다. 논리 오류(Logic Error): 논리 오류는 프로그램의 구문은 완벽하지만 명령문 의 실행에 혹은 다른 명령어부분과 관련된 부문에서 실수가 있는 것이다. 논리 오류의 예를 들어보자. 물병에서 한모금 마시고, 가방에 넣고, 도서 관으로 걸어가서, 물병을 닫는다 시맨틱 오류(Semantic Error): 시맨틱 오류는 구문론적으로 완벽하고 올바른 순서로 프로그램의 명령문이 작성되었지만 프로그램에 오류가 숨어있다.
Chapter 1. 왜 프로그래밍을 배워야 하는가? 14 프로그램은 완벽하게 작동하지만 여러분이 의도한 바를 수행하지는 못합 니다. 간단한 예로 여러분이 식당으로 가는 방향을 알려주고 있습니다.... 주유소 사거리에 도착했을 때, 왼쪽으로 돌아 1.6km 쭉 가면 왼쪽편에 빨간색 빌딩에 식당이 있습니다. 친구가 매우 늦어 전화로 지금 농장에 있고 헛간으로 걸어가고 있는데 식당을 발견할 수 없다고 전화를 합니다. 그러면 여러분은 주유소 왼쪽 혹은 오른쪽을 돈거야 말하면, 그 친구 는 말한대로 완벽하게 따라서 했고, 말한대로 적기까지 했는데, 왼쪽으 로 돌아 1.6km에 주요소가 있다고 했어, 그러면 여러분은 미안해, 내가 가지고 있는 건 구문론적으로는 완벽한데, 사소한 시맨틱 오류가 있네! 라고 말할 것이다. 위 세 종류의 오류에 대해서 파이썬은 여러분이 요청한 것을 충실히 수행하기 위해서 최선을 다합니다. 1.11 학습으로의 여정 여러분이 책을 읽으면서 개념들이 처음에 잘 와 닿지 않는다고 기죽을 필요는 없어요. 여럽누이 말하는 것을 배울 때, 처음 몇년동안 웅얼거리는 것은 문제가 아닙니다. 간단한 어휘에서 간단한 문장으로 옮겨가고, 문장에서 문단으로 옮 겨가는데 6개월이 걸려도 괜찮습니다. 흥미로운 완벽한 짧은 스토리를 자신의 언어로 작성하는데 몇 년이 걸립니다. 여러분이 파이썬을 빨리 배울수 있도록 다음의 몇장에 걸쳐서 정보를 제공해 드릴 것입니다. 새로운 언어를 습득하는 것과 같아서 자연스럽게 느껴지기까지 흡수하고 이해하기까지 시간이 걸립니다. 큰 그림(Big Picture)을 이루는 작은 조각을 정의하면서 여러분을 큰 그림을 볼 수 있도록 여러 주제를 찾고, 또 찾 으면서 혼란이 생길 수 있다. 이책이 순차 선형적으로 쓰여져서 본 과정을 선 형적으로 배워갈 수도 있지만, 비선형적으로 본 교재를 활용하는 것도 괜찮다. 가볍게 앞쪽과 뒷쪽을 넘나들며 책을 읽을 수도 있다. 구체적이고 세세한 점을 완벽하게 이해하지 않고 고급 과정을 가볍게 읽으면서 프로그래밍의 왜(Why) 에 대해서 더 잘 이해할 수도 있다. 앞에서 배운것을 다시 리뷰하고 앞의 연습 문제를 다시 하면서 처음에 난공불락이라 여겼던 어려운 주제도 더잘 배우고 이해할 수 있다는 것을 알게될 것이다. 대체적으로 처음 프로그래밍 언어를 배울 때 망치로 돌을 내리치고, 끌로 깎아 내고 하면서 아름다운 조각품을 만들면서 겪게되는 몇 번의 유레카, 아 하 순간이 있다. 만약 어떤 것이 특별히 힘들다면, 밤새도록 앉아서 지켜보고 노력하는 것은 별 로 의미가 없다. 잠시 쉬고, 낮잠을 자고, 간식을 먹고 다른사람이나 강아지에게 문제를 설명하고 자문을 구한 후에 깨끗한 정신과 눈으로 돌아와서 다시 시도해 보라. 단언컨데 이책의 프로그래밍 개념을 배우자마자 정말 쉽고 멋지다는 것을 돌이켜 보면 알게될 것이다. 프로그래밍 언어는 정말 배울 가치가 있다.
1.12. 용어사전 15 1.12 용어사전 버그(bug): 프로그램 오류 중앙처리장치(central processing unit, CPU): 컴퓨터의 심장, 여러분이 작성 한 프로그램을 실행하는 장치, CPU 혹은 프로세서라고 불립니다. 컴파일러(compile): 하이레벨 언어로 작성된 프로그램을 로우레벨 언어로 즉시 혹은 나중에 사용하도록 번역하는 번역기 하이레벨 언어(high-level language): 사람이 읽고 쓰기 쉽게 설계된 파이썬과 같은 프로그래밍 언어 인터랙티브 모드(interactive mode): 프롬프트에서 명령어나 표현식을 입력함 으로써 파이썬 인터프리터를 사용하는 방식 인터프리트(interpret): 하이레벨 언어의 프로그램을 한번에 한줄씩 번형해서 실행하는 것 로우레벨 언어(low-level language): 컴퓨터가 실행하기 쉽게 설계된 프로그래 밍 언어, 기계어 코드, 어셈블리 언어 로 불린다. 기계어 코드(machine code): 중앙처리장치에 의해서 바로 실행될수 있는 가장 낮은 수준의 언어로된 소프트웨어 주메모리(main memory): 프로그램과 데이터를 저장한다. 전기가 나가게 되면 주메모리에 저장된 정보는 사라진다. 파싱(parse): 프로그램을 검사하고 구문론적 구조를 분석하는 것 이식(portability): 하나 이상의 컴퓨터에서 실행될 수 있는 프로그램의 특성 출력문(print statement): 파이썬 인터프리터가 화면에 값을 출력할 수 있게 만 드는 명령문 문제해결(problem solving:) 문제를 만들고, 답을 찾고, 답을 표현하는 과정 프로그램(program:) 컴퓨테이션(Computation)을 명세하는 명령어의 집합 프롬프트(prompt): 프로그램이 메세지를 출력하고 사용자가 프로그램에 입력 하도록 기다릴 때. 보조 기억장치 전기가 나갔을 때도 정보를 기억하고 프로그램을 저장하는 저 장소. 일반적으로 주메모리보다 속도가 느리다. USB의 플래쉬 메모리나 디스크 드라이브가 여기에 속한다. 시맨틱(semantics): 프로그램의 의미 시맨틱 오류(semantic error): 프로그래머가 의도한 것과 다른 행동을 하는 프 로그램의 오류 소스코드(source code): 하이레벨 언어로 기술된 프로그램
16 Chapter 1. 왜 프로그래밍을 배워야 하는가? 1.13 연습문 Exercise 1.1 컴퓨터 보조기억장치의 기능은 무엇입니까? a) 모든 연산과 프로그램의 로직을 수행한다. b) 인터넷의 웹페이지를 불러온다. c) 파워가 없을 때도 장시간 정보를 저장한다. d) 사용자로부터 입력정보를 받는다. Exercise 1.2 프로그램은 무엇입니까? Exercise 1.3 컴파일러와 인터프리터의 차이점을 설명하세요. Exercise 1.4 기계어 코드는 다음중 어는 것입니까? a) 파이썬 인터프리터 b) 키보드 c) 파이썬 소스코드 파일 d) 워드 프로세싱 문서 Exercise 1.5 다음 코드에서 잘못된 점을 설명하세요. >>> primt 'Hello world!' File "<stdin>", line 1 primt 'Hello world!' ˆ SyntaxError: invalid syntax >>> Exercise 1.6 다음의 파이썬 프로그램이 실행된 후에 변수 X 는 어디에 저장 됩니까? x = 123 a) 중앙처리장치 b) 주메모리 c) 보조메모리 d) 입력장치 e) 출력장치 Exercise 1.7 다음 프로그램에서 출력되는 것은 무엇입니까? x = 43 x = x + 1 print x a) 43 b) 44 c) x + 1 d) 오류, 왜냐하면 x = x + 1 은 수학적으로 불가능하다.
1.13. 연습문 17 Exercise 1.8 사람의 어느 능력부위에 해당하는지 예로하여 다음을 설명하세 요. (1) 중앙처리장치, (2) 주메모리, (3) 보조메모리, (4) 입력장치 (5) 출력장치 중앙처리장치에 상응하는 사람의 몸 부위는 어디입니까? Exercise 1.9 구문오류( Syntax Error )는 어떻게 고칩니까?
18 Chapter 1. 왜프로그래밍을배워야하는가?
Chapter 2 변수, 표현식, 스테이트먼트 (Statement) 2.1 값(Value)과 형식(Type) 값(Value)는 문자와 숫자처럼 프로그램이 다루는 가장 기본이되는 단위이다. 우리가 지금까지 살펴본 값은 1,2 그리고 'Hello,World!' ('안녕 세상!') 이다. 이들 값들은 다른 형식에 속해있는데, 2는 정수, 'Hello,World!' ('안녕 세 상!') 는 문자열(String)에 속해있다. 문자(Letter)의 열에 있어서 문자열이라고 부른다. 여러분과 인터프리터는 문자열을 확인할 수 있는데 이유는 인용부호 따옴표에 쌓여있기 때문이다. print 문은 정수에도 사용할 수 있다. python 명령어를 실행하여 인터프리터 를 구동시키자. python >>> print 4 4 값의 형식을 확신을 못한다면, 인터프리터가 알려준다. >>> type('hello, World!') <type 'str'> >>> type(17) <type 'int'> 놀랍지도 않게, strings은 str 형식이고, 정수는 int 형식이다. 소숫점을 가진 숫자는 float 형식이다. 왜냐하면 이들 숫자가 부동소수점 형식으로 표현되기 때문이다. >>> type(3.2) <type 'float'>
20 Chapter 2. 변수, 표현식, 스테이트먼트(Statement) '17', '3.2' 같은 값은 어떨가? 문자처럼 보이지만 문자처럼 따옴표안에 쌓여 있다. >>> type('17') <type 'str'> >>> type('3.2') <type 'str'> '17', '3.2' 은 문자열이다. 아주 큰 정수를 입력할, 1,000,000 처럼 세자리 숫자마다 콤마(,)를 입력한다. 하지만, 파이썬에서 적법한 정수는 아니지만 적법하다. >>> print 1,000,000 1 0 0 하지만, 파이썬이 뱉은 값은 우리가 기대했던 것이 아니다. 파이썬은 1,000,000 을 콤마로 구분된 정수로 인식한다. 따라서 사이 사이 공백을 넣어 출력했다. 이 사례가 여러분이 처음 경험하게 되는 시맨틱 오류이다. 코드가 에러 메세지 없이 실행이되지만, 올바르게(right) 작동을 하는 것은 아니다. 2.2 변수(Variable) 프로그래밍 언어의 가장 강력한 기능중의 하나는 변수를 다룰 수 있는 능력이다. 변수(Variable)는 값을 참조할 수 있는 이름이다. 할당 스테이스먼트(Assignment statement)는 새로운 변수를 생성하고 값을 준다. >>> message = 'And now for something completely different' >>> n = 17 >>> pi = 3.1415926535897931 위의 예제는 세개의 할당을 보여준다. 첫번째 할당의 예제는 message 변수에 문 자열을 할당한다. 두번째 예제는 변수 n에 정수 17을 할당한다. 세번째 예제는 pi변수에 π 근사값을 할당하는 경우이다. 변수의 값을 출력하기 위해서 print 스테이트먼트를 사용한다. >>> print n 17 >>> print pi 3.14159265359 변수의 형식은 변수가 참조하는 값의 형식이다. >>> type(message) <type 'str'> >>> type(n) <type 'int'> >>> type(pi) <type 'float'>
2.3. 변수명(Variable name)과 예약어(keywords) 2.3 21 변수명(Variable name)과 예약어(keywords) 대체로 프로그래머는 의미있는 변수명을 고른다. 프로그래머는 변수가 어디에 사용되는지를 문서화도 한다. 변수명은 임의로 길 수 있다. 변수명은 문자와 숫자를 포함할 수 있지만, 통상 문자로 시작한다. 대문자를 사용하는 것도 적합하지만 소문자로 시작하는 변수 명으로 시작하는 것도 좋은 생각이다. (후에 왜 그런지 보게될 것이다.) 변수명에 밑줄(underscore character, _)이 들어갈 수 있다. 밑줄은 my_name 혹은 airspeed_of_unladen_swallow 처럼 여러 단어와 함께 사용된다. 적합하지 못한 변수명을 사용하면, 구문 오류를 보게된다. >>> 76trombones = 'big parade' SyntaxError: invalid syntax >>> more@ = 1000000 SyntaxError: invalid syntax >>> class = 'Advanced Theoretical Zymurgy' SyntaxError: invalid syntax 76trombones 변수명은 문자로 시작하지 않아서 적합하지 않다. more@는 특수 문자 (@)를 변수명에 포함해서 적합하지 않다. class 변수명은 뭐가 잘못된 것 일까? class는 파이썬의 예약어 중의 하나이다. 인터프리터는 예약어를 프로그램 구 조를 파악하기 위해서 사용하고 변수명으로는 사용할 수 없다. 파이썬의 31개의 키워드1 를 예약어로 이미 가지고 있다. and as assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while with yield 여러분은 예약어 목록을 잘 가지고 다니고 싶을 것입니다. 인터프리터가 변수명 중에서 불평하고 이유를 모를 경우 예약어 목록에 있는지 확인해 보세요. 2.4 스테이트먼트(Statement) 스테이트먼트(statement)는 파이썬 인터프리터가 실행하는 코드의 단위입니 다. print, assignment 두 종류의 스테이트먼트를 봤습니다. 인터랙트브 모드에서 스테이트먼트를 입력할 때, 만약 한줄이면 인터프리터는 스테이트먼트를 실행하고 결과를 출력합니다. 1 In Python 3.0, exec is no longer a keyword, but nonlocal is.
Chapter 2. 변수, 표현식, 스테이트먼트(Statement) 22 스크립트는 보통 여러줄의 스테이트먼트로 구성됩니다. 하나 이상의 스테이트 먼트가 있다면, 스트테이트먼트가 실행되며 결과가 한번에 나타납니다. 예를 들어, 다음의 스크립트를 생각해 봅시다. print 1 x = 2 print x 위 스크립트는 다음의 결과를 출력합니다. 1 2 할당 스테이트먼트(x=2)는 결과를 출력하지 않습니다. 2.5 연산자(Operator)와 피연산자(Operands) 연산자(Operators)는 덧셈과 곱셈 같은 연산(Computation)을 표현하는 특별한 기호입니다. 연산가자 적용되는 값을 피연산자(operands)라고 합니다. 다음의 예제에서 보듯이, +, -, *, /, ** 연산자는 덧셈, 뺄셈, 곱셈, 나눗셈, 누승을 수행합니다. 20+32 hour-1 hour*60+minute minute/60 5**2 (5+9)*(15-7) 나눗셈 연산자는 여러분이 기대하는 행동을 하지 않을 수도 있습니다. >>> minute = 59 >>> minute/60 0 minute 값은 59, 보통 59를 60으로 나누면 0 대신에 0.98333 입니다. 이런 차이가 발생하는 이유는 파이썬이 부동 소숫점 나눗셈을 하기 때문입니다. 두 개의 피연산자가 정수이면, 결과도 정수입니다. 부동 소수점 나눗셈2 은 소수 점 이하를 절사해서 이 예제에서는 소수점이하 잘라버려 0 이 됩니다. >>> minute/60.0 0.98333333333333328 2.6 (표현)식(Expression) (표현)식 (expression)은 값, 변수, 연산자의 조합니다. 값은 자체로 표현식이고, 변수도 동일합니다. 따라서 다음의 표현식은 모두 적합합니다. (변수 x에 사전에 어떤 값이 할당되었다고 가정하고) 2 파이썬 3.0 에서 이 나눗셈의 값은 소수점입니다. 파이썬 3.0 에서 새로운 연산자//는 정수 나눗셈을 수행합니다.
2.7. 연산자 적용 우선순위 (Order of Operations) 23 17 x x + 17 인터랙티브 모드에서 표현식을 입력하면, 인터프리터는 표현식을 평가(evaluate)하고 값을 표시합니다. >>> 1 + 1 2 하지만, 스크립트에서는 표현식 자체로 어떠한 것도 수행하지는 않습니다. 초 심자에게 혼란스러운점입니다. Exercise 2.1 파이썬 인터프리터에 다음의 스테이트먼트를 입력하고 결과를 보 세요. 5 x = 5 x + 1 2.7 연산자 적용 우선순위 (Order of Operations) 1개 이상의 연산자가 표현식에 등장할때 연산자 실행의 순서는 순위 규칙(rules of precedence)에 따른다. 수학 연산자에 대해서 파이썬은 수학의 관례를 동일 하게 따른다. 영어 두문어 PEMDAS는 기억하기 좋은 방식이다. 괄호(Parentheses)는 가장 높은 순위를 가지고 여러분이 원하는 순위에 맞춰 실행할 때 사용한다. 괄호안에 있는 식이 먼저 실행되기 때문에 2 * (3-1) 은 4가 정답이고, (1+1)**(5-2)는 8이다. 괄호를 표현식을 읽 기 쉽게하려고 사용하기도 한다. (minute * 100) / 60 는 실행순서가 결과값에 영향을 주지 않지만 가독성이 상대적으로 좋다. 멱승(Exponentiation)이 다음으로 높은 우선순위를 가진다. 그래서 2**1+1는 4가 아니라 3이고, 3*1**3는 27이 아니고 3이다. 곱셈(Multiplication)과 나눗셈(Division)은 덧셈(Addition), 뺄셈(Substraction)보다 높은 우선 순위를 가지고 같은 실행의 순위를 갖는다. 2*3-1는 4가 아니고 5이고, 6+4/2는 5가 아니라 8이다. 같은 실행의 순위를 갖는 연산자는 왼쪽에서 오른쪽으로 실행된다. 5-3-1 표현식은 3이 아니고 1이다. 왜냐하면 5-3이 먼저 실행되고 나서 2에서 1 을 빼기 때문이다. 여러분이 의도한 순서대로 연산이 일어날수 있도록 좀 의심스러운 경우는 괄호 를 사용하세요.
Chapter 2. 변수, 표현식, 스테이트먼트(Statement) 24 2.8 나머지 연산자 (Modulus Operator) 나머지 연산자(modulus operator)는 정수에 사용하며, 첫번째 피연산자가 두번 째 피연산자로 나눌 때 나머지 값을 만들어 냅니다. 파이썬에서 나머지 연산자는 퍼센트 기호(%)입니다. 구문은 다른 연산자와 동일합니다. >>> >>> 2 >>> >>> 1 quotient = 7 / 3 print quotient remainder = 7 % 3 print remainder 7을 3으로 나누면 2가 되고 1을 나머지로 갖게됩니다. 나머지 연산자가 놀랍도록 유용합니다. 예를 들어 한 숫자가 다른 숫자로 나눌 수 있는지 없는지를 확인할 수도 있습니다. x % y가 0이라면 x는 y로 나눌 수 있습니다. 또한, 숫자로부터 가장 오른쪽의 숫자를 분리하는데 사용할 수도 있습니다. 예 를 들어 x % 10 은 x의 10진수인 경우 가장 오른쪽 숫자를 뽑아낼 수 있고, 동일 하게 x % 100은 가장 오른쪽 2개 숫자를 뽑아낼 수도 있습니다. 2.9 문자열 연산자 (String Operator) + 연산자는 문자열에도 사용할 수 있지만, 수학에서의 덧셈의 의미는 아닙니다. 대신에 문자열의 끝과 끝을 연결하여 접합(concatenation)을 수행합니다. 예를 들어 >>> first = 10 >>> second = 15 >>> print first+second 25 >>> first = '100' >>> second = '150' >>> print first + second 100150 이 프로그램의 출력은 100150 입니다. 2.10 사용자에게서 입력값 받기 때때로 키보드를 통해서 사용자에게서 변수에 대한 값을 받고 싶을 때가 있습 니다. 키보드3 로부터 입력값을 받을 수 있는 raw_input 이라는 빌트인(built-in) 함수를 파이썬은 제공합니다. 이 함수가 실행될 때 파이썬은 실행을 멈추고 사 용자로부터 입력 받기를 기다립니다. 사용자가 Return 혹은 엔터를 누르게되면 3 파이썬 3.0에서 이 함수는 input으로 명명되었습니다.
2.11. 주석(Comment) 25 프로그램은 다시 실행되고 raw_input은 사용자가 입력한 값을 문자열로 반환 합니다. >>> input = raw_input() Some silly stuff >>> print input Some silly stuff 사용자로부터 입력을 받기 전에 프롬프트에서 사용자에게 어떤 값을 입력해 야하는지 출력하는 것도 좋은 생각이다. 입력값을 위해 잠시 멈춰있기 전에 raw_input 함수에 출력될 문자열에 대한 정보를 사용자에게 전달하는 것이다. >>> name = raw_input('what is your name?\n') What is your name? Chuck >>> print name Chuck 프롬프트의 끝에 \n 은 새줄(newline)을 의미합니다. 새줄은 줄을 바꾸게 하는 특수 문자입니다. 이런 이유 때문에 사용자의 입력이 프롬프트 밑에 출력이 됩 니다. 만약 사용자가 정수를 입력하기를 바란다면, int()함수를 사용하여 반환되는 값을 정수(int)로 형변환할 수 있습니다. >>> prompt = 'What...is the airspeed velocity of an unladen swallow?\n' >>> speed = raw_input(prompt) What...is the airspeed velocity of an unladen swallow? 17 >>> int(speed) 17 >>> int(speed) + 5 22 하지만, 사용자가 숫자 문자열이 아닌 다른 것을 입력하게 되면 오류가 발생합 니다. >>> speed = raw_input(prompt) What...is the airspeed velocity of an unladen swallow? What do you mean, an African or a European swallow? >>> int(speed) ValueError: invalid literal for int() 이런 종류의 오류를 나중에 더 만나게 될 것입니다. 2.11 주석(Comment) 프로그램이 커지고 복잡해짐에 따라 읽기는 점점 어려워집니다. 형식언어로 촘 촘하고 코드의 일부분을 읽기 어렵고 무슨 역할을 왜 수행하는지 이해하기 어 렵습니다.
Chapter 2. 변수, 표현식, 스테이트먼트(Statement) 26 이런 이유로 프로그램이 무엇을 하는지를 일반적인 언어로 프로그램에 노트를 달아놓는게 좋은 습관입니다. 이러한 노트를 주석(Comments)라고 하고 # 기호 로 시작합니다. # 경과한 시간의 퍼센트를 계산 percentage = (minute * 100) / 60 이 경우, 주석 자체가 한줄이다. 주석을 프로그램의 뒤에 놓을 수도 있다. percentage = (minute * 100) / 60 # 경과한 시간의 퍼센트를 계산 # 뒤의 모든 것은 무시되기 때문에 프로그램에는 아무런 영향이 없습니다. 주석 은 코드의 명확하지 않은 점을 문서화할 때 가장 유용합니다. 프로그램을 읽는 사람이 코드가 무엇 을 하는지 이해할 수 있다고 가정하는 것은 그럴 듯합니다. 왜 그런지를 설명하는 것은 더더욱 유용합니다. 다음의 주석은 코드와 중복으로 쓸모가 없습니다. v = 5 # assign 5 to v 다음의 주석은 코드에 없는 유용한 정보가 있습니다. v = 5 # velocity in meters/second. 좋은 변수명은 주석을 할 필요를 없게 만들지만, 지나치게 긴 변수명은 읽기 어 려운 복잡한 표현식이 될 수도 있기 때문에 상충관계(trade-off)가 존재합니다. 2.12 기억하기 쉬운 변수명 만들기 변수를 이름 짓는 간단한 규칙을 따르고, 예약어를 피하기만 하면 변수를 이름지 을 수 있는 무척이나 많은 경우의 수가 존재합니다. 처음에 이러한 선택의 폭이 프로그램을 읽는 사람이나 프로그램을 작성하는 사람 모두에게 혼란스러울 수 있습니다. 예를 들어, 다음의 3개 프로그램은 수행하는 것이 동일하다는 점에서 동일하지만 여러분이 읽고 이해하는데는 많은 차이점이 있습니다. a = 35.0 b = 12.50 c = a * b print c hours = 35.0 rate = 12.50 pay = hours * rate print pay x1q3z9ahd = 35.0 x1q3z9afd = 12.50 x1q3p9afd = x1q3z9ahd * x1q3z9afd print x1q3p9afd 파이썬 인터프리터는 이들 3개 프로그램을 정확하게 동일하게 바라보지만, 사 람은 이들 프로그램을 매우 다르게 바라보고 이해하게 됩니다. 사람은 가장 빨리
2.12. 기억하기 쉬운 변수명 만들기 27 두번째 프로그램의 의도를 알아차립니다. 왜냐하면 프로그래머가 변수에 저장 되는 값에 관계없이 프로그래머의 의도를 나타내는 변수명을 사용했기 때문입 니다. 현명하게 선택된 변수명을 기억하기 쉬운 변수명( mnemonic variable name ) 이라고 합니다. 기억하기 좋은 영어 단어 mnemonic 4 은 기억을 돕는다는 뜻입 니다. 왜 변수를 생성했는지 기억하기 좋게 하기 위해서 기억하기 좋은 변수명을 선택합니다. 매우 훌륭하게 들리고, 기억하기 좋은 변수명을 만드는게 좋은 아이디어 같지 만, 기억하기 좋은 변수명은 초보 프로그래머가 코드를 파싱하고 이해하는데 걸림돌이 되기도 한다. 왜냐하면 31개의 예약어도 기억하지 못하고 때때로 너 무 서술적인 이름의 변수가 마치 우리가 일반적으로 사용하는 언어처럼 보여 잘 선택된 변수명처럼 보이지 않기 때문이다. 어떤 데이터를 반복하는 다음의 파이썬 코드를 살펴보자. 여러분은 곧 반복 루 프를 보지만 이것이 무엇을 의미하는지 알기 위해서 퍼즐을 풀기시작할 것이다. for word in words: print word 무엇이 일어나고 있는 것일까요? for, word, in 등등 어느 것이 예약어일까요? 변수명은 무엇일까요? 파이썬이 기본적으로 단어의 개념을 이해할까요? 초보 프로그래머는 어떤 부분의 코드가 이 예제와 동일해야 하는지와 단지 프로그래 머의 선택에 의한 부분이 코드의 어느부분인지 분간하는데 애를 먹는다. 다음의 코드는 위의 코드와 동일하다. for slice in pizza: print slice 초보 프로그래머가 이 코드를 보고 어떤 부분이 파이썬의 예약어이고 어느 부분 이 프로그래머가 선택한 변수명인지 알 수 있다. 파이썬이 피자와 피자조각에 대한 근본적인 이해가 없고 피자는 하나 혹은 여러 조각으로 구성된다는 근본 적인 사실을 알지 못한다. 하지만, 여러분의 프로그램이 데이터를 읽고 데이터의 단어를 찾는다면 피자 (pizza)와 피자조각(slice)은 기억하기 좋은 변수명이 아니다. 이들 변수명 은 프로그램의 의미를 왜곡시킬 수 있다. 좀 시간을 보낸 후에 흔한 예약어에 대해서 알게될 것이고 이들 예약어가 여러 분에게 눈에 띄게 될 것이다. for word in words: print word for, in, print, :은 파이썬에서 정의된 예약어로 굵게 표시되어 있고, 프로그 래머가 생성한 word, words는 굵게 표시되어 있지 않다. 많은 텍스트 에디터는 파이썬의 구문을 알고 있고 파이썬 예약어와 프로그래머의 변수를 구분하기 위 해서 다른 색까로 구분지어준다. 잠시 후에 여러분은 이제 파이썬을 읽고 변수와 예약어에 대해서 빨리 구분할 수 있을 것이다. 4 http://en.wikipedia.org/wiki/mnemonic.
28 Chapter 2. 변수, 표현식, 스테이트먼트(Statement) 2.13 디버깅(Debugging) 이 지점에서 여러분이 만들 것 같은 구문 오류는 odd job, US$ 같은 특수문자 를 포함한 잘못된 변수명과 class, yield같은 예약어를 변수명으로 사용하는 것이다. 변수명에 공백을 넣는다면, 파이썬은 연산자 없이 두 개의 피연산자로 생각합 니다. >>> bad name = 5 SyntaxError: invalid syntax 구문 오류에 대해서, 구문오류 메세지는 그다지 도움이 되지 못합니다. 가장 흔한 오류 메세지는 SyntaxError: invalid syntax, SyntaxError: invalid token인데 둘다 그다지 도움이 되지 못합니다. 여러분이 많이 만드는 실행 오류는 정의전에 사용( use before def )하는 것으로 변수에 값을 할당하기 전에 변수를 사용할 경우 발생합니다. 여러분이 변수명을 쓸 때도 발생할 수 있습니다. >>> principal = 327.68 >>> interest = principle * rate NameError: name 'principle' is not defined 변수명은 대소문자를 구분합니다. LaTeX는 latex와 같지 않습니다. 이 지점에서 여러분이 저지르기 쉬운 구문 오류는 연산자의 우선 순위일 것입 1 를 계산하기 위해서 다음과 같이 프로그램을 작성하게 되면 니다. 예를 들어 2π... >>> 1.0 / 2.0 * pi 나눗셈이 먼저 일어나서 π/2를 같은 것이 아닙니다. 파이썬이 여러분이 쓴 의 도를 알게할 수는 없습니다. 그래서 이런 경우 오류 메세지를 얻지는 않지만 잘못된 답을 여러분은 얻게 될 것입니다. 2.14 용어 설명 할당(assignment): 변수에 값을 할당하는 스테이트먼트 결합(concatenate): 두 개의 피연산자 끝과 끝을 합치는 것 주석(comment): 다른 프로그래머나 소스코드를 읽는 다른 사람을 위한 프로그 램의 정보로 프로그램의 실행에는 아무런 영향이 없다. 평가(evaluate): 하나의 값을 만들도록 연산을 실행함으로써 표현식을 간단히 하는 것 (표현)식(expression): 하나의 결과값을 만드는 변수, 연산자, 값의 조합 부동 소수점(floating-point): 분수를 가진 숫자를 표현하는 방식
2.15. 연습문제 29 플로어 나눗셈(floor division) 두 숫자를 나누어 소수점이하 부분을 절사하는 연산자 정수(integer): 완전수를 나타내는 형식 예약어(keyword): 프로그램을 파싱하는 컴파일러가 사용하는 이미 예약된 단 어; if, def, while 같은 예약어를 변수명으로 사용할 수 없다. 니모닉(mnemonic): 기억 보조, 변수에 저장된 것을 기억하기 좋게 변수에 니 모닉 이름을 부여한다. 나머지 연산자(modulus operator): 퍼센트 기호 (%) 로 표시되고 정수를 가지 고 한 숫자를 다른 숫자로 나누었을 때 나머지 피연산자(operand): 연산자가 연산을 수행하는 값의 하나 연산자(operator): 덧셈, 곱셈, 문자열 결합 같은 간단한 연산을 나타내는 특별 기호 순위 규칙(rules of precedence): 여러 개의 연산자와 피연산자를 포함한 표현 식이 평가되는 실행 순서를 정한 규칙 집합 스테이트먼트(statement): 명령이나 액션을 나타내는 코드 부문. 지금까지 assignment, print 스테이트먼트를 보았습니다. 문자열(string): 일련의 문자를 나타내는 형식 형(type): 값의 범주. 지금까지 여러분이 살펴본 형은 정수 (type int), 부동 소 수점수 (type float), 문자열 (type str) 입니다. 값(value): 프로그램이 다루는 숫자나 문자 같은 데이터의 기본 단위중 하나 변수(variable): 값을 참조하는 이름 2.15 연습문제 Exercise 2.2 raw_input을 사용하여 사용자의 이름을 입력받고 환영하는 프로 그램을 작성하세요. Enter your name: Chuck Hello Chuck Exercise 2.3 급여를 지불하기 위해서 사용자로부터 근로시간과 시간당 임금을 계산하는 프로그램을 작성하세요. Enter Hours: 35 Enter Rate: 2.75 Pay: 96.25
Chapter 2. 변수, 표현식, 스테이트먼트(Statement) 30 지금은 급여가 정확하게 소수점 두자리까지 표현되지 않아도 된다. 만약 원하 다면, 파이썬의 빌트인 round 함수를 사용하여 소수점 아래 두자리까지 반올림 하여 작성할 수 있다. Exercise 2.4 다음 할당 스테이트먼트를 실행한다고 합시다. width = 17 height = 12.0 다음 표현식에 대해서 표현식의 값과 표현식의 값의 형을 작성하세요. 1. width/2 2. width/2.0 3. height/3 4. 1 + 2 * 5 정답을 확인하기 위해서 파이썬 인터프리터를 사용하세요. Exercise 2.5 사용자에게서 섭시 온도를 입력받아 화씨온도롤 변환하고 변환된 온도를 출력하는 프로그램을 작성하세요.
Chapter 3 조건부 실행 불 연산식(Boolean expressions) 3.1 불 연산식(boolean expression)은 참(True) 혹은 거짓(False)를 가진 연산 표현식 이다. 다음 예제는 == 연산자를 사용하는데 두개의 피연산자를 비교하여 값이 동일하면 참(True), 그렇지 않으면 거짓(False)을 출력한다. >>> 5 == 5 True >>> 5 == 6 False 참(True)과 거짓(False)은 불(bool)형식에 속하는 특별한 값들이고, 문자열 은 아니다. >>> type(true) <type 'bool'> >>> type(false) <type 'bool'> ==연산자는 비교(comparison operators) 연산자 중의 하나이고, 다른 연산자는 다음과 같다. x x x x x x x!= y > y < y >= y <= y is y is not y # # # # # # # x는 x는 x는 x는 x는 x는 x는 y와 값이 같지 않다. y보다 크다. y보다 작다. y보다 크거나 같다. y보다 작거나 같다. y와 같다. y와 개체가 동일하지 않다. 여러분에게 이들 연산자가 친숙할지 모르지만, 파이썬 기호는 수학 기호와는 다 르다. 일반적인 오류에는 비교의 같다의 의미로 == 연산자 대신에 =를 사용하는 것이다. = 연산자는 할당 연산자이고, ==연산자는 비교 연산자이다. =<, => 비교 연산자는 파이썬에는 없다.
Chapter 3. 조건부 실행 32 3.2 논리 연산자 3개의 논리 연산자(logical operators): and, or, not가 있다. 논리 연산자 의미는 영어 의미와 유사하다. 예를 들어, x > 0 and x < 10 x이 0 보다 크다. 그리고(and), 10 보다 작으면 참이다. n%2 == 0 or n%3 == 0은 두 조건문 중의 하나만 참이되면, 즉, 숫자가 2 혹은 (or) 3으로 나누어진다면 참이다. 마지막으로 not 연산자는 불 연산 표현을 부정한다. x > y이 거짓이면, not (x > y)은 참이다. 즉, x이 y 보다 작거나 같으면 참이다. 엄밀히 말해서, 논리 연산자의 두 피연산자는 모두 불 연산 표현이여야 하지만, 파이썬은 그렇게 엄격하지는 않는다. 어떤 0이 아닌 숫자 모두 true 로 해석 된다. >>> 17 and True True 이러한 유연함이 유용할 수 있으나, 혼란을 줄 수도 있으니 유의해서 사용해야 됩니다. 무슨 일을 하고 있는지 정확하게 알지 못한다면 피하는게 좋습니다. 3.3 조건문 실행 유용한 프로그램을 작성하기 위해서는 조건을 확인하고 조건에 따라 프로그램 의 실행을 바꿀 수 있어야 한다. 조건문(Conditional statements)은 그럴 수 있는 능력을 부여한다. 가장 간단한 형태는 if 문이다. if x > 0 : print 'x is positive' if문 뒤에 불 연산 표현문을 조건(condition)이라고 한다. x>0 no yes print 'x is positive' 만약 조건문이 참이면, 들여쓰기 된 스테이트먼트가 실행된다. 만약 조건문이 거짓이면, 들여쓰기 된 스테이트먼트의 실행을 생략한다.
3.4. 대안 실행 33 if문은 함수 정의나 for 반복문과 동일한 구조를 가진다. if문은 콜론(:)으로 끝나는 헤더 머리부문과 들여쓰기 블록으로 구성된다. if문과 같은 구문을 한 줄 이상에 걸쳐 작성되기 때문에 복합문(compound statements)이라고 한다. if문 본문에 실행 명령문의 제한은 없으나 최소한 한 줄은 있어야 한다. 때때 로, 본문에 하나의 실행명령문이 없는 경우가 있다. 아직 코드를 작성하지 않고 자리를 잡아 놓는 경우로, 아무것도 수행하지 않는 pass문을 사용할 수 있다. if x < 0 : pass # 음수값을 처리 예정! if문을 파이썬 인터프리터에서 타이핑하고 엔터를 치게 되면 명령 프롬프트가 갈매기 세마리에서 점 세개로 바뀌어 본문을 작성중에 있다는 것을 다음과 같이 보여줍니다. >>> x = 3 >>> if x < 10:... print 'Small'... Small >>> 3.4 대안 실행 if문의 두 번째 형태는 대안 실행(alternative execution)으로 두 가지 경우의 수가 존재하고, 조건이 어느 방향인지를 결정한다. 구문(Syntax)은 아래와 같다. if x%2 == 0 : print 'x is even' else : print 'x is odd' x가 2로 나누었을 때, 0이되면, x는 짝수이고, 프로그램은 짝수 결과 메시지를 출력한다. 만약 조건이 거짓이라면, 두 번째 명령문 블록이 실행된다. no print 'x is odd' x%2 == 0 yes print 'x is even' 조건은 참 혹은 거짓이서, 대안 중 하나만 정확하게 실행될 것이다. 대안을 분기 (Branch)라고도 하는데 이유는 실행 흐름의 분기가 되기 때문이다.
Chapter 3. 조건부 실행 34 3.5 연쇄 조건문 때때로, 두 가지 이상의 경우의 수가 있으며, 두 가지 이상의 분기가 필요하다. 이 같은 연산을 표현하는 방법이 연쇄 조건문(chained conditional)이다. if x < y: print 'x is less than y' elif x > y: print 'x is greater than y' else: print 'x and y are equal' elif는 else if 의 축약어이다. 이번에도 단 한번의 분기만 실행된다. x<y x>y yes yes print 'less' print 'greater' print 'equal' elif문의 갯수에 제한은 없다. else문이 있다면, 거기서 끝마쳐야 하지만, 연쇄 조건문에 필히 있어야 하는 것은 아니다. if choice == 'a': print 'Bad guess' elif choice == 'b': print 'Good guess' elif choice == 'c': print 'Close, but not correct' 각 조건은 순서대로 점검한다. 만약 첫 번째가 거짓이면, 다음을 점검하고 계속 점검해 나간다. 순서대로 진행 주에 하나의 조건이 참이면, 해당 분기가 수행되 고, if문 전체는 종료된다. 설사 하나 이상의 조건이 참이라고 하더라도, 첫 번째 참 분기만 수행된다. 3.6 중첩 조건문 하나의 조건문이 조건문 내부에 중첨될 수도 있다. 다음처럼 삼분 예제를 작성할 수 있다.
3.7. try와 catch를 활용한 예외 처리 35 if x == y: print 'x and y are equal' else: if x < y: print 'x is less than y' else: print 'x is greater than y' 바깥 조건문에 두 개의 분기가 있다. 첫 분기는 간단한 명령 실행문을 담고 있다. 두 번째 분기는 자체가 두 개의 분기를 가지고 있는 또 다른 if문을 담고 있다. 자체로 둘다 조건문이지만, 두 분기 모두 간단한 실행 명령문이다. yes x == y no yes print 'equal' x<y print 'less' no print 'greater' 명령문 블록을 들여쓰는 것이 구조를 명확히 하지만, 중첩 조건문의 경우 가독 성이 급격히 저하된다. 일반적으로, 가능하면 중첩 조건문을 피하는 것을 권장 한다. 논리 연산자를 사용하여 중첩 조건문을 간략히 할 수 있다. 예를 들어, 단일 조 건문으로 가지고 앞의 코드를 다시 작성할 수 있다. if 0 < x: if x < 10: print 'x is a positive single-digit number.' print문은 두개의 조건문이 통과될 때만 실행돼서, and 연산자와 동일한 효과 를 거둘 수 있다. if 0 < x and x < 10: print 'x is a positive single-digit number.' 3.7 try와 catch를 활용한 예외 처리 앞에서 사용자가 타이핑한 것을 읽어 정수로 파싱하기 위해서 함수 raw_input 와 int을 사용한 프로그램 코드를 살펴 보았다. 또한 이렇게 하는 코딩하는 것이 얼마나 위험한 것인지도 살펴보았다.
36 Chapter 3. 조건부 실행 >>> speed = raw_input(prompt) What...is the airspeed velocity of an unladen swallow? What do you mean, an African or a European swallow? >>> int(speed) ValueError: invalid literal for int() >>> 파이썬 인터프리터에서 상기 명령문을 실행할 때, 이런 잠시 있다가 다음 명령 실행문으로 넘어가는 새로운 명령 프롬프트를 보게 된다. 하지만, 코드가 파이썬 스크립트로 실행이 되면 오류가 발생하고 즉시, 그 지점 에서 멈추게 된다. 다음의 명령 실행문은 실행하지 않는다. 화씨 온도를 섭씨 온도로 변환하는 간단한 프로그램이 있다. inp = raw_input('enter Fahrenheit Temperature:') fahr = float(inp) cel = (fahr - 32.0) * 5.0 / 9.0 print cel 이 코드를 실행하고 적절하지 않은 입력값을 타이핑하게되면, 다소 불친절한 오류 메시지와 함께 작동을 멈춘다. python fahren.py Enter Fahrenheit Temperature:72 22.2222222222 python fahren.py Enter Fahrenheit Temperature:fred Traceback (most recent call last): File "fahren.py", line 2, in <module> fahr = float(inp) ValueError: invalid literal for float(): fred 이런 종류의 예측되거나, 예측 못한 오류를 다루는 try / except 로 불리는 조건 실행 구조가 파이썬에 내장되어 있다. try와 except의 기본 사항은 일부 명령 문이 문제를 가 있다는 것을 사전에 알고 있고, 만약 그 때문에 오류가 발생하게 된다면 대신 실행할 명령문을 프로그램에 추가하는 것이다. except 블록의 명 령문은 오류가 없다면 실행되지 않는다. 파이썬의 try, except 기능을 프로그램 코드의 실행에 보험을 든다고 생각할 수 있다. 온도 변환기 프로그램을 다음과 같이 다시 작성할 수 있다. inp = raw_input('enter Fahrenheit Temperature:') try: fahr = float(inp) cel = (fahr - 32.0) * 5.0 / 9.0 print cel except: print 'Please enter a number' 파이썬은 try 블록의 명령문을 우선 실행합니다. 만약 모든 것이 순조롭다면, except 블록을 건너뛰고, 다음 코드를 실행합니다.
3.8. 논리 연산식의 단락(Short circuit) 평가 37 except이 try 블록에서 발생하면, 파이썬은 try블록을 건너뛰고 except블록 의 명령문을 수행합니다. python fahren2.py Enter Fahrenheit Temperature:72 22.2222222222 python fahren2.py Enter Fahrenheit Temperature:fred Please enter a number try문으로 예외사항을 다루는 것을 예외 처리한다catching an exception고 부 릅니다. 예제에서는 except 절에서는 단순히 오류 메시지를 출력만 합니다. 대 체로, 예외 처리는 오류를 고치거나, 다시 시작하거나, 최소한 프로그램이 정상 적으로 종료될 수 있게 합니다. 3.8 논리 연산식의 단락(Short circuit) 평가 파이썬이 x >= 2 and (x/y) > 2와 같은 논리 연산식을 처리할 때, 왼쪽에 서부터 오른쪽으로 연산식을 평가한다. and의 정의 때문에 x이 2보다 작다 면, x >= 2은 거짓(False)이 되서, 전체는 (x/y) > 2이 참(True) 혹은 거짓 (False)에 관계없이 거짓(False)이 된다. 파이썬이 논리 연산식의 나머지 부 분을 평가해도 나아지는 것이 없다고 탐지할 때, 평가를 멈추고 나머지 논리 연 산식에 대한 연산도 중지한다. 최종 논리 연산식의 값이 이미 알려졌기 때문에 더 이상의 연산을 멈출 때, 이를 단락(Short-circuiting) 평가라고 한다. 이것이 세심해 보일 수 있지만, 단락 행동이 가디언 패넌(guardian pattern)으 로 불리는 좀 더 똑똑한 기술로 연결된다. 파이썬 인터프리터의 다음 코드를 살펴보자. >>> x = 6 >>> y = 2 >>> x >= 2 and (x/y) > 2 True >>> x = 1 >>> y = 0 >>> x >= 2 and (x/y) > 2 False >>> x = 6 >>> y = 0 >>> x >= 2 and (x/y) > 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>> 파이썬이 (x/y)연산을 평가할 때 y이 0 이어서 실행오류 발생시켜서, 세번째 연 산은 수행되지 않습니다. 하지만, 두 번째 예제의 경우 x >= 2 이 거짓(False) 이어서 전체가 거짓(False)이 되어 (x/y) 평가가 실행되지 않고, 단락(Shortcircuiting) 평가 규칙에 의해서 오류도 발생하지 않습니다.
Chapter 3. 조건부 실행 38 오류가 발생할 것 같은 평가식 앞에 가디언(gardian) 평가식을 전략적으로 배치 해서 논리 평가식을 아래와 같이 구성합니다. >>> x = 1 >>> y = 0 >>> x >= 2 and y!= 0 and (x/y) > 2 False >>> x = 6 >>> y = 0 >>> x >= 2 and y!= 0 and (x/y) > 2 False >>> x >= 2 and (x/y) > 2 and y!= 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>> 첫 번째 논리 표현식은 x >= 2이 거짓(False)이라 and에서 멈춥니다. 두 번째 논리 표현식은 x >= 2이 참(True), y!= 0은 거짓(False)이어서 (x/y)까지 갈 필요는 없습니다. 세 번째 논리 표현식은 (x/y) 연산이 끝난 후에 y!= 0이 수행되어서 오류가 발생합니다. 두 번째 논리 표현식에서 y!= 0이 0 이 아니어만 (x/y)이 실행될 수 있도록 가디언(gardian) 역할을 수행한다고 할 수 있다. 3.9 디버깅(Debugging) 오류가 발생했을 때, 파이썬이 화면에 출력하는 트레이스백(traceback)은 상당 한 정보를 담고 있지만, 특히 스택에 많은 프레임이 있는 경우 엄청나게 보일 수도 있다. 대체로 유용한 정보는 다음과 같다. 어떤 종류의 오류인가. 어디서 발생했는가. 구문 오류는 대체로 발견하기 쉽지만, 몇 가지는 애매합니다. 공백 오류가 대 표적인데, 공백(space)과 탭(tab)은 구별이 되지 않고, 통상 무시하고 넘어가기 쉽기 때문입니다. >>> x = 5 >>> y = 6 File "<stdin>", line 1 y = 6 ˆ SyntaxError: invalid syntax 이 예제의 문제는 두 번째 줄이 한 칸 공백으로 들여써서 발생하는 것입니다. 하지만, y에 오류 메시지가 있는데 프로그래머를 잘못된 곳으로 인도합니다. 대 체로 오류 메시지는 문제가 어디에서 발견되었는지를 지칭하지만, 실제 오류는 코드 앞에서 종종 선행하는 줄에 있을 수 있습니다.
3.10. 용어 정의 39 동일한 문제가 실행 오류에도 있습니다. 데시벨(decibels)로 신호 대비 잡음비를 계산한다고 가정합시다. 공식은 SNRdb = 10 log10 (Psignal /Pnoise )입니다. 파이썬 에서 아래와 같이 작성할 수 있습니다. import math signal_power = 9 noise_power = 10 ratio = signal_power / noise_power decibels = 10 * math.log10(ratio) print decibels 하지만, 실행하게 되면, 다음과 같은 오류 메시지1 가 발생합니다. Traceback (most recent call last): File "snr.py", line 5, in? decibels = 10 * math.log10(ratio) OverflowError: math range error 오류 메지지가 5번째 줄에 있지만, 잘못된 것은 없습니다. 실제 오류를 발견하기 위해서, 출력값은 0인 ratio의 값을 print문을 사용해서 출력해 보는 것이 도움 이 됩니다. 문제는 4번째 줄에 있는데, 두 정수를 나누기를 소수점 연산을 했기 때문입니다. signal_power 와 noise_power 를 부동 소수점값으로 표현하는게 해결책입니다. 대체로, 오류 메시지는 어디에 문제가 발견되었는지를 말해주지만, 종종 어디서 원인이 발생했는지는 말해주지 않습니다. 3.10 용어 정의 몸통부문(body): 복합문 내부에 열련의 명령문 실행을 기술한 부문 불 표현식(boolean expression): 참(True) 혹은 거짓(False)의 값을 가지는 표 현식 분기(branch): 조건문에서 대안 실행 명령문의 한 흐름 연쇄 조건문(chained conditional): 일련의 대안 분기가 있는 조건문 비교 연산자(comparison operator): 피연산자를 ==,!=, >, <, >=, <=로 비교하 는 연산자 조건문(conditional statement): 조건에 따라 명령의 흐름을 조절하는 명령문 조건(condition): 조건문에서 어느 분기를 실행할지 결정하는 불 표현식 복합문(compound statement): 머리부문(head)와 몸통부문(body)으로 구성된 스테이트먼트. 머리부문은 콜론(:)으로 끝나며, 몸통부문은 머리부문을 기준으로 들여쓰기로 구별된다. 1 파이썬 3.0에서는 오류 메시지가 발생하지 않습니다. 정수 피연산자인 경우에도 나눗셈 연 산자가 부동 소수점 나눗셈을 수행합니다.
Chapter 3. 조건부 실행 40 가디언 패턴(guardian pattern): 단락(short circuit) 행동을 잘 이용하도록 논리 표현식을 구성하는 것 논리 연산자(logical operator): 불 표현식을 결합하는 연산자 중의 하나 (and, or, not) 중첩 조건문(nested conditional): 하나의 조건문이 다른 조건문 분기에 나타나 는 조건문. 트레이스백(traceback): 예외 사항이 발생했을 때 실행되고, 출력되는 함수 리 스트 단락(short circuit): 왜냐하면 파이썬이 나머지 조건 표현식 평가를 할 필요없 이 최종 결과를 알기 때문에, 파이썬이 논리 표현식 평가를 일부 진행하고, 더 이상의 평가를 멈출 때. 3.11 연습문제 Exercise 3.1 40시간 이상 일할 경우 시급을 1.5배 더 종업원에게 지급하는 봉 급계산 프로그램을 다시 작성하세요. Enter Hours: 45 Enter Rate: 10 Pay: 475.0 Exercise 3.2 try, except를 사용하여 봉급계산 프로그램을 다시 작성하세요. 숫자가 아닌 입력값을 잘 처리해서 메시지를 출력하고 프로그램을 종료하게 됩 니다. 다음은 프로그램의 출력 결과를 보여줍니다. Enter Hours: 20 Enter Rate: nine Error, please enter numeric input Enter Hours: forty Error, please enter numeric input Exercise 3.3 0.0과 1.0 사이의 점수를 출력하는 프로그램을 작성하세요. 만약 점수가 범위 밖이면 오류를 출력합니다. 만약 점수가 0.0과 1.0 사이라면, 다음 의 테이블에 따라 등급을 출력합니다. Score >= 0.9 >= 0.8 >= 0.7 >= 0.6 < 0.6 Grade A B C D F Enter score: 0.95
3.11. 연습문제 41 A Enter score: perfect Bad score Enter score: 10.0 Bad score Enter score: 0.75 C Enter score: 0.5 F 입력값으로 다양한 다른 값을 출력하도록 반복적으로 보이는 것처럼 프로그램 을 실행하세요.
42 Chapter 3. 조건부실행
Chapter 4 함수 4.1 함수 호출 프로그래밍 문맥에서, 함수(function)는 연산을 수행하는 일련의 명명된 명령문 이다. 함수를 정의할 때, 이름과 일련의 명령문을 명시한다. 후에, 함수를 이름으 로 호출(call) 할 수 있다. 이미 함수 호출(function call)의 예제를 살펴 보았다. >>> type(32) <type 'int'> 함수명은 type이다. 괄호안의 표현식을 함수의 인수(argument)라고 한다. 인수 는 함수의 입력값으로 함수 내부로 전달되는 값이나 변수이다. 앞의 type 함수 의 결과값은 인수의 형(type)이다. 통상 함수가 인수를 받아 결과를 돌려준다고 한다. 결과를 결과값(return value) 이라고 부른다. 4.2 내장(Built-in) 함수 파이썬에는 함수를 정의할 필요없이 사용할 수 있는 많은 중요 내장함수가 있 다. 파이썬을 처음 만든 사람이 공통의 문제를 해결할 수 있는 함수를 작성해서 여러분이 사용할 수 있도록 파이썬에 포함을 했습니다. max와 min 함수는 리스트의 최소값과 최대값을 각기 계산해서 여러분에게 보여 줍니다. >>> max('hello world') 'w' >>> min('hello world') ' ' >>> max 함수는 문자열의 가장 큰 문자, 상기 예제에서는 w, min함수는 최소 문자를, 상기 예제에서는 공백, 출력합니다.
Chapter 4. 함수 44 또 다른 매우 자주 사용되는 내장 함수는 얼마나 많은 항목이 있는지 출력하는 len함수가 있습니다. 만약 len 함수의 인수가 문자열이면 문자열의 문자 갯수 를 반환합니다. >>> len('hello world') 11 >>> 이들 함수는 문자열에만 한정된 것이 아니라, 뒷장에서 보듯이 다양하게 다양한 자료형에 사용될 수 있습니다. 내장함수의 이름은 사전에 점유된 예약어로 다뤄야 하고, 예를 들어 max 를 변수명으로 사용을 피해야 합니다. 4.3 형 변환 함수 파이썬은 A형(type)에서 B형(type)으로 값을 변환하는 내장 함수를 제공합니다. int함수는 임의의 값을 입력 받아 변환이 가능하면 정수형으로 변환하고, 그렇 지 않으면 불평을 합니다. >>> int('32') 32 >>> int('hello') ValueError: invalid literal for int(): Hello int는 부동 소수점 값을 정수로 변환할 수 있지만 소수점 이하를 절사합니다. >>> int(3.99999) 3 >>> int(-2.3) -2 float는 정수와 문자열을 부동 소수점으로 변환합니다. >>> float(32) 32.0 >>> float('3.14159') 3.14159 마지막으로, str은 인수를 문자열로 변환합니다. >>> str(32) '32' >>> str(3.14159) '3.14159' 4.4 난수(Random numbers) 동일한 입력을 받을 때, 대부분의 컴퓨터는 매번 동일한 출력값을 생성하기 때 문에 결정적(deterministic)이라고 합니다. 결정론이 대체로 좋은데 왜냐하면,
4.4. 난수(Random numbers) 45 동일한 계산은 동일한 결과를 기대할 수 있기 때문입니다. 하지만, 어떤 어플리 케이션에서는 컴퓨터가 예측불가능하길 바랍니다. 게임이 좋은 예이고, 더 많은 예를 찾을 수 있습니다. 프로그램을 온전하게 비결정론적으로 만드는 것은 쉽지 않은 것으로 밝혀졌지만, 비결정론적인 것처럼 보이게 하는 방법은 있습니다. 의사 난수(pseudorandom numbers)를 생성하는 알고리즘을 사용하는 방법이 그 중 하나입니다. 의사 난수는 이미 결정된 연산에 의해서 생성된다는 점에서 진정한 의미의 난수는 아니지만,이렇게 생성된 숫자를 진정한 난수와 구별하기 는 불가능에 가깝다. random 모듈은 의사 난수를 생성하는 함수를 제공한다. (이하 의사 난수 대신 난수(random) 로 간략히 부르기로 한다.) random 함수는 0.0과 1.0 사이의 부동 소수점 난수를 반환한다. random 함수는 0.0은 생성하지만 1.0은 생성하지 않는다. 매번 random 함수를 호출할 때 마다 이미 생성된 난수열에서 하나씩 하나씩 뽑아 쓰게 됩니다. 샘플로 다음 반복문을 실행해 봅시다. import random for i in range(10): x = random.random() print x 프로그램이 0.0과 1.0을 포함하지 않는 최대 1.0에서 10개의 난수 리스트를 생 성합니다. 0.301927091705 0.513787075867 0.319470430881 0.285145917252 0.839069045123 0.322027080731 0.550722110248 0.366591677812 0.396981483964 0.838116437404 Exercise 4.1 여러분의 컴퓨터에 프로그램을 실행해서, 어떤 난수가 생성되는 지 살펴보세요. 한번 이상 프로그램을 실행하여 보고, 어떤 난수가 생성되는지 다시 살펴보세요. random함수는 난수를 다루는 단지 많은 함수 중의 하나입니다. randint 함수는 최저(low)와 최고(high) 매개 변수를 입력받아 최저값(low)와 최고값(high) 을 포함하는 두 사이의 정수를 반환합니다. >>> random.randint(5, 10) 5 >>> random.randint(5, 10) 9 무작위로 배열로부터 하나의 숫자를 뽑아내기 위해서, choice를 사용합니다.
Chapter 4. 함수 46 >>> t = [1, 2, 3] >>> random.choice(t) 2 >>> random.choice(t) 3 random 모듈은 정규분포, 지수분포, 감마분포 및 몇가지 추가된 연속형 분포에 서 난수를 생성할 수 있는 함수도 제공합니다. 4.5 수학 함수 파이썬은 가장 친숙한 수학 함수를 제공하는 수학 모듈이 있습니다. 수학 모듈을 사용하기 전에, 수학 모듈 가져오기를 실행합니다. >>> import math 이 명령문은 math 모듈 개체를 생성한다. 모듈 개체를 출력하면, 모듈 개체에 대한 정보를 얻을 수 있다. >>> print math <module 'math' from '/usr/lib/python2.5/lib-dynload/math.so'> 모듈 개체는 모듈에 정의된 함수와 변수를 담고 있다. 함수 중에 하나에 접근하 기 위해서, 점으로 구분되는 모듈의 이름과 함수의 이름을 명시해야 한다. 이런 형식을 점 표기법(dot notation)이라고 부른다. >>> ratio = signal_power / noise_power >>> decibels = 10 * math.log10(ratio) >>> radians = 0.7 >>> height = math.sin(radians) 첫 예제는 로그 지수 10으로 신호 대비 소음 비율을 계산한다. 수학 모듈은 자연 로그를 log함수를 호출해서 사용할 수 있도록 제공한다. 두 번째 예제는 라디안의 사인값을 찾는 것이다. 변수의 이름이 힌트로 sin과 다른 삼각 함수(cos, tan 등)는 라디안을 인수로 받는다. 도수에서 라디안으로 변환하기 위해서 360으로 나누고 2π를 곱한다. >>> degrees = 45 >>> radians = degrees / 360.0 * 2 * math.pi >>> math.sin(radians) 0.707106781187 math.pi 표현문은 수학 모듈에서 pi 변수를 얻고, π와 근사적으로 동일하고 15 자리수까지 정확하다. 삼각함수를 배웠다면, 앞의 연산 결과를 2를 루트를 씌우고 2로 나누어서 비교 한다. >>> math.sqrt(2) / 2.0 0.707106781187
4.6. 신규 함수 추가 4.6 47 신규 함수 추가 지금까지 파이썬에 딸려 있는 함수를 사용했지만 새로운 함수를 추가하는 것 도 가능하다. 함수 정의(function definition)는 신규 함수명과 함수가 호출될 때 실행할 일련의 명령문을 명세한다. 함수를 신규로 정의하면, 프로그램 내내 반 복해서 함수를 재사용할 수 있다. 여기 예제가 있다. def print_lyrics(): print "I'm a lumberjack, and I'm okay." print 'I sleep all night and I work all day.' def는 이것이 함수 정의를 나타내는 키워드입니다. 함수명은 print_lyrics입 니다. 함수명을 명명 규칙은 변수명과 동일합니다. 문자, 숫자, 그리고 몇몇 문장 부호는 사용할 수 있지만, 첫 문자가 숫자는 될 수 없다. 함수명으로 예약어 키 워드를 사용할 수도 없고, 동일한 변수명과 함수명은 피하는 것이 좋다. 함수명 뒤에 빈 괄호는 이 함수가 어떠한 인수도 갖지 않는다는 것을 나타낸다. 나중에, 입력값으로 인수를 가지는 함수를 작성해 볼 것이다. 함수 정의 첫번째 줄을 머리 부문(헤더, header), 나머지 부문을 몸통 부문(바디, body)라고 부른다. 머리 부문은 콜론(:)으로 끝나고, 몸통 부문은 들여쓰기를 해야 한다. 파이썬 관례로 들여쓰기는 항상 4칸의 공백이다. 몸통 부문은 제약 없이 명령문을 작성할 수 있다. print문의 문자열은 이중 인용부호로 감싸진다. 단일 인용부호나, 이중 인용부 호나 차이가 없다. 대부분의 경우 단일 인용부호를 사용하고, 단일 인용부호가 문자열에 나타나는 경우, 이중 인용부호를 사용하여 단일 인용부호가 출력되게 감싼다. 함수 정의를 인터렉티브 모드에서 타이핑을 한다면, 함수 정의가 끝나지 않았 다는 것을 알 수 있도록 생략부호(...)를 출력한다. >>> def print_lyrics():... print "I'm a lumberjack, and I'm okay."... print 'I sleep all night and I work all day.'... 함수 정의를 끝내기 위해서는 엔터(Enter)키를 눌러 빈 줄을 삽입한다. (스크립 트에서는 반듯이 필요한 것은 아니다.) 함수를 정의하게 되면 동일한 이름의 변수도 생성된다. >>> print print_lyrics <function print_lyrics at 0xb7e99e9c> >>> print type(print_lyrics) <type 'function'> print_lyrics의 값은 'function' 형을 가지는 함수 개체(function object) 이다. 신규 함수를 호출하는 구문은 내장 함수의 경우와 동일합니다.
Chapter 4. 함수 48 >>> print_lyrics() I'm a lumberjack, and I'm okay. I sleep all night and I work all day. 함수를 정의하면, 또 다른 함수 내부에서 사용이 가능합니다. 예를 들어, 이전의 후렴구를 반복하기 위해 repeat_lyrics 함수를 작성할 수 있습니다. def repeat_lyrics(): print_lyrics() print_lyrics() 그리고 나서, repeat_lyrics 함수를 호출합니다. >>> repeat_lyrics() I'm a lumberjack, and I sleep all night and I'm a lumberjack, and I sleep all night and I'm okay. I work all day. I'm okay. I work all day. 하지만, 이 방법이 실제 노래가 불려지는 방법은 아닙니다. 4.7 함수 정의와 사용법 앞 절의 코드 조각을 모아서 작성한 전체 프로그램은 다음과 같다. def print_lyrics(): print "I'm a lumberjack, and I'm okay." print 'I sleep all night and I work all day.' def repeat_lyrics(): print_lyrics() print_lyrics() repeat_lyrics() 상기 프로그램은 두개의 함수(print_lyrics, repeat_lyrics)를 담고 있다. 함 수정의는 다른 명령문과 동일하게 수행되지만, 함수 개체를 생성한다는 점에서 차이가 있다. 함수 내부의 명령문은 함수가 호출되기 전까지 수행되지 않고, 함 수 정의는 출력값도 생성하지 않는다. 예상하듯이, 함수를 실행하기 전에 함수를 생성해야 한다. 다시 말해서, 처음으 로 호출되기 전에 함수 정의가 실행되어야 한다. Exercise 4.2 상기 프로그램의 마지막 줄을 최상단으로 옮겨서 함수 정의 전에 호출되도록 프로그램을 고쳐보세요. 프로그램을 실행서 오류 메시지를 확인하 세요. Exercise 4.3 함수 호출을 맨 마지막으로 옮기고, repeat_lyrics 함수 정의 뒤 에 print_lyrics 함수를 옮기세요. 프로그램을 실행하게 되면 무슨 일이 발생 하나요?