3.1.2 Strings
파이썬에서는 숫자 외에도 다양한 문자열을 사용할 수 있습니다. 문자열은 작은따옴표나 큰 따옴표로 묶어서 표현합니다. 둘 중 어느것을 써도 결과는 같습니다.2 \
는 '탈출 부호'(excape quotes)로 사용됩니다.
>>> '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.'
대화형 인터프리터에서 결과로 출력되는 문자열은 따옴표로 둘러싸여 나타납니다. 특수문자는 백슬래시를 써서 탈출시킵니다. 때로 입력한 값과 출력한 값을 감싸는 따옴표가 달라질 수 있지만, 따옴표가 달라도 그 값은 동일합니다. 문자열 안에 작은 따옴표가 포함되어야 하면 문자열을 큰 따옴표로 둘러싸고, 문자열 안에 큰 따옴표가 있는 경우 작은 따옴표로 바깥을 둘러쌉니다. print()
함수는 문자열을 둘러싸는 따옴표를 생략해주고, 탈출하거나 특수한 문자를 출력해줍니다.
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
>>> print('"Isn\'t," she said.')
"Isn't," she said.
>>> s = 'First line.\nSecond line.' # \n 은 줄바꿈을 의미합니다.
>>> s # print()함수가 없는 경우, \n은 출력값에 포함됩니다.
'First line.\nSecond line.'
>>> print(s) # print()함수와 함게 사용하면, \n은 줄바꿈으로 작동합니다.
First line.
Second line.
특수문자 앞에 역슬래시 \를 사용하면 문제가 생기는 경우, 첫번째 따옴표 앞에 r
을 넣어 원시 문자열을 이용할 수 있습니다.
>>> print('C:\some\name') # 여기서 \n 은 줄바꿈으로 작동합니다.
C:\some
ame
>>> print(r'C:\some\name') # 부호 앞쪽의 r에 주의하십시오.
C:\some\name
따옴표를 세개씩 사용하면 문자열을 여러줄에 걸쳐 사용할 수 있습니다. 줄의 끝이 문자열에 자동으로 포함되지만, 역슬래시를 줄의 끝에 추가하여 해결할 수 있습니다.
print("""\
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
""")
위의 예시는 다음과 같은 결과를 보여줍니다. 위 예시에서 print("""
다음에 역슬래시\
를 추가하여 첫 줄을 결과에 포함시키지 않은 것을 눈여겨 봅니다.
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
문자열은 연산기호 +
를 이용해 연결할 수 있습니다. 연산기호*
를 이용하면 문자열이 반복됩니다.
>>> # 3 times 'un', followed by 'ium'
>>> 3 * 'un' + 'ium'
'unununium'
두 개 또는 그 이상의 문자열들이 연이어 쓰인 경우 자동으로 연결된다.
>>> 'Py' 'thon'
'Python'
자동연결은 변수나 표현식에는 적용되지 않는다.
>>> prefix = 'Py'
>>> prefix 'thon' # prefix라는 변수와 'thon'이라는 문자열은 자동으로 연결되지 않는다.
...
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
...
SyntaxError: invalid syntax
변수들을 연결하거나 변수와 문자열을 연결하려면 +
를 사용한다.
>>> prefix + 'thon'
'Python'
이러한 규칙은 우리가 긴 문자열을 쪼갤 때 유용하다.
>>> text = ('Put several strings within parentheses '
... 'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'
문자열의 글자 하나하나는 배열순서에 따라 번호가 붙어있다.(= index = 색인) 번호는 0부터 세기 시작한다. 글자 하나는 크기가 1인 문자열이라고 볼 수도 있다.
>>> word = 'Python'
>>> word[0] # 0번 자리(첫번째 자리)에 있는 글자
'P'
>>> word[5] # 5번 자리(여섯번째 자리)에 있는 글자
'n'
마이너스를 사용하면 순서를 오른쪽에서부터 센다.
>>> word[-1] # -1은 오른쪽 첫번째 글자를 가리킨다.
'n'
>>> word[-2] # -2는 오른쪽에서 두번째 글자를 가리킨다.
'o'
>>> word[-6]
'P'
-0은 0과 같다. 따라서 음수(=마이너스)를 이용해 글자의 순서를 셀 때는 -1부터 시작한다.
우리는 인덱스를 이용해 문자열에서 원하는 부분만 잘라낼 수도 있다.(=슬라이싱) 인덱스만 사용하면 글자 하나가 떨어져 나오지만, 슬라이싱은 또다른 문자열을 가져온다.
>>> word[0:2] # 0번 자리부터 2번 자리 앞까지 (2번 자리는 포함하지 않는다.)
'Py'
>>> word[2:5] # 2번 자리부터 5번 자리 앞까지 (5번 자리는 포함하지 않는다.)
'tho'
앞쪽 인덱스는 언제나 포함되고, 뒤쪽 인덱스는 언제나 제외된다. 따라서 s[:i]+s[i:]
는 언제나 s
와 같다. (여기서 s는 sentence의 약자로 추측되는 변수이다. 아래 예시에서는 word.)
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'
인덱스를 이용한 슬라이싱은 유용한 기본규칙을 가지고 있다. 슬라이싱을 할 때 앞쪽 인덱스를 생략하면 0으로 처리된다. 뒤쪽 인덱스를 생략하면 문자열의 끝까지 슬라이싱에 포함된다.
>>> word[:2] # 0번 자리(첫번째 글자)부터 2번 자리(세번째 글자)앞쪽까지 (세번째 글자 제외)
'Py'
>>> word[4:] # 4번 자리(다섯번째 글자)부터 문자열 끝까지
'on'
>>> word[-2:] # 오른쪽에서 2번 자리부터 문자열 끝까지
'on'
인덱스가 작용하는 방식을 기억하려면 인덱스가 각 글자의 모서리(=edge)를 가리키는 것으로 생각하면 쉽다. 첫 번째 글자의 왼쪽 모서리는 0번, 첫 번째 글자와 두 번째 글자의 사이(두 번째 글자의 모서리)는 1번이다.
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
위 예시의 주황색 숫자 첫 줄은 문자열의 인덱스를 보여준다. 주황색 숫자 두 번째 줄은 음수를 이용한 인덱스이다. 만약 i 와 j를 이용하여 슬라이싱을 한다면, i의 왼쪽 모서리부터 j의 왼쪽 모서리 안에 포함된 글자가 잘려나온다.
슬라이스를 할 때, 앞 뒤 인덱스가 모두 양수이면 슬라이스의 길이는 인덱스와 다르다. 예를 들어, word[1:3]
의 길이는 2
이다.
너무 큰 인덱스를 사용하면 문제가 생긴다.
>>> word[42] # word는 6개의 글자만 가지고 있다.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
참고) stdin = standard input
하지만 글자수를 벗어난 인덱스가 슬라이싱에서는 정상적으로 작동할 수도 있다.
>>> word[4:42]
'on'
>>> word[42:]
''
파이썬의 문자열은 한 번 설정되면 수정할 수 없다. 따라서 인덱스를 이용해 어떤 값을 지정하면 문제가 생긴다.
>>> word[0] = 'J'
...
TypeError: 'str' object does not support item assignment
# 타입에러 : 문자열은 수정이 불가능합니다.
>>> word[2:] = 'py'
...
TypeError: 'str' object does not support item assignment
# # 타입에러 : 문자열은 수정이 불가능합니다.
참고) str = string = 문자열
만약 다른 문자열이 필요하다면 우리는 새로 문자열을 만들어야 한다.
>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'
파이썬에 기본적으로 미리 저장되어 있는 함수(=내장함수)인 len()
은 문자열의 길이(총 글자수)를 알려준다.
참고)
Built-In Funcion = BIF = 내장함수
len = length
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
See also : Text Sequence Type — str
Strings are examples of sequence types, and support the common operations supported by such types.
String Methods
Strings support a large number of methods for basic transformations and searching.
Format String Syntax
Information about string formatting with str.format().
printf-style String Formatting
The old formatting operations invoked when strings and Unicode strings are the left operand of the % operator are described in more detail here.
위 네 개 항목은 원본 문서에서는 링크가 걸려 있으나, 이 글에서는 아직 처리하지 못한 상태이다.
각주2
파이썬에서는 다른 프로그래밍 언어들과 다르게 \n
과 같은 특별한 문자들도 작은 따옴표, 큰 따옴표와 같은 의미이다. 유일한 차이점은, 작은 따옴표로 문자열을 나타내면 굳이 큰 따옴표를 문자열 안에 사용하기 위해 다른 문자를 사용할 필요가 없다는 것이다. 큰 따옴표로 문자열을 나타낸 경우에도 작은 따옴표를 그 안에 사용할 수 있다.