부제목


3. 파이썬을 부드럽게 소개합니다

다음 예제에서 입력과 출력은 프롬프트(">>> " 그리고 "... ")가 있고 없음으로 구분합니다: 예제를 다시 시도해 보려면 프롬프트가 나타난 후에 모조리 타자해 넣어야 합니다; 프롬프트로 시작하지 않는 줄은 인터프리터의 출력입니다. 예제 안에서 2차 프롬프트가 단독으로 나타나면 빈줄을 타자해 넣어야 한다는 뜻입니다; 이것은 여러-줄 명령어를 끝내는데 사용됩니다.

이 매뉴얼에서 많은 예제들은 상호대화 프롬프트에서 입력된 것조차도 주석이 포함되어 있습니다. 파이썬에서 주석은 해시 문자("#")로 시작합하고 물리적으로 줄 끝까지 확장됩니다. 주석은 줄 처음에 나타날 수도 있고 공백문자나 코드 다음에 나타날 수도 있지만, 문자열 기호상수 안에는 나타나지 못 합니다. 문자열 기호상수 안에서 해시 문자는 그냥 해시 문자일 뿐입니다.

몇 가지 예제는 다음과 같습니다:

# 이것은 첫 주석이다
SPAM = 1                 # 그리고 이것은 두 번째 주석이다
                         # ... 그리고 이번에는 세 번째!
STRING = "# 이것은 주석이 아니다."


3.1 파이썬을 계산기로 사용하기

간단한 파이썬 명령어들을 시험해 봅시다. 파이썬을 기동시키고 1차 프롬프트(">>> ")가 나오기를 기다립시다 (순식간에 나올 겁니다).


3.1.1 숫자

파이썬은 간단한 계산기처럼 행위합니다: 표현식을 타자해 넣으면 그 값을 인쇄해 줍니다. 표현식 구문은 눈에 보이는 그대로입니다: 연산자 +, -, * 그리고 /는 (예를 들어, 파스칼이나 C 같은) 대부분의 다른 언어와 똑 같이 작동합니다; 반괄호는 그룹을 짓는데 사용할 수 있습니다. 예를 들어:

>>> 2+2
4
>>> # 이건 주석이다
... 2+2
4
>>> 2+2  # 코드와 같은 줄에 있는 주석
4
>>> (50-5*6)/4
5
>>> # 정수 나눗셈은 바닥 값을 돌려준다:
... 7/3
2
>>> 7/-3
-3

등호("=")는 값을 변수에 할당하는데 사용됩니다. 앞으로, 다음 상호대화 프롬프트가 나타나기 전까지 어떤 결과도 화면에 표시되지 않습니다:

>>> width = 20
>>> height = 5*9
>>> width * height
900

값은 동시에 여러 변수에 할당할 수 있습니다:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0

부동소수점 수를 완벽하게 지원합니다; 피연자의 유형이 섞여 있으면 연산자는 정수를 부동소수점 수로 변환합니다:

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5

복소수도 지원됩니다; 허수는 접미사로 "j"나 "J"를 붙여 작성합니다. 0이 아닌 실수부를 가진 복소수는 "(real+imagj)"로 씌여지며, "complex(real, imag)" 함수로 만들 수 있습니다.

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)

복소수는 항상 두 개의 부동소수점 수로, 즉 실수부와 허수부로 표현됩니다. 복소수 z에서 이런 부분들을 추출하려면, z.realz.imag를 사용하세요.

>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5

부동소수점수와 정수의 변환 함수(float(), int() 그리고 long())는 복수수에는 작동하지 않습니다 -- 복소수를 실수로 올바르게 변환하는 방법은 없습니다. abs(z)를 사용하면 그의 자릿수를 (부동소수점수로) 얻을 수 있고 z.real를 사용하면 그의 실수부를 얻을 수 있습니다.

