f-문자열(f-string)은 따옴표 앞에 f를 붙인 문자열입니다. 중괄호 {} 자리에 이름이나 식의 값이 들어가고, 콜론 뒤에 ,나 .1f를 붙이면 천 단위 쉼표와 소수 자리까지 모양을 맞춰 찍습니다.
+와 str()로 문구를 만들면 item + ' ' + str(price) + '원'처럼 따옴표와 기호가 늘어 읽기 어렵습니다. 4000을 4,000으로 찍을 방법도 없습니다.
f-문자열은 찍을 글을 한 덩어리로 쓰고 값이 들어갈 자리만 중괄호로 비워 둡니다. 영수증처럼 모양이 정해진 출력을 쓸 때 가장 많이 씁니다.
이 단원(문자열 다루기)을 이미 안다면 단원 연습 문제부터 풀고 틀린 레슨만 보세요.
1중괄호 자리에 값이 들어간다
따옴표 앞에 f를 붙이면, 문자열 안의 {item}은 글자 그대로 찍히지 않고 그 자리에 이름 item이 붙은 값이 들어갑니다. 중괄호 밖은 쓴 글자 그대로입니다.
item = '커피'
price = 4000
msg = f'{item} {price}원'
print(msg)
print(f'두 잔 {price * 2}원')
커피 4000원
두 잔 8000원3번 줄의 f-문자열은 실행되는 순간 '커피 4000원'이라는 문자열 하나가 되고, 이름 msg가 그 값에 붙습니다(규칙 2). 수 4000도 str() 없이 글자로 적혀 들어갑니다.
중괄호 안에는 이름뿐 아니라 식도 쓸 수 있습니다. 5번 줄의 price * 2는 먼저 8000으로 계산된 뒤 그 자리에 들어갑니다.
위 코드에서 3번 줄의 따옴표 앞 f만 뺐습니다. 무엇이 찍힐까요?
item = '커피'
price = 4000
msg = '{item} {price}원'
print(msg)
print(f'두 잔 {price * 2}원')
실행 결과 보기
{item} {price}원
두 잔 8000원예상과 다르면 그곳이 배울 곳입니다. f를 뺀 3번 줄의 문자열은 중괄호까지 쓴 글자 그대로이고, f가 있는 5번 줄에서만 중괄호 자리에 8000이 들어갑니다.
2콜론 뒤에 모양 정하기: 쉼표와 소수 자리
중괄호 안에서 콜론 : 뒤에 쓰는 것은 값을 어떤 모양으로 적을지 정합니다. 값 자체는 바뀌지 않고, 찍히는 글자의 모양만 바뀝니다.
| 쓰는 법 | 뜻 | 값 | 찍히는 글자 |
|---|---|---|---|
{price:,} | 천 단위마다 쉼표 | 12000 | 12,000 |
{avg:.1f} | 소수 첫째 자리까지 | 4.666… | 4.7 |
세 사람이 준 별점의 합이 14점일 때의 평균과, 커피 세 잔 값을 찍어 봅니다.
total = 14
count = 3
avg = total / count
print(avg)
print(f'평균 {avg:.1f}점')
print(f'세 잔 {4000 * 3:,}원')
4.666666666666667
평균 4.7점
세 잔 12,000원4번 줄은 avg를 그대로 찍어 소수점 아래가 길게 나옵니다. 5번 줄의 .1f는 소수 첫째 자리까지 반올림해 4.7로 보입니다. avg가 붙은 값은 그대로 4.666…입니다.
6번 줄의 ,는 세 자리마다 쉼표를 넣어 12,000으로 보입니다. 세 자리 이하인 수에는 쉼표가 붙지 않습니다.
3글자에는 쉼표를 붙일 수 없다
,는 수에만 쓰는 모양입니다. input()이 돌려준 글자에 그대로 쓰면 멈춥니다. 아래는 4000을 넣은 결과입니다.
price = input('가격: ')
print(f'{price:,}')넣는 값4000
가격: 4000Traceback (most recent call last): File "main.py", line 2, in <module> print(f'{price:,}') ^^^^^^^^^ValueError: Cannot specify ',' with 's'.맨 아래 줄의 's'는 문자열(string) 모양을 뜻합니다. '문자열에는 쉼표 모양을 쓸 수 없다'는 말입니다.
2번 줄의 ^ 표시가 {price:,} 자리를 가리킵니다. price가 1번 줄에서 글자 '4000'에 붙었기 때문입니다. 먼저 int()로 바꾸면 됩니다.
text = input('가격: ')
price = int(text)
print(f'{price:,}원')넣는 값4000
가격: 4000
4,000원예제
'입력은 늘 글자' 레슨의 '입력 받아 계산'을 f-문자열로 찍습니다. 입력 받기 → 수로 바꾸기 → 계산하기 → 찍기 네 걸음은 같고, 찍기 줄만 바뀝니다. 아래는 3을 넣은 결과입니다.
price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = int(text)
# 3. 계산하기
total = price * count
# 4. 찍기
print(f'커피 {count}잔')
print(f'합계 {total:,}원')넣는 값3
커피 몇 잔? 3
커피 3잔
합계 12,000원9번 줄은 {count} 자리에 3을, 10번 줄은 {total:,} 자리에 12000을 쉼표 모양으로 넣습니다. 둘 다 수라 str()이 필요 없습니다.
자주 틀리는 곳
틀린 생각: 중괄호로 감싸기만 하면 그 자리에 값이 들어간다.
값이 들어갈 자리를 중괄호로 표시하니 중괄호만 기억하기 쉽지만, 따옴표 앞에 f가 없으면 중괄호도 쓴 글자 그대로 찍힙니다.
price = 4000
print('{price}원')
print(f'{price}원')
{price}원
4000원2번 줄은 f가 없어 {price}가 글자 그대로 찍히고, 3번 줄은 f가 있어 그 자리에 4000이 들어갑니다.
맞는 규칙: f가 없는 문자열의 중괄호는 글자 그대로 찍힙니다. 값을 넣으려면 따옴표 앞의 f부터 확인합니다.
틀린 생각: .1f는 int()처럼 소수점 아래를 버린다.
'입력은 늘 글자' 레슨에서 int()가 소수점 아래를 버린다고 배워 .1f도 그럴 것 같지만, .1f는 반올림합니다.
avg = 14 / 3
print(f'{avg:.1f}')
print(int(avg))
4.7
4avg는 4.666…이라 2번 줄의 .1f는 둘째 자리에서 올려 4.7로 보이고, 3번 줄의 int()는 소수점 아래를 버려 4입니다. 다만 f'{0.25:.1f}'가 0.2를 찍듯, 끝자리가 딱 5인 값은 학교에서 배운 반올림과 다르게 찍힐 수 있습니다.
맞는 규칙: .1f는 소수 첫째 자리까지 반올림한 모양으로 찍을 뿐 값 자체는 바꾸지 않습니다. 소수점 아래를 버린 정수가 필요하면 int()를 씁니다.
틀린 생각: 중괄호 안에 바깥과 같은 따옴표를 써도 어느 판에서나 돈다.
파이썬 3.12부터는 같은 따옴표도 돌아 그렇게 여기기 쉽지만, 3.11 이하에서는 SyntaxError로 멈춥니다.
line = f'{"-" * 5}'
print(line)
-----바깥이 작은따옴표라 안은 큰따옴표로 썼습니다. 이렇게 쓰면 판에 상관없이 같은 결과가 찍힙니다.
맞는 규칙: 파이썬 3.11 이하는 중괄호 안에서 바깥과 같은 따옴표를 만나면 거기서 문자열이 끝난 것으로 읽습니다. 어느 판에서나 돌게 안에는 바깥과 다른 따옴표를 씁니다.
확인 문제
1. 예제에 3 대신 12를 넣었습니다. 무엇이 찍힐까요? 넣은 값이 보이는 줄까지 세 줄을 글자 그대로 쓰세요.
price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = int(text)
# 3. 계산하기
total = price * count
# 4. 찍기
print(f'커피 {count}잔')
print(f'합계 {total:,}원')넣는 값12
힌트
4000 곱하기 12를 먼저 계산하고, 그 값이 들어가는 중괄호 안의 콜론 뒤를 보세요.
정답
커피 몇 잔? 12
커피 12잔
합계 48,000원12잔이면 48000이고, , 모양이라 48,000으로 찍힙니다.
흔한 오답은 합계 48000원입니다. 콜론 뒤 ,가 찍히는 모양을 바꾸지 않는다고 본 것입니다.
2. 예제의 '4. 찍기' 둘째 줄에서 중괄호 자리를 비웠습니다. 3을 넣으면 합계 12,000원이 찍히도록 빈칸을 채우세요.
price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = int(text)
# 3. 계산하기
total = price * count
# 4. 찍기
print(f'커피 {count}잔')
print(f'합계 ____원')
힌트
어느 이름의 값을 넣을지 정하고, 12,000처럼 쉼표를 넣는 모양은 2절 표에서 찾아보세요.
정답
{total:,}입니다. 아래는 3을 넣은 결과입니다.
price = 4000
# 1. 입력 받기
text = input('커피 몇 잔? ')
# 2. 수로 바꾸기
count = int(text)
# 3. 계산하기
total = price * count
# 4. 찍기
print(f'커피 {count}잔')
print(f'합계 {total:,}원')넣는 값3커피 몇 잔? 3
커피 3잔
합계 12,000원{price * count:,}처럼 같은 값을 내는 식을 넣어도 맞습니다. 12,000이나 {12000:,}처럼 수를 직접 쓰면 3을 넣을 때는 같은 화면이 찍히지만, 다른 수를 넣어도 늘 12,000이 찍힙니다.
흔한 오답은 {total}입니다. 이름만 넣어도 쉼표가 저절로 붙는다고 본 것입니다. 그러면 쉼표 없이 합계 12000원이 찍힙니다.
3. 사흘 동안 걸은 걸음 수의 합과 하루 평균입니다. 무엇이 찍힐까요? 두 줄을 글자 그대로 쓰세요.
steps = 12350
days = 3
avg = steps / days
print(f'{steps:,}걸음')
print(f'하루 {avg:.1f}걸음')
힌트
모양은 중괄호마다 따로 정합니다. 5번 줄에는 쉼표 모양이 없습니다.
정답
12,350걸음
하루 4116.7걸음4번 줄은 쉼표 모양이라 12,350입니다. 5번 줄의 avg는 4116.666…이고, .1f가 소수 첫째 자리까지 반올림해 4116.7로 보입니다. 쉼표 모양을 쓰지 않았으니 4116에는 쉼표가 없습니다.
흔한 오답은 둘째 줄의 4116.6입니다. .1f가 버린다고 본 것입니다.
아래 2절 코드의 1번 줄을 total = 17로 바꾸면 찍히는 세 줄을 봅니다.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.