본문으로 건너뛰기

입력은 늘 글자

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

목차

input()은 키보드로 친 글자를 받아 문자열로 돌려줍니다. 수를 쳐도 문자열이라, 계산하려면 int()나 float()로 수로 바꿔야 합니다.

지금까지의 예제는 값을 코드에 직접 적었습니다. 잔 수가 바뀔 때마다 코드를 고쳐야 했습니다. input()을 쓰면 프로그램이 실행 중에 묻고, 사람이 친 값으로 계산합니다. 그런데 키보드로 친 20은 수가 아니라 글자 '20'으로 들어옵니다. 그대로 두 배를 하면 40이 아니라 2020이 찍힙니다.

5단계 중 1단계. 1번 줄: input이 '나이: '를 찍고 기다립니다. 20을 치고 Enter를 누르면 친 글자가 문자열 '20'이 되고, 이름 age가 그 값에 붙습니다.

1input()은 친 글자를 문자열로 돌려준다

input('이름: ')은 괄호 안의 글(프롬프트)을 찍고 기다립니다. 글자를 치고 Enter를 누르면, 친 글자가 문자열 값 하나가 되어 그 자리에 놓이고 이름이 그 값에 붙습니다(규칙 2). 아래는 민지를 넣고 Enter를 친 결과입니다.

name = input('이름: ')
print(name + '님, 안녕하세요')넣는 값민지
실행 결과
이름: 민지
민지님, 안녕하세요

결과 첫 줄의 '민지'는 프로그램이 찍은 글자가 아니라 키보드로 친 글자입니다. 프롬프트는 줄을 바꾸지 않고 찍혀서, 친 글자가 그 뒤에 이어 보입니다. 출력을 맞혀 볼 때는 넣은 값이 이 자리에 함께 보인다는 것을 빼먹지 않습니다. 이 과목의 입력 예제는 넣은 값을 본문에 적어 둡니다.

2수를 넣어도 문자열이다

input()은 무엇을 치든 문자열을 돌려줍니다. 20을 넣으면 무엇이 찍힐까요?

age = input('나이: ')
print(age * 2)
print(type(age))넣는 값20
실행 결과 보기
실행 결과
나이: 20
2020
<class 'str'>

예상과 다르면 그곳이 배울 곳입니다. age가 붙은 값은 수 20이 아니라 글자 '20'입니다. 글자 * 2는 두 번 이어 붙이기라 2020이 찍히고, type()도 str이라고 알려 줍니다.

3int()·float()로 수로 바꾸기

int()는 정수 꼴의 글자를 읽어 정수 값을 만들고, float()는 소수점이 있는 글자도 읽어 실수 값을 만듭니다. 바꾼 값에 이름을 다시 붙이면 그다음부터 수로 계산됩니다. 아래는 20을 넣은 결과입니다.

age = input('나이: ')
age = int(age)
print(age * 2)
print(float('3.5') * 2)넣는 값20
실행 결과
나이: 20
40
7.0

2번 줄은 글자 '20'으로 수 20이라는 새 값을 만들고, 이름 age를 그 수로 옮겨 붙입니다(규칙 3). 그래서 3번 줄의 * 2는 곱하기입니다.

정수 꼴이 아닌 글자는 int()가 읽지 못합니다. 아래는 3.5를 넣은 결과입니다.

text = input('잔 수: ')
count = int(text)넣는 값3.5
실행 결과
잔 수: 3.5Traceback (most recent call last):  File "main.py", line 2, in <module>    count = int(text)ValueError: invalid literal for int() with base 10: '3.5'

ValueError는 종류는 맞지만 값을 쓸 수 없다는 오류입니다. 설명은 '10진 정수로 읽을 수 없는 글자'라는 뜻이고, 끝에 받은 글자 '3.5'를 보여 줍니다. 이 오류 메시지에는 ^ 표시 줄이 없습니다. int(text) 부르기 자체에서 오류가 나 가리킬 곳이 그 부르기 전체라, 파이썬 3.13부터는 표시를 생략합니다. 이때는 line 2로 줄을 찾습니다. 2번 줄에서 멈췄으니, 1번 줄에서 무엇이 들어왔는지 봅니다. 소수점이 있는 글자는 float()로 읽습니다. 정수가 꼭 필요하면 int(float(text))처럼 실수로 먼저 바꾼 뒤 int()를 씁니다.

int()에 실수를 넣으면 소수점 아래를 버립니다. 반올림하지 않습니다.

print(int(3.9))
print(int(float('3.5')))
실행 결과
3
3

예제

'입력 받아 계산'은 입력 받기 → 수로 바꾸기 → 계산하기 → 찍기 네 걸음으로 씁니다. 커피 잔 수를 물어 합계를 찍습니다. 아래는 2를 넣은 결과입니다.

price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = int(text)
# 3. 계산하기
total = price * count
# 4. 찍기
print('합계', total)넣는 값2
실행 결과
커피 몇 잔? 2
합계 8000

