1장. 언어 및 구문

파이썬이라는 언어를 설명하다 보면 우아하다는 표현을 종종 쓰곤 한다. 우아하다는 말은 “겉모습이나 태도에 있어 기품이 있고 멋지다”는 뜻으로 풀이된다. 단순함강력함 또한 이 언어를 설명하는 데 있어서 훌륭한 낱말이 될 수 있다. 파이썬은 복잡하지 않은 방식으로 강력한 응용 프로그램을 만들 수 있는 우아한 언어인 것이다. 복잡한 소프트웨어를 보다 읽고 쓰기 쉽게 만드는 능력을 갖추는 것이 모든 프로그래밍 언어의 목표인데, 파이썬은 이미 그것을 갖추고 있다.

우리가 넓은 의미에서의 프로그래밍 언어의 목표를 간단히 정의해 보았지만, 파이썬 프로그래밍 언어를 배움으로써 얻을 수 있는 한 가지 큰 이득을 언급하지 않을 수 없다. 파이썬은 자바 플랫폼에서 실행할 수 있도록 확장되었으며, JVM만 있으면 어디서든 실행할 수 있다는 점이다. 또한 여러 플랫폼을 지원하는 C와 .NET을 위한 파이썬도 있다. 그러니까, 파이썬은 거의 모든 곳에서 실행할 수 있다. 이 책에서는, 파이썬의 우아함과 강력함, 편의성을 갖춘 한편 JVM 상에서 실행할 수 있는 Jython에 초점을 맞추도록 하겠다.

파이썬에 있어서 C 라이브러리가 그러한 것처럼 자이썬 언어는 자바 플랫폼에 토대를 둔다. 자이썬은 거의 어디에서나 실행할 수 있어, 그것이 애플리케이션을 어떻게 구현할지 결정하는데 있어서 높은 유연성을 가져다준다. 자바 플랫폼은 애플리케이션 개발에 유연성을 제공할 뿐만 아니라, 자이썬에서 쓸 수 있는 수천개의 API를 포함하는 방대한 라이브러리도 제공한다. 자바 플랫폼이 성숙하였다는 것도 감안하면 어째서 자이썬이 그토록 매력적인 프로그래밍 언어인지 쉽게 이해할 수 있다. 당신이 원한다면, 어떤 프로그래밍 언어에서나 목표는 개발자에게 자이썬이 하는 것과 동일한 경험을 부여하는 것이다. 간단하게 말해서, 자이썬을 배워두는 것은 어떠한 개발자에게나 득이 될 것이다.

언급했던 대로, 자이썬 언어 구현은 파이썬을 취하여 그것을 JVM에서 실행하는 것이지만, 거기에서 그치는 것은 아니다. 일단 자바 플랫폼에서의 프로그래밍의 힘을 경험하고 나면, 거기서 빠져나오기가 힘들 것이다. 자이썬을 배운다는 것은 단지 JVM에서 실행할 수 있다는 것 뿐 아니라, 플랫폼의 힘을 이용하는 새로운 방법을 배울 수 있게 해준다. 자이썬은 마치 의사 코드를 읽듯 쉽게 이해할 수 있는 구문으로 되어 있기 때문에 생산성을 높여준다. 거기에 자바 언어 자체에서 갖지 못한 동적인 능력을 더해준다.

이 장에서는 어떻게 설치하고 환경을 구성하는지를 배울 것이며, 파이썬 언어가 제공하는 이러한 기능에 대한 개요를 살펴볼 것이다. 이 장에서는 구문의 개념에 대하여 너무 깊이 파고들어서 따분하게 만들지 않고, 구문에 대한 간략하고 유익한 정보를 제공하여, 기초를 습득하고 이 책을 통해 언어를 배워나가도록 이끌고자 한다. 또한 몇몇 자바 예제를 파이썬으로 쓰여진 것들과 비교하여 이 언어가 제공하는 장점을 볼 수 있도록 할 것이다.

이 장을 끝낼 즈음이면, 파이썬 코드의 기본적인 구조와 규칙를 알게 될 것이다. 변수를 정의하고, 예약어를 사용하고, 기본적인 작업을 수행하는 등의 기본 언어 개념을 어떻게 사용하는지 알게 될 것이다. 구문과 표현식을 사용하는 맛을 보여줄 것이다. 모든 훌륭한 프로그램에는 주석이 달려 있으므로, 한 줄 짜리 코드 및 코드 블록 전체 문서화 방법을 배우게 될 것이다. 책을 읽어가면서, 기본적인 사항에 대해서는 이 장을 참고하게 될 것이다. 이 장은 각각의 기능을 완전히 다루지 않지만, 파이썬 언어를 쓰기 시작하기에 충분한 기본 지식을 제공할 것이다.

자이썬과 파이썬의 차이점

자이썬은 자바 플랫폼에 맞추어 파이썬 언어를 구현한 것이다. 이 책을 통해, 여러분은 파이썬 언어를 사용하는 법을 배우게 될 것이며, 우리는 자이썬 구현이 CPython, 즉 C 언어로 구현된 파이썬의 정식 구현과 어떠한 차이점을 갖는지 보여줄 것이다. 파이썬 언어의 구문은 서로 다른 구현을 통해 일관성을 가진다는 점에 유념하기 바란다. 이 글을 쓰는 시점에는 파이썬의 세 가지 주요한 구현이 있다. CPython, 자바 플랫폼을 위한 자이썬, 그리고 닷넷 환경을 위한 IronPython이다. 지금으로서는 CPython이 가장 널리 쓰인다. 그러므로 당신이 파이썬이라는 단어를 보게된다면 그것은 필시 CPython을 가리킬 것이다.

이 책은 언어의 구문이나 기능과 같이 언어 자체의 성질을 물려받은 사항에 관한 장에서는 파이썬 언어를 참조할 것이다. 하지만, 이 책은 자바 플랫폼에 특화된 기능이나 기법에 대하여 논할 때에는 자이썬이라는 이름으로 부를 것이다. 당연히 이책은 자이썬의 주요 기능에 대하여 깊이 파고들 것이며 여러분은 자이썬 구현의 개념을 배울 수 있을 것이다. 그와 함께, 파이썬으로 프로그래밍하는 방법과 함께 보다 고급의 기술을 배울 수 있을 것이다.

개발자가 알고 있는 언어나 배경지식에 관계 없이 이 책이 도움이 될 것이다. 파이썬을 처음으로 학습하는 것에 흥미가 있든 자이썬의 기술과 고급 개념을 깨우치고자 하든 이 책이 잘 맞을 것이다. 자바 개발자와 파이썬 언어를 처음 접하는 이들은 파이썬 언어의 기초부터 보다 고급의 개념까지를 가르쳐주는 1부에 특히 관심이 갈 것이다. 경험 많은 파이썬 개발자는 자이썬 구현의 특징에 보다 초점을 맞추는 2부와 3부에 더욱 관심이 있을 것이다. 이 레퍼런스에서, 자바 코드와 파이썬 코드를 비교한 것을 종종 보게 될 것이다.

자이썬 설치와 구성

언어의 기초를 탐구하기 전에, 어떻게 자이썬을 얻고 여러분의 환경에 맞도록 구성하는지 살펴보도록 하자. 우선, 공식 웹사이트인 www.jython.org에서 자이썬을 얻을 수 있다. 이 책은 2.5.x 판에 초점을 맞추고 있기 때문에, 누리집을 지금 방문해서 가장 최신판의 배포본을 내려받는 것이 좋을 것이다. 낮은 판의 것들도 쓸 수는 있지만, 2.5.x 계열에서부터 포함된 여러 기능들은 포함하지 않고 있다.

자이썬은 각각의 파이썬 판본과 기능이 일치하도록 판이 정해진다. 예를 들어, 자이썬 2.2.1 배포본을 내려받는다면, 거기에는 파이썬 2.2 배포본에 포함된 모든 기능이 들어 있다. 마찬가지로, 당신이 2.5 릴리스를 사용한다면 파이썬 2.5에 포함되어 있는 것과 동일한 기능을 이용할 수 있다. 또한 2.5 판에는 자이썬에만 해당되는 몇 가지 기능도 있다. 우리는 이 책을 통해 이러한 추가 기능에 대해 자세히 다룰 것이다.

