본문으로 건너뛰기

문자열 잇기와 되풀이

파이썬 목차수와 글자레슨 9 / 59

목차

문자열은 글자를 차례로 늘어놓은 값입니다. +로 두 문자열을 이어 새 문자열을 만들고, *로 되풀이하고, len()으로 글자 수를 셉니다.

주문 문구 '커피 두 잔'은 메뉴 이름에 수량 문구를 이어 붙여 만들고, 영수증의 구분선은 '-' 한 글자를 여러 번 되풀이해 만듭니다. 그런데 문구에 수를 넣으려 하면 오류가 납니다. 수는 글자가 아니기 때문입니다. 이 레슨은 문자열을 잇고 세는 법과, 수를 문자열로 바꿔 잇는 법을 봅니다.

5단계 중 1단계. 1번 줄: 문자열 '커피'는 글자 두 칸입니다. 이름 drink가 이 값에 붙습니다.

1잇기와 되풀이

두 문자열 사이의 +는 앞 문자열의 글자 뒤에 뒤 문자열의 글자를 차례로 이어 새 문자열 하나를 만듭니다.

drink = '커피'
msg = drink + ' 두 잔'
print(msg)
print(drink + '두 잔')
print(drink)
실행 결과
커피 두 잔
커피두 잔
커피

+는 빈칸을 넣어 주지 않습니다. 2번 줄은 ' 두 잔'의 맨 앞에 빈칸이 있어 '커피 두 잔'이 되고, 4번 줄은 빈칸 없이 붙어 '커피두 잔'이 됩니다. 이어 붙인 결과는 새 값입니다. 오른쪽이 새 문자열 하나로 계산되고 이름 msg가 그 값에 붙을 뿐이라(규칙 2), 5번 줄의 drink는 그대로 '커피'입니다.

문자열에 정수를 곱하면 그 문자열을 그만큼 되풀이해 잇습니다. 구분선을 그릴 때 씁니다.

print('-' * 10)
print('커피' * 2)
실행 결과
----------
커피커피

2len()으로 글자 수 세기

len()은 문자열의 글자 수를 셉니다. 아래 두 줄은 무엇을 찍을까요?

print(len('안녕'))
print(len('커피 두 잔'))
실행 결과 보기
실행 결과
2
6

예상과 다르면 그곳이 배울 곳입니다. 한글 한 자는 한 글자이고, 빈칸도 한 글자입니다. '커피 두 잔'은 한글 넷과 빈칸 둘이라 6입니다. 따옴표 사이에 아무것도 없는 빈 문자열 ''의 글자 수는 0입니다.

수에는 글자 수가 없습니다. 가격의 자릿수를 세려고 수를 그대로 넣으면 오류가 납니다.

price = 4000
print(len(price))
실행 결과
Traceback (most recent call last):  File "main.py", line 2, in <module>    print(len(price))          ~~~^^^^^^^TypeError: object of type 'int' has no len()

맨 아래 줄은 'int(정수)에는 len()이 없다'는 뜻입니다. 2번 줄에서 멈췄고, 넣은 price가 1번 줄에서 수 4000에 붙었습니다. 자릿수가 필요하면 다음 절의 str()로 먼저 글자로 바꿉니다.

3수를 이으려면 str()

문자열에 수를 +로 바로 이을 수는 없습니다. '수와 글자' 레슨에서 본 TypeError가 납니다.

label = '나이: '
age = 20
print(label + age)
실행 결과
Traceback (most recent call last):  File "main.py", line 3, in <module>    print(label + age)          ~~~~~~^~~~~TypeError: can only concatenate str (not "int") to str

str()은 값을 받아 그 값을 글자로 적은 새 문자열을 만듭니다. str(20)은 글자 두 개짜리 문자열 '20'입니다. 수를 이으려면 먼저 str()로 바꿉니다.

label = '나이: '
age = 20
print(label + str(age))
print(len(str(4000)))
실행 결과
나이: 20
4

age는 그대로 수 20에 붙어 있습니다. str(age)가 만든 새 문자열 '20'이 label 뒤에 이어졌을 뿐입니다. 4번 줄은 4000을 글자 '4000'으로 바꾼 뒤 세어 4입니다.

예제

영수증의 주문 한 줄을 구분선 사이에 찍습니다. 구분선은 *, 수량 문구는 str()과 +로 만듭니다.

line = '-' * 12
item = '커피'
count = 2
cups = str(count) + '잔'
print(line)
print(item + ' ' + cups)
print(line)
실행 결과
------------
커피 2잔
------------

4번 줄이 수 2를 글자 '2'로 바꿔 '잔'과 이어 '2잔'을 만듭니다. 6번 줄은 메뉴와 수량 사이에 빈칸 ' '을 직접 끼워 넣습니다. +는 빈칸을 저절로 넣지 않기 때문입니다.