3번 줄의 text는 글자 '2'입니다. 5번 줄이 그 글자로 수 2라는 새 값을 만들고, 그 값에 count를 붙입니다. 1번 줄의 price는 처음에 한 번 두고 바꾸지 않는 고정값입니다.

자주 틀리는 곳

틀린 생각: 수를 치면 input()이 수를 돌려준다.

키보드로 친 것이 숫자라 수가 들어온다고 보기 쉽지만, input()은 무엇을 치든 문자열을 돌려줍니다. 아래는 20을 넣은 결과입니다.

age = input('나이: ')
print(age * 2)
print(int(age) * 2)넣는 값20
실행 결과
나이: 20
2020
40

2번 줄의 age는 글자 '20'이라 * 2가 두 번 이어 붙이기이고, 3번 줄은 int(age)가 만든 수 20을 곱해 40입니다.

맞는 규칙: input()은 친 글자를 늘 문자열로 돌려줍니다. 계산하기 전에 int()나 float()로 수를 만듭니다.

틀린 생각: int()는 실수를 반올림해 정수로 만든다.

3.9는 4에 훨씬 가까워 4가 될 것 같지만, int()는 반올림하지 않습니다.

print(int(3.9))
실행 결과
3

맞는 규칙: int()는 실수의 소수점 아래를 버려 정수를 만듭니다. 그래서 3.9도 3.1도 3이 됩니다.

틀린 생각: int()는 소수점이 있는 글자도 읽어 정수로 만든다.

int(3.9)가 3이 되니 int('3.5')도 3이 될 것 같지만, 3절에서 본 것처럼 ValueError로 멈춥니다.

맞는 규칙: int()가 글자에서 읽는 것은 '20' 같은 정수 꼴뿐입니다. 소수점이 있는 글자는 int(float(text))처럼 float()로 먼저 읽은 뒤 int()를 씁니다.

확인 문제

1. 예제에 2 대신 3을 넣었습니다. 무엇이 찍힐까요? 마지막 줄까지 화면 그대로 쓰세요.

price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = int(text)
# 3. 계산하기
total = price * count
# 4. 찍기
print('합계', total)넣는 값3
힌트

3번 줄의 input()이 화면에 무엇을 남기는지부터 보세요.

정답

모두 2줄입니다.

실행 결과
커피 몇 잔? 3
합계 12000

친 3이 프롬프트 뒤에 보이고, int()가 수 3으로 바꿔 4000 곱하기 3이 12000입니다.

흔한 오답은 첫 줄을 빼고 합계 12000만 쓴 답입니다. 프롬프트와 친 값은 화면에 남지 않는다고 본 것입니다.

2. 예제의 '2. 수로 바꾸기' 줄을 비웠습니다. 2를 넣으면 합계 8000이 찍히도록 빈칸을 채우세요.

price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = ____
# 3. 계산하기
total = price * count
# 4. 찍기
print('합계', total)
힌트

3번 줄의 input()이 돌려주는 값의 종류부터 정하세요. 빈칸 위 주석이 그 값으로 할 일입니다.

정답

int(text)입니다. 아래는 2를 넣은 결과입니다.

price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = int(text)
# 3. 계산하기
total = price * count
# 4. 찍기
print('합계', total)넣는 값2
실행 결과
커피 몇 잔? 2
합계 8000

3절에서 본 int(float(text))도 글자 '2'로 수 2를 만들어 맞습니다. 2를 직접 써도 2를 넣을 때는 같은 화면이 찍히지만, 다른 수를 넣어도 늘 합계 8000이 찍힙니다.

흔한 오답은 text입니다. text가 붙은 값이 이미 수라고 본 것입니다(문자열과 수를 가리지 않는 생각). 그러면 count가 글자 '2'라 7번 줄의 price * count가 '2'를 4000번 이어 붙인 긴 글자를 만듭니다.

3. 걸음 수를 두 번 묻습니다. 어제 3000, 오늘 2000을 넣었습니다. 무엇이 찍힐까요? 네 줄을 글자 그대로 쓰세요.

before = input('어제: ')
today = input('오늘: ')
print(before + today)
print(int(before) + int(today))넣는 값30002000
힌트

3번 줄과 4번 줄의 차이는 int()가 있느냐입니다. 넣은 값이 보이는 두 줄도 잊지 마세요.

정답
실행 결과
어제: 3000
오늘: 2000
30002000
5000

before와 today는 글자 '3000'과 '2000'이라 3번 줄의 +는 이어 붙이기입니다. 4번 줄은 둘 다 수로 바꿔 더해 5000입니다.

흔한 오답은 셋째 줄의 5000입니다. 넣은 값이 수로 들어온다고 본 것입니다(문자열과 수를 가리지 않는 생각).

아래 1절 코드의 넣는 값을 민지에서 20으로 바꾸면 찍히는 두 줄을 봅니다.

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

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

파이썬 목차로