자이썬 2.5의 최근 판본을 준비하도록 하자. 그 배포본은 모든 플랫폼에서 수행가능한 JAR 파일로 묶여져 있을 것이다. 지금 당장, 여러분은 자바 플랫폼에서 실행하는 경우의 명백한 장점을 누리고 있는 것이다. 단 한 개의 설치파일로 다양한 플랫폼에 적용할 수 있다는 사실 말이다. 이보다 더 쉬울 수는 없다! 자이썬 언어를 설치하기 위한 필요조건으로서, 당신의 컴퓨터에 자바 5 또는 그 이상이 설치되어 있어야한다. 자바 5 이상을 갖고 있지 않다면 자이썬을 설치하기 전에 우선 www.java.com에서 자바를 구해서 설치하도록 하자.

자이썬 설치는 단순히 JAR 파일을 더블 클릭함으로써 시작할 수 있다. 설치과정에 필요한 기본적인 질문이 이어서 나올 것이다. 어떠한 기능을 설치하고 싶은지를 정해주도록 하자. 자이썬의 소스 코드를 들여다보는 것에 흥미가 있거나, 자이썬 프로젝트의 코드를 개발하고자 한다면, 소스 코드를 포함하는 “전체” 옵션을 선택하여 모두 다 설치하도록 하라. 그렇지 않은 대부분의 자이썬 개발자 및 자이썬을 처음 배우기 시작하는 경우에는, “표준” 설치 옵션을 선택하는 것을 권장한다. 선택사항을 결정하고 설치 경로를 지정해주고 나면 설치가 시작되어 금방 끝날 것이다.

자이썬을 실행하기 위해서는 윈도우에서는 jython.bat 실행 파일을, 유닉스/리눅스 및 맥 OS X 등에서는 jython.sh 파일을 호출하면 된다. 그렇게 하기 위해서는, 해당 파일이 설치된 디렉토리로 이동해야할 것이다. 윈도우이든, 유닉스/리눅스 또는 OS X이든 간에 PATH 환경변수에 이러한 디렉토리를 등록하여 놓으면, 컴퓨터 상의 어느 디렉토리에서든지 자이썬을 실행시킬 수 있다. 여기까지 마쳤으면, 터미널이나 명령 프롬프트에다가 “jython”이라고 쓰고 엔터를 쳐서 대화형 번역기를 열 수 있을 것이다. 여기가 바로 우리의 여정이 시작되는 곳이다! 자이썬 대화형 번역기는 코드를 시험해보고 언어를 배우기에 더할 나위 없는 환경이다. 그것은 코드를 입력하고 결과를 즉시 확인할 수 있는 실시간 테스트 환경인 것이다. 이 장을 읽은 여러분은 자이썬 번역기를 열어서 코드 예제를 따라해보기 바란다.

식별자와 변수 선언

모든 프로그래밍 언어는 값을 캡처하거나 계산하고 저장하는 능력을 갖추어야 한다. 파이썬에서도 예외는 없으며, 누워서 떡 먹기이다. 파이썬에서 변수를 정의하는 것은 자바 등의 다른 언어들과 매우 비슷하지만, 주의해야 할 몇 가지 차이점이 있기도 하다.

파이썬 언어에서 변수를 정의하려면, 단지 식별자를 사용하여 그 이름을 지으면 된다. 식별자란 개체를 식별하는 데 사용되는 이름을 말한다. 파이썬 언어는 변수명을 어떠한 값을 가리키는 이름표로 취급한다. 그것은 값이 어떤 종류인지 따지지 않는다. 따라서 모든 변수는 모든 종류의 데이터든 가질 수 있다. 하나의 변수가 프로그램이 살아 움직이는 동안에 서로 다른 데이터 유형으로 바뀌는 것도 가능하다. 그래서 처음에 정수로 할당되었던 변수가 나중에는 문자열을 가질 수도 있다. 파이썬에서 식별자를 만들 때에는 문자, 숫자, 밑줄을 순서에 관계없이 사용할 수 있다. 그렇지만 식별자는 숫자가 아닌 문자로 시작해야 한다. 우리는 식별자를 어떤 종류의 변수, 블록, 또는 개체에 대하여 이름 붙이는 데에 사용할 수 있다. 대부분의 언어들과 마찬가지로, 일단 식별자가 정해지면 프로그램의 다른 곳에서 참조할 수 있게 된다.

변수를 선언하였을 때는, 변수는 형이 정해지지 않았으며 어떠한 값이라도 받아들일 수 있는 상태이다. 바로 이 점이 자바와 같이 자료형을 정적으로 유지하는 언어와, 파이썬과 같은 동적 언어의 차이점이다. 자바에서는 변수를 생성할 때 자료형을 선언하여야하지만, 파이썬에서는 그렇게 하지 않는다. 처음 듣기에는 별 다른 차이가 없는 것 같을 수 있지만, 이러한 능력으로 말미암아 놀라운 결과를 얻을 수 있다. 다음의 두 가지 목록을 살펴보도록 하자. 변수 ‘x’를 정의하고 값을 0으로 준다.

예제 1-1. 자바 - 변수 선언

int x = 0;

예제 1-2. 파이썬 - 변수 선언

x = 0

보다시피, 우리는 이 변수에 대해 형을 지정할 필요가 없다. 우리는 그저 이름을 선택하고 값을 정해주었을 뿐이다. 변수의 유형을 정해둘 필요가 없으므로, 나중에 프로그램에서 그것을 다른 유형의 값으로 변경할 수 있다.

예제 1-3.

x = 'Hello Jython'

우리는 변수 ‘x’의 값을 숫자에서 문자열로 바꾸었을 뿐이다. 실제로 일어난 일은 우리가 ‘Hello Jython’이라는 새로운 변수를 만들어서 그것을 식별자 ‘x’에 할당했는데, ‘x’는 참조를 잃어버려서 0으로 되어있었던 것이다.이것은 동적 언어 철학의 열쇠이다. 변경이 어려워서는 안된다는 것이다.

지금가지 알아본 것을 몇 가지 간단한 계산에 적용해 보자. 파이썬에서 변수의 정의를 바탕으로, 우리는 변수에 정수 값을 할당하였다가 나중에 부동소수점수로 변경할 수 있다. 다음의 예를 보자.

예제 1-4.

>>> x = 6
>>> y = 3.14
>>> x = x * y
>>> print x
18.84

위의 예제에서 우리는 임의의 주어진 값에 대하여 단순히 계산을 수행함으로써 그 자료형을 동적으로 변경할 수 있다는 점을 시연해보았다. 자바와 같은 다른 언어에서였다면, ‘x’를 처음부터 부동소수점수의 자료형으로 할당해서 나중에 그 값을 부동소수점수로 변경하였을 것이다. 파이썬에서는 그럴 필요 없이, 자료형의 속박으로부터 벗어나서 일을 간단히 처리할 수 있도록 되어있다.

예약어

식별자를 만드는데에 있어서 파이썬 언어의 표준을 지키기 위해 따라야할 규칙이 몇 가지 더 있다. 프로그램 내에서 특정한 역할을 수행하도록 하기 위해 파이썬 언어가 미리 예약해둔 단어들이 있는데, 그것들은 식별자로 사용할 수 없다. 이렇게 사용할 수 없는 단어를 예약어라고 부른다. 만약에 이러한 예약어를 식별자로 쓰려고 하면, 파이썬이 예약어로 쓰려고 하였던 단어이므로 구문오류SyntaxError를 보게 될 것이다.

식별자에는 어떠한 기호도 사용할 수 없다. 그렇다. 펄 개발자들에게 익숙한 $ 기호는 파이썬의 식별자를 만드는데에는 쓸 수 없는 것이다.

표 1-1에서 파이썬 언어의 모든 예약어를 볼 수 있다.

표 1-1. 예약어

and assert break class continue
def del elif else except
exec finally for from global
or pass print raise return
try while with yield  

변수의 이름을 지을 때에는 표준 라이브러리의 모듈 이름과 겹치지 않는 이름을 고르는 것이 중요하다.

코딩 구조