>>> a=3.0+4.0j
>>> float(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: can't convert complex to float; use abs(z)
>>> a.real
3.0
>>> a.imag
4.0
>>> abs(a)  # sqrt(a.real**2 + a.imag**2)
5.0
>>>

상호 대화 모드에서 마지막으로 인쇄된 표현식은 변수 _에 할당됩니다. 이것은 파이썬을 탁상 계산기로 사용할 때, 예를 들어 연속해서 계산하기가 더 편리하다는 뜻입니다:

>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
>>>

이 변수는 사용자가 읽기 전용으로 취급해야 합니다. 명시적으로 거기에 값을 할당하지 마세요 -- 어쩌다가 따로 같은 이름을 가진 지역 변수를 만들어 버리면 마법의 행위를 하는 이 내장 변수가 가려집니다.


3.1.2 문자열

숫자외에도 파이썬은 문자열도 조작할 수 있습니다. 이는 여러 방식으로 표현할 수 있습니다. 문자열은 홑따옴표나 겹따옴표로 감싸면 됩니다:

>>> 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'

문자열 기호상수는 여러 방식으로 여러 줄에 걸쳐 늘어날 수 있습니다. 연속 줄을 사용할 수 있는데 역사선을 줄의 마지막에 두어서 그 다음 줄이 논리적으로 연속된다고 가르쳐 주면 됩니다:

hello = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant."

print hello

새줄문자는 \n을 사용하여 여전히 문자열에 집어넣어야 합니다; 새줄문자 다음에 따르는 역사선은 버려집니다. 이 예제는 다음과 같이 인쇄될 것입니다:

This is a rather long string containing
several lines of text just as you would do in C.
    Note that whitespace at the beginning of the line is significant.

그렇지만 문자열 기호상수를 ``날(raw)'' 문자열로 만든다면, \n 연속열은 새줄문자로 변환되지 않고, 줄 끝에 있는 그 역사선 그리고 소스 안에 있는 새줄 문자는 둘 다 문자열 안에 데이터로 포함됩니다. 그리하여, 다음 예제는:

hello = r"This is a rather long string containing\n\
several lines of text much as you would do in C."

print hello

다음과 같이 인쇄됩니다:

This is a rather long string containing\n\
several lines of text much as you would do in C.

또는, 문자열을 삼중 따옴표 한 쌍(""" 또는 ''')으로 둘러 쌀 수 있습니다: 삼중-따옴표를 사용하면 줄 끝은 피신시킬 필요가 없습니다. 피신시키지 않아도 문자열 안에 포함됩니다.

print """
Usage: thingy [OPTIONS] 
     -h                        Display this usage message
     -H hostname               Hostname to connect to
"""

다음과 같이 출력됩니다:

Usage: thingy [OPTIONS] 
     -h                        Display this usage message
     -H hostname               Hostname to connect to

파이썬은 타자되어 입력된 그대로 문자열 연산의 결과를 인쇄합니다. 정확한 값을 보여주기 위하여 역사선으로 피신시킨 재미있는 문자들 그리고 따옴표와 함께 따옴표 안에 타자해 넣은 것을 그대로 보여줍니다. 문자열은 문자열 안에 홑따옴표가 하나 있고 겹따옴표가 하나도 없으면 겹따옴표로 둘러쌉니다. 그렇지 않으면 홑따옴표로 둘러쌉니다. (뒤에 기술하겠지만 print 서술문을 사용하면 따옴표를 사용하거나 피신 시키지 않고도 문자열을 쓸 수 있습니다.)

문자열은 + 연산자로 결합할(함께 붙일) 수 있고 * 연산자로 반복시킬 수 있습니다:

>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
'<HelpAHelpAHelpAHelpAHelpA>'

두 개의 문자열 기호 상수가 바로 인접해 있으면 자동으로 결합됩니다; 위에서 첫 줄은 "word = 'Help' 'A'"로 작성해도 됩니다; 이것은 두 개의 기호상수에서만 작동하지, 임의의 문자열 표현식에서는 작동하지 않습니다:

>>> 'str' 'ing'                   #  <-  이건 좋습니다
'string'
>>> 'str'.strip() + 'ing'   #  <-  이것도 좋습니다
'string'
>>> 'str'.strip() 'ing'     #  <-  이건 안됩니다
  File "<stdin>", line 1, in ?
    'str'.strip() 'ing'
                      ^
SyntaxError: invalid syntax

문자열은 첨자를 붙일 수 있습니다(지표화); C에서처럼, 문자열의 첫 문자는 첨자(지표)가 0입니다. 따로 문자 유형이란 없습니다; 하나의 문자는 그냥 길이가 1인 문자열입니다. Icon에서처럼, 부분문자열은 조각썰기 표기법으로 지정할 수 있습니다: 두 개의 지표는 쌍점으로 분리됩니다.

>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'

조각썰기 지표는 기본값이 유용합니다; 첫 지표가 생략되면 기본값이 0이고, 두 번째 지표가 생략되면 조각썰기될 문자열의 길이가 기본값입니다.

>>> word[:2]    # 앞 두 문자
'He'
>>> word[2:]    # 앞 두 문자 빼고 모두
'lpA'

C 문자열과는 다르게 파이썬 문자열은 변경되지 않습니다. 문자열에서 지표의 위치에 할당하면 에러가 일어납니다:

>>> word[0] = 'x'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> word[:1] = 'Splat'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support slice assignment

그렇지만 내용물을 조합하여 새로운 문자열을 쉽고 효율적으로 만들 수 있습니다:

>>> 'x' + word[1:]
'xelpA'
>>> 'Splat' + word[4]
'SplatA'

다음은 조각썰기 연산을 변형한 예들입니다: s[:i] + s[i:]s와 동등합니다.

>>> word[:2] + word[2:]
'HelpA'
>>> word[:3] + word[3:]
'HelpA'

엉터리 조각썰기 지표는 우아하게 처리됩니다: 너무 큰 지표는 문자열 길이로 교체되고, 하한 값보다 더 작은 상한 값은 빈 문자열을 돌려줍니다.

>>> word[1:100]
'elpA'
>>> word[10:]
''
>>> word[2:1]
''

지표는 음수가 가능합니다. 오른쪽에서부터 세기 시작합니다. 예를 들어:

>>> word[-1]     # 가장 마지막 문자
'A'
>>> word[-2]     # 마지막에서 두 번째 문자
'p'
>>> word[-2:]    # 마지막에서부터 두 문자
'pA'
>>> word[:-2]    # 마지막에서부터 두 문자를 제외하고 모두 다
'Hel'

그러나 -0은 실제로는 0과 같음에 주의하세요. 그래서 오른쪽에서부터 세지 않습니다!

>>> word[-0]     # (-0은 0과 같기 때문)
'H'

범위를 벗어난 조각썰기 지표는 잘려나갑니다. 그러나 지표를 하나만 지정한 경우는 적용되지 않습니다:

>>> word[-100:]
'HelpA'
>>> word[-10]    # error
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IndexError: string index out of range

조각썰기의 작동법을 암기하는 가장 좋은 방법은 지표가 문자 사이를 가리킨다고 생각하는 것입니다. 그러면 n개의 문자를 가진 문자열에서 마지막 문자의 오른쪽 끝은 지표가 n입니다. 예를 들어:

 +---+---+---+---+---+ 
 | H | e | l | p | A |
 +---+---+---+---+---+ 
 0   1   2   3   4   5 
-5  -4  -3  -2  -1

숫자의 첫 줄은 문자열에서 지표가 0...5입니다; 두 번째 줄은 상응하는 음의 지표입니다. i에서 j까지의 조각은 각각 ij 사이의 모든 문자열로 구성됩니다.

양의 지표라면 조각의 길이는 지표 사이의 차입니다. 예를 들어, word[1:3]의 길이는 2입니다.

내장 함수 len()은 문자열의 길이를 돌려줍니다:

>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34

다음 참조:

연속열 유형
문자열과 다음 섹션에서 기술할 유니코드는 연속열 유형의 예이며, 일반적인 연산을 공통적으로 모두 지원합니다.
문자열 메쏘드
문자열과 유니코드 문자열은 기본적인 변환과 검색을 위한 메쏘드를 많이 지원합니다.
문자열 형식화 연산
문자열과 유니코드 문자열이 % 연산자의 왼쪽 피연산자일 때 요청되는 형식화 연산은 여기에서 더 자세하게 다룹니다.


3.1.3 유니코드 문자열

파이썬 2.0에서부터 프로그래머는 텍스트 데이터를 저장하는데 새로운 데이터 유형을 사용할 수 있습니다: 유니코드 객체가 바로 그것입니다. 유니코드 객체는 유니코드 데이터를 저장하고 조작하는데 사용할 수 있습니다 (http://www.unicode.org/ 참조) 그리고 기존의 문자열 객체와 통합이 잘 되어 있어서, 필요하면 자동으로 변환시켜 줍니다.

유니코드는 현대의 텍스트와 고대의 텍스트에 사용된 모든 문자들에 대하여 한가지 서수체계를 제공하는 장점이 있습니다. 예전에는 스크립트 문자에 겨우 256개의 서수만 가능했었습니다. 텍스트는 전형적으로 서수들이 스크립트 문자들에 짝짓기되어 있는 한 코드 페이지에 묶입니다. 이 때문에 아주 혼란스러운데 특히 소프트웨어의 국제화에 관하여 그렇습니다 (보통 "i18n"로 표기됨 -- "i" + 18개의 문자 + "n"). 유니코드는 모든 스크립트에 대하여 한 개의 코드 페이지를 정의하여 이런 문제들을 해결해 줍니다.

파이썬에서 유니코드 문자열을 작성하는 것은 그냥 간단하게 보통의 문자열을 만드는 것과 같습니다:

>>> u'Hello World !'
u'Hello World !'

홑따옴표 앞에 있는 소문자 "u"는 유니코드 문자열로 만들라는 뜻입니다. 특수 문자를 문자열 안에 포함시키고 싶으면, 파이썬 Unicode-Escape 인코딩을 사용하면 됩니다. 다음 예제가 그 방법을 보여줍니다:

>>> u'Hello\u0020World !'
u'Hello World !'

피신 연속열 \u0020는 서수 값 0x0020으로 유니코드 문자(공간 문자)를 주어진 위치에 삽입하라는 뜻입니다.

다른 문자들은 각각의 서수 값을 유니코드 서수처럼 직접적으로 사용하여 해석됩니다. 기호상수 문자열을 서구 사회에서 주로 사용되는 표준 Latin-1 인코딩으로 가지고 있다면, 유니코드의 아래쪽 256 문자가 Latin-1의 256 문자와 같다는 사실을 알면 편리할 것입니다.

전문가를 위해서 보통의 문자열과 똑 같은 날 모드도 있습니다. 여는 따옴표 'ur'을 접두사로 앞에 두어서 파이썬이 Raw-Unicode-Escape 인코딩을 사용하도록 지시하면 됩니다. 소문자 'u' 앞에 역사선이 홀수 개 있다면 위의 \uXXXX 변환만 적용됩니다.

>>> ur'Hello\u0020World !'
u'Hello World !'
>>> ur'Hello\\u0020World !'
u'Hello\\\\u0020World !'

날 모드는 정규 표현식과 같이 수 많은 역사선을 입력해야 할 경우 아주 유용합니다.

이런 표준 인코딩 말고도 파이썬은 알려진 인코딩을 기반으로 하여 다른 방식으로 유니코드 문자열을 만드는 방법을 많이 제공합니다.

내장 함수 unicode()를 사용하면 등록된 모든 유니코드 코덱에 접근할 수 있습니다 (COders 그리고 DECoders). 이런 코덱을 변환할 수 있는 좀 알려진 인코딩으로는 Latin-1, ASCII, UTF-8, 그리고 UTF-16가 있습니다. 뒤의 두 인코딩은 가변-길이 인코딩으로서 각 유니코드 문자를 여러 바이트로 저장합니다. 기본 인코딩은 보통 ASCII로 설정되는데, 이 인코딩은 0에서 127 사이의 문자는 통과시키고 다른 문자들은 에러를 내며 거부합니다. 유니코드 문자열이 인쇄되거나 파일에 씌여지거나 또는 str()로 변환되면, 이 기본 인코딩을 사용하여 변환됩니다.

>>> u"abc"
u'abc'
>>> str(u"abc")
'abc'
>>> u"äöü"
u'\xe4\xf6\xfc'
>>> str(u"äöü")
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

유니코드 문자열을 8-비트 문자열로 특정 인코딩을 사용하여 변환하려면, 유니코드 객체에 encode() 메쏘드가 제공됩니다. 이 메쏘드는 인자 한 개, 즉 인코딩 이름을 받습니다. 인코딩에는 소문자 이름이 더 좋습니다.

>>> u"äöü".encode('utf-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'

특정 인코딩으로된 데이터가 있고 그에 상응하는 문자열을 생산하고 싶다면, 인코딩 이름을 두 번째 인자로 하여 unicode() 함수를 사용하면 됩니다.

>>> unicode('\xc3\xa4\xc3\xb6\xc3\xbc', 'utf-8')
u'\xe4\xf6\xfc'


3.1.4 리스트

파이썬은 다른 값을 함께 그룹 짓는데 사용되는, 수 많은 복합 데이터 유형을 이해합니다. 가장 다재다능한 복합 데이터 유형은 list로서, 각 괄호 사이에 값(항목)들을 쉼표로 분리하여 넣으면 됩니다. 리스트 항목은 모두 유형이 같을 필요가 없습니다.

>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]

문자열 지표처럼, 리스트 지표도 0에서 시작하며, 조각썰기가 가능하고, 결합이 가능합니다. 등등:

>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boo!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']

변경불가능한(immutable) 문자열과는 다르게, 리스트의 요소들을 따로 따로 바꿀 수 있습니다:

>>> a
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]

조각썰기에 할당하는 것도 가능하며, 이렇게 하면 리스트의 크기도 바꿀 수 있으며 완전히 비울 수도 있습니다:

>>> # 원소 교체:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # 원소 제거:
... a[0:2] = []
>>> a
[123, 1234]
>>> # 원소 삽입:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # 끝에 자신(사본) 삽입 
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # 리스트 비우기: 빈 리스트로 모든 요소 교체
>>> a[:] = []
>>> a
[]

내장 함수 len()도 리스트에 적용됩니다:

>>> len(a)
8

리스트를 내포시키는 것(리스트 안에 다른 리스트를 넣는 것)이 가능합니다 , 예를 들어:

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')     # 섹션 5.1 참조
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']

지난 예제에서 p[1]q는 실제로 같은 객체를 가리키고 있음을 주의하세요! 나중에 객체의 의미구조(object semantics)를 다시 살펴보겠습니다.


3.2 프로그래밍을 향한 첫 발걸음

물론, 2에 2를 더하는 일 말고 파이썬을 보다 복잡한 작업에 사용할 수 있습니다. 예를 들면, 피보나치(Fibonacci) 수열의 초기 부분-문자열을 다음과 같이 작성할 수 있습니다:

>>> # 피보나치 수열:
... # 두 원소의 합이 다음 수를 정의한다
... a, b = 0, 1
>>> while b < 10:
...       print b
...       a, b = b, a+b
... 
1
1
2
3
5
8

이 예제는 여러가지 새로운 특징을 소개합니다.

변경 제안에 관한 정보는 이 문서에 관하여를 참조.