자주 틀리는 곳

틀린 생각: 문자열 뒤에 수를 +로 바로 이을 수 있다.

'커피' 뒤에 2를 붙여 '커피2'를 만들고 싶을 때 그대로 잇기 쉽지만, +는 문자열과 수를 잇지 못합니다.

drink = '커피'
print(drink + 2)
실행 결과
Traceback (most recent call last):  File "main.py", line 2, in <module>    print(drink + 2)          ~~~~~~^~~TypeError: can only concatenate str (not "int") to str

2번 줄에서 글자에 붙은 drink 뒤에 수 2를 이으려다 TypeError로 멈췄습니다. drink + str(2)처럼 str()이 만든 글자 '2'를 이으면 '커피2'가 찍힙니다.

맞는 규칙: +는 문자열끼리만 이어서, 수를 만나면 TypeError로 멈춥니다. 수를 이으려면 str()로 그 수를 적은 새 문자열을 만들어 잇습니다.

틀린 생각: len()은 한글 한 자를 두 글자로 센다.

한글이 화면에서 영어 글자보다 넓어 보여 len('안녕')을 4로 쓰기 쉽지만, len()은 화면 폭을 재지 않습니다.

print(len('안녕'))
실행 결과
2

'안녕'은 '안'과 '녕' 두 글자라 2입니다.

맞는 규칙: len()은 화면 폭이 아니라 글자 수를 세고, 키보드로 친 한글 한 자도 영어 한 자처럼 한 글자입니다.

틀린 생각: 빈칸은 글자가 아니다.

빈칸은 눈에 보이지 않아 글자 수에서 빼거나, +가 알아서 넣어 준다고 보기 쉽습니다. 그러나 빈칸도 한 글자입니다.

print(len('a b'))
print('커피' + '두 잔')
실행 결과
3
커피두 잔

'a b'는 a, 빈칸, b 세 글자라 3입니다. 2번 줄은 '커피'와 '두 잔' 사이에 빈칸을 쓰지 않아 붙어 찍힙니다.

맞는 규칙: 빈칸도 한 글자라 len()이 세고, +는 따옴표 안에 쓴 글자만 잇습니다. 빈칸이 필요하면 따옴표 안에 직접 넣습니다.

확인 문제

1. 예제의 1번 줄을 line = '-=' * 4로 바꿨습니다. 무엇이 찍힐까요? 세 줄을 글자 그대로 쓰세요.

line = '-=' * 4
item = '커피'
count = 2
cups = str(count) + '잔'
print(line)
print(item + ' ' + cups)
print(line)
힌트

* 왼쪽에 있는 문자열의 글자 수를 봅니다.

정답
실행 결과
-=-=-=-=
커피 2잔
-=-=-=-=

'-=' * 4는 '-=' 두 글자를 네 번 이어 8글자가 됩니다. 가운데 줄은 그대로입니다.

흔한 오답은 ----====입니다. 글자마다 따로 되풀이한다고 본 것입니다. *는 문자열 전체를 통째로 되풀이합니다.

2. 다음 코드가 커피2잔을 찍도록 빈칸을 채우세요.

count = 2
cups = ____ + '잔'
print('커피' + cups)
힌트

1번 줄에서 count가 붙은 값의 종류를 보고, 2번 줄 + 오른쪽의 '잔'과 견줘 봅니다.

정답

str(count)입니다.

count = 2
cups = str(count) + '잔'
print('커피' + cups)
실행 결과
커피2잔

'2'를 직접 써도 같은 글자가 찍히지만, count가 3으로 바뀌면 따라 바뀌지 않습니다. 뒤에서 배울 f'{count}'도 count가 붙은 값으로 글자를 만들어 맞습니다.

흔한 오답은 count입니다. 수 2를 글자처럼 이을 수 있다고 본 것입니다(문자열과 수를 가리지 않는 생각). 그대로 이으면 TypeError로 멈춥니다.

3. 시험 점수를 문자열로 바꿔 다룹니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.

score = 95
text = str(score)
print(text * 2)
print(len(text))
힌트

2번 줄의 str()이 만드는 값의 종류부터 정합니다.

정답
실행 결과
9595
2

글자 '95'를 두 번 이어 '9595'이고, '95'는 두 글자라 len()이 2입니다.

흔한 오답은 첫 줄의 190입니다. text를 수로 본 것입니다(문자열과 수를 가리지 않는 생각).

아래 예제 코드의 4번 줄을 cups = str(count) * 2 + '잔'⁠으로 바꾸면 찍히는 세 줄을 봅니다.

처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로