파이썬과 다른 언어의 또 다른 차이점은 코딩 구조이다. 과거에는 프로그램을 개발하는 데 있어서, 코드의 특정한 부분을 구분 짓기 위해서는 특정한 기호를 사용하여 그 시작과 끝을 표시하는 엄격한 구조를 따라야만 했다. 파이썬에서는 코드의 구조를 정의하기 위해 기호 대신에 들여쓰기를 사용한다. 자바와 같은 언어에서 코드 블록을 여닫기 위하여 사용하는 중괄호 대신, 파이썬에서는 공백을 사용하며, 이는 코드를 읽기 쉽게하고 코드 내에서 불필요한 기호의 사용을 줄여준다. 그러한 규칙으로 인해 코드의 정렬과 구성이 엄격하게 제한는데, 네 칸를 들여쓰는 것이 표준이기는 해도 프로그래머가 들여쓰기의 규칙을 정할 수 있다.

그러한 예로서, 진도를 건너뛰어서 간단한 if 문을 살펴보자. 이 구문에 익숙하지는 않겠지만, 결과를 쉽게 예측할 수 있으리라 생각한다. 자바로 작성한 코드를 먼저 살펴본 다음, 파이썬으로 동등한 코드를 작성하여 비교해보도록 하자.

예제 1-5. 자바의 if 문

x = 100;
if(x > 0){
System.out.println("Wow, this is Java");
} else {
System.out.println("Java likes curly braces");
}

이번에는 파이썬으로 작성한 비슷한 코드 블록을 살펴보자.

예제 1-6. 파이썬의 if 문

x = 100
if x > 0:
    print 'Wow, this is elegant'
else:
    print 'Organization is the key'

예제가 엉성하기는 하지만 파이썬 언어의 두 가지 핵심 포인트를 보여주기 위한 것이므로 살펴보도록 하자. 보는 바와 같이, 파이썬 프로그램은 변수 ‘x’의 값이 0보다 큰지 평가한다. 만약 그렇다면, ‘Wow, this is elegant.’을 출력한다. 그렇지 않으면, ‘Organization is the key.’를 출력한다. ‘if’ 블록에서 쓰인 들여쓰기를 보라. 이 코드 블록에서는 ‘print’ 문장을 첫 줄에 비해 네 칸 들여쓰고 있다. 마찬가지로, ‘else’는 첫 줄과 맞도록 돌아와있고 그 구현부는 다시 네 칸 들여써져 있다. 이러한 기법은 모든 파이썬 애플리케이션에서 준수해야한다. 그럼으로써, 코드가 읽기 쉬워지는 동시에 중괄호를 사용할 필요가 없어지는 두 가지의 큰 이점을 얻을 수 있게 된다. 자바와 같은 대부분의 다른 프로그래밍 언어는 대괄호 “[“나 중괄호 “{“를 써서 코드 블록의 시작과 끝을 표시한다. 파이썬에서는 공백이 그러한 일을 알아서 처리해주므로 괄호를 쓸 필요가 없다. 간결한 코드는 곧 가독성과 유지보수성의 향상을 의미한다. 예제의 자바 코드를 한 줄에 몰아서 쓰는 것도 가능하기는 하지만, 그렇게 하는 것은 무가치할 뿐 아니라 오히려 더 나쁘기 때문에, 형식을 잘 갖추어서 작성하였다.

파이썬은 코드의 각 블록이 일관된 방식으로 정의된 들여쓰기 규칙을 준수한다는 것을 보장한다. 여러분이 선호하는 들여쓰기 규칙이 있다면 스스로 결정하도록 하라. 코드 블록의 첫 줄이 최소 한 칸 내어쓰기 되어있기만 하면, 나머지 블록은 일관적인 들여쓰기를 고수할 수 있으며 그로 인해 코드 읽기가 편해진다. 많은 이들이 파이썬이 고수하는 구조화 기술이 코드를 읽기 쉽게 한다고 주장한다. 의심의 여지 없이, 애플리케이션에 걸친 표준 들여쓰기를 고수하는 것은 체계성을 부여한다. 앞서 언급했듯이, 파이썬의 표준 간격 기법은 들여쓰기에 네 글자를 사용하는 것이다. 이러한 표준을 준수한다면 당신의 코드는 앞으로도 읽기 쉽고 유지보수하기 편할 것이다. 여러분의 뇌는 어떤 들여쓰기 형식을 고수하도록 고정배선된 것처럼 보이기 때문에, 파이썬과 당신의 뇌가 같은 방식으로 배선되어 있는 것이다.

연산자

파이썬에서 사용하는 연산자는 다른 언어에서의 것들과 매우 흡사하며 직관적이고 사용하기 쉽다. 다른 언어와 마찬가지로 사칙연산을 수행하기 위한 +, -, *, /와 같은 연산자가 있다. 다음 예제에서 볼 수 있듯이, 다른 언어들에 비해 별다른 점은 없다.

예제 1-7. 정수 연산

>>> x = 9
>>> y = 2
>>> x + y
11
>>> x - y
7
>>> x * y
18
>>> x / y
4

여기에서 가장 중요한 것은 정수 값에 대한 연산을 수행하는 경우에는 그 결과 값으로 반올림된 정수를 얻는다는 점이다. 부동소수점 연산을 수행하면 부동소수점수를 결과로 얻고, 그런 식이다.

예제 1-8. 부동소수점 연산

>>> x = 9.0
>>> y = 2.0
>>> x + y
11.0
>>> x - y
7.0
>>> x * y
18.0
>>> x / y
4.5

예제 1-7과 1-8에서 나눗셈(/) 연산에 대한 결과가 다른 것에서 볼 수 있듯이, 정수 연산에서는 반올림을 하는 반면 부동소수점 연산에서는 그렇지 않기 때문에 생기는 차이에 대해 주의하기 바란다. 애플리케이션에서 정밀한 계산이 필요하다면, 모든 숫자 계산에 대해 부동소수점수를 사용하는 것이 최선이며 그렇게 하지 않으면 반올림으로 인한 문제에 부딪히게 될 것이다. 파이썬 2.5 및 그 이전 판에서는, 정수의 나눗셈 결과는 항상 소수점을 버린 결과를 만들어낸다. 파이썬 2.2에서는 정수나 부동소수점수에 대한 나눗셈을 할 때 소수점 이하를 버린 결과를 얻을 수 있는 // 연산자가 도입되었다. 이 연산자는 정수 나눗셈의 결과가 향후의 배포본에서 정확한 나눗셈 결과로 자연스럽게 바뀌도록 하기 위해 도입된 것이다. 항상 정확한 나눗셈을 수행하는 기법은 3장에서 다루도록 하겠다.

식이라는 것은 말 그대로이다. 평가할 수 있고 값을 생성해내는 파이썬 코드 조각을 말한다. 식은 번역기에 내리는 지시라기보다는, 값과 연산자를 조합하여 평가할 수 있도록 만든 것이라 하겠다. 두 변수나 숫자값에 대하여 계산을 수행하고 싶다면 식을 만들면 된다.

예제 1-9. 식의 예

>>> x + y
>>> x - y
>>> x * y
>>> x / y

위에서 예로 든 식의 예제는 매우 단순화된 것이다. 식은 매우 복잡하고 강력한 계산을 수행하도록 만들 수 있다. 식을 조합하여 복잡한 결과를 만들어낼 수도 있다.

함수

때때로 특정한 작업을 수행할 수 있는 코드를 뽑아서 기능적인 단위로 만들어두고, 매번 타이핑할 필요 없이 여러 곳에서 재사용하면 좋다. 코드의 재사용 가능한 조각을 정의하는 일반적인 방법은 함수를 만드는 것이다. 함수는 코드의 일부에 이름이 붙여진 것으로서, 대체로 단일한 작업 또는 그 이상을 수행하며 값을 반환한다. 함수를 정의하기 위해 우리는 def 문을 사용한다.

def 문은 어느 파이썬 프로그래머의 삶에 걸쳐서나 제 2의 천성이 될 것이다. def 문은 함수를 정의하는 데 사용된다. 다음의 간단한 의사pseudo 코드를 통해 그 사용법을 알아보자.

예제 1-10.

def 함수명(인자목록):
    구현부

위의 의사 코드는 def 문을 사용하는 방법과, 함수를 어떻게 작성하는지 간단히 보여준다. 보는 바와 같이, def 다음에 함수의 이름과 매개변수 목록이 따라오도록 함수를 정의한다.

예제 1-11.

>>> def my_simple_function():
...     print '이것은 정말 기본적인 함수입니다'
...
>>> my_simple_function()
이것은 정말 기본적인 함수입니다

이 예제에 대해 만들 수있는 기능의 가장 기본적인 형태이다. 당신이 볼 수 있듯이,이 함수는 한 줄 짜리 print 문을 갖고 있다. print 문에 대해서는 이 장의 뒷부분에서 더 자세히 논의할 것이다.어쨌든 지금은 화면에 어떤 텍스트를 출력하는 데 사용되었다는 정도만 알면 된다. 이 경우, 함수가 호출될 때마다 간단한 메시지를 출력할 수 있다.

함수는 그 문맥에서 사용하기 위해 매개변수 또는 다른 프로그램 변수를 받아들여서, 어떤 작업을 수행하고 값을 반환하는 것이 가능하다.

예제 1-12.

>>> def multiply_nums(x, y):
...     return x * y
...
>>> multiply_nums(25, 7)
175

위에서와 같이, 파라미터는 그저 함수가 호출될 때 할당되는 값에 불과하다. x에 25를, y에는 7을 할당하였다. 다음에 그 함수는 xy를 취하여, 계산을 수행하고 결과를 반환하였다.

파이썬에서 함수는 다른 변수와 마찬가지이며, 그것들은 필요하다면 다른 함수에 매개변수로서 전달된다. 여기에 하나의 함수를 다른 함수로 전달하는 기본적인 예제가 있다. 우리는 multiply_nums 함수를 아래의 함수에 전달하여 어떤 계산을 수행하는데 사용하도록 하겠다.

예제 1-13.

>>> def perform_math(oper):
...     return oper(5, 6)
...
>>> perform_math(multiply_nums)
30

이 예제는 매우 기본적이지만, 또 다른 함수가 매개변수로서 전달되어서 다른 함수 내에서 사용되는 것도 볼 수 있다. def와 함수의 사용에 대한 자세한 내용은 함수의 모든 것을 다루는 4장을 보기 바란다.

클래스

파이썬은 객체 지향 프로그래밍 언어이다. 이것은 파이썬 언어에서는 모든 것이 어떤 유형의 객체라는 것을 의미한다. 건물을 짓기 위해 벽돌을 사용하듯이, 파이썬에서의 각각의 개체가 모여 프로그램의 일부 또는 전체 프로그램을 이룬다. 이 절은 당신에게 하나의 열쇠의 언어로 방향을 개체하는 파이썬 클래스에 대한 간략한 소개를 제공한다.

클래스는 class라는 열쇠말을 사용하여 정의한다. 클래스는 함수, 메소드 및 변수를 포함할 수 있다. 메소드는 함수처럼 def 열쇠말을 써서 만들며, 매개변수를 받는다. 메소드와 함수의 유일한 차이점은, 메소드는 메소드가 속한 객체를 참조하는 self 매개변수를 받는다는 점이다. 클래스는 초기화 메소드라는 것을 가지며, 그것은 클래스에 해당하는 개체가 실제로 만들어질 때 자동으로 호출된다. 간단한 예제를 보고나서 설명하도록 하겠다.

예제 1-14. 간단한 파이썬 클래스

>>> class my_object:
...     def __init__(self, x, y):
...         self.x = x
...         self.y = y
...
...     def mult(self):
...         print self.x * self.y
...
...     def add(self):
...         print self.x + self.y
...
>>> obj1 = my_object(7, 8)
>>> obj1.mult()
56
>>> obj1.add()
15

이 클래스 예제에서, 우리는 my_object라는 이름을 가진 클래스를 정의했다. 클래스는 두 개의 매개변수, xy를 받는다. 클래스 초기화 메소드의 이름은 __init__()인데, 그것은 클래스에 사용될 수 있는 어떠한 값을 초기화하는 데 쓰인다. 초기화 메소드는 객체를 생성하기 위해서 어떤 값이 클래스로 전달될 수 있는지도 정의한다. 클래스 내의 각 메소드와 함수가 self 인자를 받는 것을 볼 수 있을 것이다. self 인자는 객체 자신을 참조하는데 쓰이는데, 이것을 통해 클래스는 변수 같은 것을 공유할 수 있다. self 열쇠말은 자바 코드에서의 this와 비슷하다. 예제에서 xy 변수는 초기화 메소드 내에서 self.xself.y로 이름이 붙여지며, 이것은 그것들이 전체 클래스를 통해 사용될 수 있음을 의미한다. 객체 내의 코드를 가지고 일을 하는 동안, self.xself.y와 같은 변수들을 참조할 수 있다. 객체를 만들어 그 이름을 obj1으로 지었다면, 같은 변수들을 obj1.xobj1.y로 참조할 수 있을 것이다.

보는 바와 같이, 이 클래스는 7과 8 값을 전달하여 호출된다. 그 다음에 이 값들은 클래스 초기화 메소드 내에서 xy에 할당된다. 우리는 클래스 객체를 obj1이라는 식별자에 할당할 것이다. obj1 식별자는 이제 우리가 넘겨준 값과 함께 my_object()에 대한 참조를 가진다. obj1 식별자는 이제 클래스 내에 정의된 메소드와 함수를 호출하는데 사용할 수 있다.

클래스에 대한 자세한 정보는 파이썬에서의 객체 지향을 다루는 6장을 보기 바란다. 클래스는 큰 프로그램을 작성하기 위한 매우 강력하며 기초적인 구성 요소이다.

구문

구문이라 함은, 어떤 일를 하도록 하는 지시를 담고 있는 코드 행을 말하는 것이다. 구문이 파이썬 번역기에게 작업을 수행하라고 알려주는 것이다. 결국 프로그램이란 표현식과 구문의 조합으로 만들어진다. 이 절에서는, 구문에 쓰이는 열쇠말을 둘러보고 그것들을 어떻게 쓰는지 알아보자.

이러한 각각의 서로 다른 구문 열쇠말을 나열하는 것에서 시작해서, 다른 예제들을 통해 각각의 사용법에 대해 자세히 살펴보자. 이 절에서 모든 구문 열쇠말을 다루지는 않고 몇 가지는 나중을 위해 남겨둘 것이지만, 이 절을 읽은 후에는 작업을 수행하는 액션을 어떻게 코딩할 것이지 알게 될 것이다. 이 절에서 서로 다른 구문에 대한 구현 세부 정보를 제공하지만, 여러분은 나중에 이러한 기능의 고급 사용을 찾기 위해 뒤의 장들을 참조해야한다.

표 1-2. 구문 열쇠말

if-elif-else for
while continue
break try-except-finally
assert def
print del
raise import

열쇠말들을 보았으니, 하나씩 뜯어볼 차례이다. 이러한 열쇠말들은 변수명으로 사용할 수 없다는 것을 반드시 기억하기 바란다.

조건문

if 문은 단순히 식에 대한 평가를 수행해서 그것이 인지 거짓인지에 따라 다른 일을 한다. 만약 식에 대한 평가가 이면 한 묶음의 문장들이 실행될 것이고, 거짓이면 다른 문장의 묶음이 실행될 것이다. if 문은 계산 결과나 주어진 값에 의해 코드를 이쪽저쪽으로 분기하고자 할 때 자주 사용된다.

의사 코드는 이렇다.

예제 1-15.

if <검사할 식>:
            작업을 수행
else:
            다른 작업을 수행

어떠한 숫자나 if/else 문이 논리적 코드 분기를 위해 함께 사용될 수 있다. 평가해야할 여러 개의 식이 같은 문에 있는 경우, 이러한 식을 한데 연결하기 위해 elif 문을 쓸 수 있다. if-elif- 문 내의 각각의 문에서 else 문은 조건문의 내어쓰기와 결과문의 들여쓰기와 일치해야한다. 프로그램을 통틀어 일관적인 들여쓰기를 반드시 지켜야한다는 점을 기억하라. if 문은 일관적인 들여쓰기가 프로그램의 가독성을 높여주는 것을 보여주는 좋은 예이다. 예제를 자바로 코딩한다면 문을 감싸기 위해 중괄호를 쓰더라도 공백을 쓸 수 있다. 이것은 코드를 매우 읽기 어렵게 하는데, 파이썬의 들여쓰기가 여기서 빛을 발한다.

예제 1-16. if 문 예제

>>> x = 3
>>> y = 2
>>> if x == y:
...     print 'x는 y와 같습니다'
... elif x > y:
...     print 'x는 y보다 큽니다'
... else:
...     print 'x는 y보다 작습니다'
...
x는 y보다 큽니다

간단한 코드이지만, if 문을 써서 코드 논리의 분기를 하는 것을 보여준다.

출력문

출력print 문은 프로그램 결과를 화면에 출력하는데 사용된다(이미 여러 차례 본 적이 있을 것이다). 프로그램 내에서 출력되는 메시지를 표출하고, 계산된 값을 출력할 수도 있다. 출력문에서 변수 값을 표출하기 위해서는, 파이썬에서 사용 가능한 형식화 옵션의 사용법을 배울 필요가 있다. 이 절에서는 출력문을 사용하는 방법과 텍스트의 문자열을 포맷하여 값을 표시하는 법을 다루도록 하겠다.

자바 언어에서는, 명령행에 뭔가를 출력하려면 시스템 라이브러리를 호출해야 한다. 파이썬에서는, print 문을 사용함으로써 가능하다. print 문의 가장 기본적인 용도가 바로 텍스트 행을 보여주는 것이다. 보여주고자 하는 텍스트를 작은 따옴표나 큰 따옴표로 감싸주면 된다. 자바로 작성된 다음의 예제를 살펴본 다음, 파이썬 코드와 비교해보도록 하자. 파이썬의 print 문이 삶을 편하게 만들어준다는 사실을 알게 될 것이다.

예제 1-17. 자바 결과 출력 예제

System.out.println("This text will be printed to the command line");

예제 1-18. 파이썬 결과 출력 예제

print 'This text will be printed to the command line'

이 예제에서 볼 수 있듯이, 파이썬에서 텍스트 행을 출력하는 것은 매우 간단하다. 또한 print 문을 사용하여 변수 값을 화면에 출력할 수 있다.

예제 1-19.

>>> my_value = 'I love programming in Jython'
>>> print my_value
I love programming in Jython

또한, 변수의 값을 출력하는 방법도 매우 간단하다. print 문에 변수를 갖다놓기만 하면 된다. 텍스트 행에 변수 값을 추가할 때도 이런 식으로 할 수 있다. 그렇게 하려면, 문자열과 추가하고 싶은 값 사이에 연결 연산자 (+)를 써주면 된다.

예제 1-20.

>>> print 'I like programming in Java, but ' + my_value
I like programming in Java, but I love programming in Jython

이것은 훌륭하지만 텍스트의 형식을 적합하게 갖추려고 할 때나 정수 값을 다루려고 할 때에는 쓸모가 없다. 결국, 파이썬 해석기는 (+) 연자자를 덧셈 연산자가 아닌 문자열 연결 연산자로 취급할 것이다. 파이썬은 첫번째 항의 유형에 따라 (+) 연산자의 결과를 낸다. 문자열에 숫자 값을 추가하려고 하면 오류를 맞이하게 될 것이다.

예제 1-21.

>>> z = 10
>>> print 'I am a fan of the number: ' + z
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

이 예제에서 볼 수 있듯이, 파이썬은 이런 트릭을 썩 좋아하지 않는다. 이 작업을 올바로 수행하기 위해서는 앞서 말한 파이썬의 서식 옵션을 쓸 필요가 있다. 이것은 쉽고 강력하며, 어떤 내용이나 값이든 출력문에 넣을 수 있도록 해준다. 예제를 보기 전에, 몇가지 서식 연산자를 살펴보고 그중에서 어떤 것이 필요한지 살펴보자.

  • %s - 문자열
  • %d - 십진수
  • %f - 부동소수점수

변수의 내용이나 식의 결과를 print 문에 포함하고 싶으면, 다음의 구문을 사용한다.

예제 1-22.

print 'String of text goes here %d %s %f' % (decimalValue, stringValue, floatValue)

위의 의사 코드(우리가 정말로 출력문에 대한 의사 코드를 가질 수 있다면)에서, 우리는 작은 따옴표 사이에 있는 텍스트의 문자열을 출력하고자 하는데, 서식 연산자가 위치한 곳에 변수 값도 들어있다. 텍스트의 문자열에 포함된 각각의 서식 연산자는 출력문 끝에 있는 변수들 중에서 연관된 값으로 바꿔치기될 것이다. 텍스트 줄과 변수 목록 사이의 % 기호가 나타내는 것은, 파이썬은 뒤따라오는 변수가 있을 것으로 기대하며, 이러한 변수들의 값은 각자 정해진 위치에서 텍스트의 문자열로 자리잡아야 한다는 것이다.

예제 1-23.

>>> string_value = 'hello world'
>>> float_value = 3.998
>>> decimal_value = 5
>>> print 'Here is a test of the print statement using the values: %d, %s, and %f' % (decimal_value, string_value, float_value)
Here is a test of the print statement using the values: 5, hello world, and 3.998000

보는 바와 같이 이것은 아주 사용하기 쉽고 매우 유연하다. 다음 예제는 구문 내에서 변수가 아닌 표현식을 사용할 수도 있음을 보여준다.

예제 1-24.

>>> x = 1
>>> y = 2
>>> print 'The value of x + y is: %d' % (x + y)
The value of x + y is: 3

형식화 연산자는 출력이 어떻게 보여져야할 지를 정하는 것으로서, 어떤 형의 입력값이 연산자에 전달되었는지는 상관하지 않는다. 예를 들어, %s에 정수나 부동소수점수를 전달하더라도 잘 출력될 것이지만, 정확한 형식을 갖춘 문자열로 변환되는 효과가 나타날 것이다. 정수나 부동소수점수를 %d 또는 %f에 전달한다면, 십진수나 부동소수점수를 표현하기에 합당한 형식이 갖춰질 것이다. 다음 예제에서 각기 다른 서식 연산자의 출력을 보자.

예제 1-25.

>>> x = 2.3456
>>> print '%s' % x
2.3456
>>> print '%d' % x
2
>>> print '%f' % x
2.345600

출력문의 다른 유용한 쓰임새는 그것이 디버그 목적으로 쓰일 수 있다는 것이다. 처리 도중에 변수의 값을 알아내고 싶다면 print 문을 써서 간단히 표시할 수 있다. 이 기술은 코드를 디버그하고 수정할 때 상당히 도움이 되곤 한다.

예외 처리

예외 처리는 파이썬 애플리케이션에서 오류 처리를 할 수 있도록 지원하기 위한 방법이다. 이 아이디어는 코드의 일부를 수행해보아서 만약에 실패하면 붙잡아서 오류를 적절한 방식으로 처리하자는 것이다. 알다시피 너저분한 오류 메시지를 뿌리는 프로그램은 그리 환영받지 못한다. try-except-finally 문을 사용하여 오류를 적절히 잡아서 처리하면 프로그램 덤프가 지저분하게 발생하는 것을 줄일 수 있다.

이러한 접근은 자바를 포함한 많은 언어에서 사용하는 것과 같은 개념이다. 파이썬 프로그래밍 언어 내에서 정의된 많은 수의 오류 유형이 있으며 이러한 오류 유형들의 힘을 빌어서 try-except-finally 프로세스를 촉진할 수 있다. 정의된 오류 유형이 잡히면, 코드의 모음이 그 오류를 처리하도록 할 수 있고, 단순히 기록할 수도 있다. 지저분한 오류 메시지를 방지하고 오류 메시지를 틀에 맞춰 깔끔하게 표시하거나 다른 프로세스를 수행하여 그것들을 처리할 수 있다.

예제 1-26.

>>> # 어떤 값을 계산하여 x에 할당했다고 가정
>>> x
8.97
>>> y = 0
>>> try:
...     print '로켓의 궤도: %f' % (x/y)
... except:
...     print '휴스턴, 문제가 생겼다.'
...
휴스턴, 문제가 생겼다.

만약에 잡아낸 코드 블록에 예외가 있다면 어떤 정리 작업을 해야될 수도 있는데, 이러한 정리 코드는 finally 절에 배치할 수 있다. finally 안에 있는 모든 코드는 항상 예외를 제기하기 전에 호출된다. 이 주제에 대한 세부 사항은 7장에서 다루도록 하겠다. 다음 절에서는 프로그램내의 어느 지점에서든 예외를 일으킬 수 있도록 해주는 raise 문을 살펴보도록 하겠다.

raise 문

앞의 절에서 언급한 바와 같이, 파이썬에서 raise 문은 예외를 던지거나 “일으키는” 데에 사용한다. 우리는 파이썬이 예외를 일으킬 경우 try-except 절이 필요하다는 것은 알고 있다. 그렇다면 여러분이 직접 예외를 일으키고자 하는 경우에는 어떻게 해야 할까? 여러분은 특정한 예외를 제기하고자 하는 곳 어디에든 raise 문을 둘 수 있다. 일어날 수 있는 많은 수의 예외가 언어 내에 정의되어 있다. 일례로, 코드의 특정 부분이 정의되지 않거나 이름을 갖고 있지 않을 때 NameError가 일어난다. 파이썬의 예외의 전체 목록은 7장을 찾아보기 바란다.

예제 1-27.

>>> raise NameError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError

raise에서 자신만의 메시지를 지정하고자한다면, 다음과 같이 일반적인 예외를 일으킨 다음에 문장 내에 메시지를 지정해주면 된다.

예제 1-28.

>>> raise Exception('Custom Exception')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: Custom Exception

import 문

프로그램은 단일한 코드 모음으로도, 복수의 코드 모음으로도 만들 수 있다. 프로그램을 나중에 사용할 수 있도록 저장하기 위해, 우리는 코드를 파일로서 컴퓨터에 보관한다. 파이썬 코드가 포함된 파일은 my_code.py와 같이 .py를 붙이도록 한다. 파이썬 세계에서는 이러한 파일을 모듈이라고 부른다. 외부의 모듈이나 코드를 프로그램 내로 들여와서 쓰기 위해서는 다른 언어에서와 유사하게 import 문을 사용한다. 이 문장은 궁극적으로 여러 위치에 코드의 재사용에 대한 책임을 갖는다. import 문 덕분에 우리는 코드를 텍스트 파일 및 스크립트에 저장하였다가 나중에 애플리케이션에서 사용할 수 있다.

클래스가 클래스 자체와 동일한 이름의 외부 모듈에 저장되어있을 경우, 해당 클래스를 애플리케이션으로 명시적으로 들여오기 위해 import 문을 사용할 수 있다. 이와 유사하게, 다른 모듈에서 특정한 식별자만 현재 모듈에 들여오고자 한다면, 해당 코드를 from <<모듈>> import <<특정 코드>>와 같이 부르면 된다.몇 가지 예제를 보도록 하자.

예제 1-29.

# TipCalculator 모듈을 가져오기
import TipCalculator
# ExternalModule.py 모듈의 tipCalculator 함수를 가져오기
from ExternalModule import tipCalculator

모듈을 프로그램으로 들여올 때는, 현재 프로그램에서 쓰고 있는 모듈의 이름과 충돌하지 않는지 반드시 확인해야 한다. 현재 프로그램에서 쓰고 있는 다른 모듈과 이름이 동일한 모듈을 가져오려면 as 문법을 활용할 수 있다. 다음의 예제에서는, tipCalculator.py라는 이름으로 외부 모듈을 정의하였고 그것의 기능을 현재 프로그램에서 사용하려고 한다고 가정하자. 그러나, 현재 프로그램에는 이미 tipCalculator()라는 이름의 함수가 있다. 따라서, tipCalculator 모듈을 참조하기 위해서 as 문법을 사용한다.

예제 1-30.

import tipCalculator as tip

이 절에서는 외부 모듈을 가져와서 일하기의 겉핥기로 살펴본 것이다. 자세한 논의를 위해서는, 이 주제를 구체적으로 다루고 있는 7장을 보라.

반복

파이썬 언어는 몇가지 반복 구조를 지원하며, 목록list의 각 원소나, 데이터베이스 레코드, 그외의 모음을 순회하는데 쓰인다. 파이썬에서의 목록은 객체나 값을 담고 있는 그릇으로서, 색인을 만들 수 있다. 예를 들어, 우리는 다음 예제에서 숫자의 목록을 만들어보겠다. 그리고 우리는 색인값 1을 가지고 두번째 원소를 얻어낸다. (색인이 0부터 시작하므로 목록의 첫번째 원소는 my_numbers[0]이다).

예제 1-31.

>>> my_numbers = [1, 2, 3, 4, 5]
>>> my_numbers
[1, 2, 3, 4, 5]
>>> my_numbers[1]
2

목록에 대한 자세한 내용은 그 목록과 파이썬에서 사용할 수 있는 다른 컨테이너에 대한 내용이 수록되어 있는 2장을 참조하기 바란다.

언어 내에서 가장 일반적으로 사용되는 반복 구조는 아마도 for 되풀이일 것이며, 쉬운 문법과 실용적인 쓰임새로 알려져있다.

예제 1-32.

>>> for value in my_numbers:
...     print value
...
1
2
3
4
5

그러나, while 되풀이가 여전히 반복에서 중요한 역할을 하고 있는데, 특히 자료의 모음을 다루지 않으면서 조건식을 다루는 경우에 그러하다. 다음의 간단한 예제에서, 우리는 my_numbers의 내용을 기반으로 반복작업을 하기 위해 while 되풀이를 사용할 것이다. 참고로 len() 함수는 목록에 들어있는 원소의 갯수를 돌려준다.

예제 1-33.

>>> x = 0
>>> while x < len(my_numbers):
...     print my_numbers[x]
...     x = x + 1
...
1
2
3
4
5

이 섹션은 당신을 데려갈 것이다 각각이 두 반복 구조와 터치를 사용하여 그들의 기본시지만. while 되풀이는 상대적으로 용법이 기본적인 것에 반해, for 되풀이를 사용할 때에는 여러 다른 구현방안과 선택사항이 있다. 이번 소개 단원에서는 for 되풀이를 높은 곳에서 조망하는 관점에서 다룰 것이며, 더 깊이 들어가고 싶으면 3장을 보도록 하라.

While 되풀이

while 되풀이 구조는 제공된 조건문을 기반으로 하는 코드에 대하여 반복적인 처리를 하기 위해 사용된다. 조건이 참인 동안은, 처리가 계속 되풀이된다. 조건이 거짓으로 평가되면, 되풀이가 종료된다. while 되풀이에 대한 의사 코드는 다음과 같다.

while 참
    연산을 수행

되풀이는 while 선언으로 시작되며, 조건절을 만나서 그 식이 이면 종료된다. 각 되풀이 순서의 시작에서 식을 검사하여, 식에 들어있는 어떤 값은 되풀이 문장들 안에서 변경된다. 결국 그 값은 식을 평가하였을 때 거짓이 될 수 있도록 변경되는데, 만약 그렇게 되지 않으면 무한 되풀이가 일어나게 된다. while 되풀이 내에 존재하는 코드는 각 줄을 들여써야 한다는 점을 명심하라. 그로 인해 코드의 가독성이 유지되며, 파이썬에서 중괄호가 필요 없어진다.

예제 1-34. 자바의 While 되풀이 예제

int x = 9;
int y = 2;
int z = x – y;
while (y < x){
System.out.println("y is " + z + " less than x");
y = y++;
}

자, 파이썬으로 작성한 동일한 코드를 보자.

예제 1-35. 파이썬 While 되풀이 예제

>>> x = 9
>>> y = 2
>>> while y < x:
...     print 'y is %d less than x' % (x-y)
...     y += 1
...
y is 7 less than x
y is 6 less than x
y is 5 less than x
y is 4 less than x
y is 3 less than x
y is 2 less than x
y is 1 less than x

이 예제에서는, 되풀이를 할 때마다 y < x 조건이 평가되는 것을 볼 수 있다. 그 도중에, 우리는 y의 값을 매번 증가시켜서, 결국에는 y가 더 이상 x보다 작지 않으므로 되풀이가 종료된다.

For 되풀이

이 장에서는 for 되풀이를 살짝 건드릴 것이지만 2장이나 3장에서 목록, 사전, 튜플, 범위에 대해 논의할 때 더 깊이 탐구할 수 있다. 지금으로서는, for 되풀이는 정의된 값들의 집합을 통해 반복을 하는데 사용된다고 알고 있어야 한다. for 되풀이는 값들을 통해 반복iteration을 하는데 있어 매우 유용한데 왜냐하면 이것이 거의 어느 애플리케이션에서나 쓰이기 때문이다. 예를 들어, 데이터베이스 값들의 목록을 읽어낼 때, 그것들을 반복하며 각각을 출력해내는데에 for 되풀이를 쓸 수 있다.

for 되풀이 논리에 대한 의사 코드는 다음과 같다:

for 각각의 값 in 정의된 집합:
    연산의 묶음을 수행

의사 코드에서 볼 수 있듯이, 다른 표현식 구조에서 들여쓰기 한 것과 비슷한 방식으로 들여쓰기를 했다. 파이썬 프로그래밍 언어에서는 한결같이 이런 똑같은 들여쓰기를 실천한다. 우리는 아래에서 자바의 for 되풀이를 파이썬 구문과 비교할 것인데, 후자가 좀 더 간결한 것을 볼 수 있을 것이다.

예제 1-36. 자바 For 루프 예제

for (x = 0; x <= 10; x++){
    System.out.println(x);
}

이제, 동일한 코드를 파이썬으로 구현:

예제 1-37. 파이썬 For 루프 예제

>>> for x in range(10):
...     print x
...
0
1
2
3
4
5
6
7
8
9

이 예제에서, 우리는 아직 논의되지 않은 구문을 사용합니다. range는 파이썬의 내장 함수로서 단순히 특정한 값에서 다른 값까지의 범위를 제공한다. 예제에서, range에 10이라는 값을 넘겨주고서 0에서 10 사이의 모든 값을 돌려받았는데, 앞쪽의 0을 포함되었고 끝의 값은 제외되었다. 이것은 표현식 다음의 결과 출력에 가서 보겠다.

기본적인 키보드 입력

파이썬 언어는 사용자 입력을 허용하는 애플리케이션의 작성을 지원하기 위해 키보드 입력을 받는 한 쌍의 내장 함수를 갖고 있다. 바로 raw_input()input()을 사용하여 명령행에서 입력을 요청하고 사용자의 입력을 받아들일 수 있다. 명령행 애플리케이션과 스크립트를 만드는 것 뿐 아니라, 애플리케이션에 작은 테스트를 심는 데에도 유용하다.

raw_input() 함수는 키보드 입력을 받아서 문자열로 변환하되, 마지막의 줄바꿈 문자는 떼어낸다. 마찬가지로, input() 함수는 raw_input()처럼 키보드 입력을 받지만, 그것을 식으로 간주하여 평가한다. input() 함수는 유효한 파이썬 식이 입력될 것을 기대하므로 주의 깊게 사용해야한다. 그렇지 않으면 SyntaxError를 제기할 것이다. input()을 사용하는 것은 기본적으로 사용자가 임의의 파이썬 코드를 실행하는 것이기 때문에 보안 문제를 일으킬 수 있다. 대부분의 경우에 input()을 사용하는 것을 피하고 raw_input만 사용하는 것이 상책이다. 몇 가지 기본 예제에서 이러한 함수를 사용하는 것을 살펴보자.

예제 1-38. raw_input()과 input() 사용

# 함수 내의 텍스트는 선택사항이며, 사용자에게 프롬프트로 사용됨
>>> name = raw_input("Enter Your Name:")
Enter Your Name:Josh
>>> print name
Josh
# 사용자가 입력한 식을 평가하는 input 함수를 사용
>>> val = input ('Please provide an expression: ')
Please provide an expression: 9 * 3
>>> val
27
# 식이 제공되지 않으면 입력 함수가 에러를 제기
>>> val = input ('Please provide an expression: ')
Please provide an expression: My Name is Josh
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
My Name is Josh
^
SyntaxError: invalid syntax

raw_input() 함수를 사용하는 다른 방법의 예제가 이 책의 뒷부분에 있다. 그럼 아직까지 이 장에서 다지 않은 또 다른 파이썬 구문을 살펴보도록 하자.

다른 파이썬 구문들

애프리케이션에서 사용할 수 있는 또 다른 파이썬 구문들이 있지만, 그것들은 보다 고급의 기능을 제공하므로 나중에 다시 논의하는 것이 좋을 것 같다. 다음은 나중에 읽게 될 파이썬 구문의 목록이다.

exec - 파이썬 코드를 동적으로 실행

global - 전역 변수 참조 (4장)

with - 2.5에서 추가됨. __future__ 사용

class - 새로운 클래스 개채를 생성하거나 정의 (6장)

yield - 발생자와 함께 사용, 값을 반환 (4장)

코드 문서화

코드 문서화: 모든 애플리케이션 개발자의 삶에 있어서 짜증나도록 중요한 부분. 코드 문서화는, 쓸 데 없는 짓이라고 생각하는 사람들이 많지만, 상용 애플리케이션으로서 반드시 갖추어야하는 부분이다. 코드 문서화는 아래에서 살펴볼 몇몇 예제에서와 같이 산재된 파이썬 코드의 관리능력과 장기간에 걸친 이해를 위해서 뿐만 아니라 디버깅에서도 중요한 역할을 한다.

때때로 우리는 함수나 클래스 전체를 문서화하고 싶을 수도 있고, 어떨 때는 한두줄만 문서화하고 싶을 수도 있다. 어느 쪽이든, 파이썬은 거슬리지 않게 해낼 수 있는 방법을 제공한다. 오늘날 존재하는 다른 많은 프로그래밍 언어와 같이, 우리는 어떠한 코드 라인의 어느 부분에서나 주석을 시작할 수 있다. 원한다면 여러 줄에 걸친 주석을 달 수도 있다. 여담이지만, 우리는 해시라고도 하는 파이썬 문서 기호(#)를 사용하는 쪽이 명백한 가독성을 제공하기 때문에 이를 선호한다. 문서화를 하려고 시도하지 않는다면 코드 내에 (#) 기호가 그리 많지 않을 것이다. 다른 많은 언어에서는 (/)와 같은 기호를 사용하는데 이것은 코드를 읽기 어렵게 하고, 문서화 부분이 아닌 코드들 틈에서 눈에 잘 띄지 않는다. 그럼 파이썬에 대한 사견은 이쯤에서 접고 본론으로 들어가자.

한 줄 짜리 문서화 코드를 쓰기 위해서는, 문서 또는 주석을 그저 (#) 기호로 시작하면 된다. 이 기호는 어디에 오든, 뒤에 무엇이 따라오든 상관 없이 파이썬 컴파일러에 의해 무시되고 주석 또는 문서화로서 취급된다. 앞에 무엇이 오든 간에 그 기호는 정해진 대로 구문분석이 되는 것이다.

예제 1-39.

>>> # This is a line of documentation
>>> x = 0 # This is also documentation
>>> y = 20
>>> print x + y
20

보는 바와 같이, 파이썬 구문분석기는 # 뒤에 오는 모든 것을 무시하므로, 문서화나 주석을 우리가 필요한 대로 쉽게 붙일 수 있다.

코드 여러 줄에 대해서도 각 행의 시작 부분에서 해시를 배치하듯이 # 기호를 사용하여 쉽게 문서화할 수 있다. 그렇게 하면 특정 블록이 문서화로 멋지게 표시된다. 한편, 파이썬은 주석의 시작과 끝에 따옴표 세 개(‘’‘)를 써서 여러 줄 짜리 주석을 다는 방법도 제공한다. 이러한 형태의 여러 줄 짜리 주석은 문서화 문자열이라고 하여 모듈, 클래스, 또는 함수의 시작 부분에서만 사용할 수 있다. 코드의 시작이 아닌 다른 곳에 위치한 문자열은 문서화 문자열로 취급하지 않는다. 여러 줄 문서화에 대한 두 가지 예를 살펴보자.

예제 1-40. #으로 시작하는 여러 줄 문서

# 이 함수는 전달되어지는 임의의 값에 대한 제곱을
# 제공하기 위하여 사용된다.
# 결과는 호출하는 코드로 되돌려진다.

def square_val(value):
    return value * value
...
>>> print square_val(3)
9

예제 1-41. 여러 줄 문서 작은 따옴표 세개(‘’‘)로 묶기

def tip_calc(value, pct):
''' 이 함수는 입력되는 총 금액에 대한 비율을 근거로
    하여 팁을 계산하는 용도로 사용한다.
    이 함수에서, 첫 번째 매개변수는 계산서의 총금액이며
    팁은 두 번째 매개변수로 받는 백분율을 근거로
    계산하게 된다.'''
    return value * (pct * .01)
...
>>> print tip_calc(75,15)
11.25

그렇다. 보는 바와 같이 두 가지 문서화 방법 모두 문서화 또는 주석을 다는 일에 사용할 수 있다. 예제 1-40에서, 우리는 square_val 함수를 문서화하기 위해 # 기호로 시작하는 여러 줄의 문서를 사용했다. 예제 1-41에서는, 작은 따옴표 세개씩을 써서 여러 줄의 문서화 영역을 잡아주었다. 양쪽 모두 정의한 대로 작동한다. 그중에서도, 두번째 방법은 이름이 지어진 코드 블록을 문서화하고, help(함수) 함수를 호출함으로써 그 문서를 읽어올 수 있도록 하는 큰 이점을 제공한다. 예로써, 우리가 square_val 코드가 무엇을 하는지 알고자한다면, 우리는 코드를 찾아서 여러 줄 문서를 읽어보거나 그냥 코드를 돌려보아야 할 것이다. 하지만, tip_calc 함수가 하는 일을 알기 위해서는 help(tip_calc) 함수를 호출하면 여러 줄의 도움말이 돌아올 것이다. 이것은 굳이 코드를 열어보지 않고도 그것이 하는 일을 알 수 있도록 해주는 훌륭한 도구를 제공한다.

예제 1-42. tip_calc 함수에 대한 문서를 출력

>>> help(tip_calc)
Help on function tip_calc in module __main__:

tip_calc(value, pct)
    This function is used as a tip calculator based on a percentage
    which is passed in as well as the value of the total amount. In
    this function, the first parameter is to be the total amount of a
    bill for which we will calculate the tip based upon the second
    parameter as a percentage

이러한 사례와 짧은 설명만으로도 파이썬 언어가 제공하는 강력한 문서화에 대한 호감이 들 것이다. 보는 바와 같이, 따옴표 세개를 쓴 여러 줄 문서화는 클래스나 함수를 문서화하기에 적합하다. # 기호로 주석을 다는 것은 주석을 체계화하고 “알쏭달쏭한” 코드를 문서화하는데 제격이다.

파이썬 도움말

자이썬 번역기에서 도움말을 얻기는 아주 쉽다. 대화형 번역기에 내장된 훌륭한 help() 옵션을 사용하면 어떠한 모듈, 열쇠말 또는 파이썬 언어의 주제에 대한 정보라도 얻을 수 있다. 함수의 이름 없이 help() 함수를 호출하면 파이썬 도움말 시스템이 호출된다. help() 시스템을 사용하는데에 있어서, 그저 help()라고 타이핑하여 대화형 도움말을 호출할 수도 있고, 앞서 본 것과 같이 help(대상)을 타이핑하여 특정한 대상에 대한 도움말을 얻을 수도 있다.

대화형 모드에서 도움말 시스템을 사용하는 동안에는 손끝에서 정보가 넘쳐난다는 것을 알아두라. 직접 보고 싶다면 자이썬 대화형 번역기를 시작하고 help() 하고 쳐보도록 하라. 대화형 도움말에서 빠져나오려면 언제든지 quit 이라고 치면 된다. 모듈, 열쇠말, 주제에 대한 목록을 얻고 싶으면 “modules”, “keywords” 또는 “topics”라고 치면 전체 목록이 제공된다. 대화형 도움말 시스템 사용에 대한 도움말도 구할 수 있다. 이것은 메타 도움말이라고 불러야 할 것 같다!

자이썬 대화형 도움말 시스템이 훌륭하기는 하지만, 여전히 더 많은 도움이 필요할 것이다. 파이썬 언어에 대한 많은 책이 출판되어있으므로 도움이 될 것이다. 파이썬 판본마다 약간씩 차이가 있으므로, 책에서 특정 배포본 대한 정보를 제공하는지 확인하도록 하라. 이전 장에서 언급한 바와 같이, 자이썬의 판 번호는 항상 CPython과 대응된다. 그러니까, CPython 2.5에서 사용할 수 있는 기능은 자이썬 2.5에서도 사용할 수 있도록 되어있다.

요약

이 장에서는 기초 파이썬 프로그래밍 자료를 많이 포함하고 있다. 이것은 파이썬 프로그래밍의 핵심에 대한 기본적인 토대를 제공한다. 이 장에서는 의지 동안 delving 깊은 언어로이 책의 나머지 부분에 걸쳐 반영하는 데 사용해야한다.

우리는 CPython과 자이썬의 차이점에 대한 논의에서 출발하였다. 파이썬을 JVM에서 돌리는 여러 이점 중에서도 훌륭한 자바 라이브러리를 사용할 수 있다는 점과 우수한 배포 대상을 꼽을 수 있다. 자이썬을 설치하고 설정하는 방법을 배운 뒤에 파이썬 언어를 살펴보았다. 우리는 변수의 선언에 대해 배웠으며 이 언어의 동적인 경향을 설명했다. 그리고 우리는 예약어를 제시하였고, 파이썬 애플리케이션을 개발할 때 반드시 지켜야 할 코딩 구조에 대하여 논의하였다. 그 후, 우리는 연산자와 표현식을 논의했다. 우리는 표현은 일반적으로 가치를 생산하기 위해 평가하는 코드의 조각이라는 것을 배웠다. 우리는 기본적인 문법과 사용법을 알기 위해 파이썬 함수에 대한 짧은 나들이를 했다. 함수는 언어의 근간을 이루는 부분이며 대부분의 파이썬 개발자가 모든 프로그램에서 함수를 사용한다. 그 다음의 짧은 절에서는 클래스를 소개했는데, 6장에 더 많은 내용이 있기는 하지만 클래스의 기초를 일찍 깨우치는 것이 중요하다.우리는 구문들을 살펴보았으며, 서로 다른 작업을 애플리케이션에서 수행할 수 있도록 절차를 구성하는 것이라는 점을 배웠다. 각가의 파이썬 구문을 논의하고 예제를 보았다. 구문을 사용하여 프로그램이 작업을 되풀이하도록 반복 구조를 논의하였다.

언어의 개요 다음으로는, 키보드 입력의 사용에 대해 간단히 살펴보았다. 그것은 많은 프로그램에서 제공하는 기능이며, 기본적인 프로그램을 구축하기 위해 알아야할 중요한 부분이다. 그런 다음 문서화에 대한 약간 배웠다. 어느 애플리케이션에서나 중요한 부분이며 파이썬에서는 문서화를 쉽게 할 수 있다. 코드의 행을 문서화하는 방법 뿐만 아니라, 모듈, 함수, 클래스 전체에 대한 문서화까지 배웠다. 파이썬 help() 시스템을 간략히 다루어보았는데, 이는 언어를 배우는데에 편리한 기능이다. 잊어버린 부분을 찾아보고자하는 고급 프로그래머에게도 역시 유용할 것이다.

다음 장부터는 여기에서 논의하였던 주제들에 대하여 좀 더 깊이 있게 배우게 될 것이다. 또한 프로그램을 더 강력하고 유지하기 쉽게 만들 수 있도록 활용할 수 있는 개념과 기술을 배우도록 하겠다.