2.4 파이썬의 문자열 형식화¶
파이썬에서는 복잡한 문자열 출력을 위한 문자열 형식화(string formatting)를 지원한다. 문자열을 형식화하는 방법에는 %
기호를 사용한 방식과 format
메서드를 사용한 방식, 그리고 f
문자열을 사용하는 방식이 있다.
% 기호를 사용한 문자열 형식화¶
문자열 뒤에 % 기호를 붙이고 그 뒤에 다른 값을 붙이면 뒤에 붙은 값이 문자열 안으로 들어간다.
"문자열" % 값
이 때 문자열의 어느 위치에 값이 들어가는지를 표시하기 위해 문자열 안에 %
기호로 시작하는 형식지정 문자열(format specification string)을 붙인다. 대표적인 형식지정 문자열은 다음과 같다.
형식지정 문자열 |
의미 |
---|---|
|
문자열 |
|
정수 |
|
부동소수점 실수 |
다음은 % 기호를 사용한 문자열 형식의 예이다.
"내 이름은 %s입니다." % "홍길동"
"나는 %d살 입니다." % 12
'나는 12살 입니다.'
"원주율의 값은 %f입니다." % 3.141592
'원주율의 값은 3.141592입니다.'
만약 여러개의 값을 문자열 안에 넣어야 한다면 % 기호 뒤에 있는 값을 소괄호로 감싸야 한다.
"%d 곱하기 %d은 %d이다." % (2, 3, 6)
'2 곱하기 3은 6이다.'
"%s의 %s 과목 점수는 %d점이다." % ("철수", "수학", 100)
'철수의 수학 과목 점수는 100점이다.'
연습 문제 2.4.1
(1) name
과 age
라는 변수에 각각 이름과 나이를 넣고 다음과 같이 출력하는 코드를 만들어라
Tom is 13 years old
(2) a
, b
두 변수에 10과 3이라는 값을 대입하라. a
, b
변수와 문자열 형식화를 사용하여 다음과 같은 문자열을 출력하는 코드를 만들어라.
10 / 3 = 3.333
고급 형식지정 문자열¶
형식지정 문자열은 여러가지 숫자 인수를 가질 수도 있다. %
기호 다음에 오는 정수는 값이 인쇄될 때 차지하는 공간의 길이를 뜻한다. 만약 공간의 길이가 인쇄될 값보다 크면 정수가 양수일 때는 값을 뒤로 보내고 공백을 앞에 채우거나 반대로 정수가 음수이면 값을 앞으로 보내고 공백을 뒤에 채운다. 만약 %
기호 다음에 소숫점이 있는 숫자가 오면 점 뒤의 숫자는 실수를 인쇄할 때 소숫점 아래로 그만큼의 숫자만 인쇄하라는 뜻이다.
고급 형식지정 문자열 |
의미 |
---|---|
|
전체 20칸을 차지하는 문자열(공백을 앞에 붙인다.) |
|
전체 10칸을 차지하는 숫자(공백을 뒤에 붙인다.) |
|
부동소수점의 소수점 아래 5자리까지 표시 |
"[%20s]" % "*" # [와 ] 사이에 20칸의 공백이 있다.
'[ *]'
"[%-20s]" % "A" # 20칸의 공백의 앞쪽에 A를 인쇄한다.
'[A ]'
"[%20d]" % 123 # 20칸의 공백의 뒷쪽에 123을 인쇄한다.
'[ 123]'
"[%-20d]" % 123 # 20칸의 공백의 앞쪽에 123을 인쇄한다.
'[123 ]'
x = 1 / 3.0 # 값은 0.3333333....
"%.5f" % x # 소숫점 아래 5자리까지만 인쇄한다.
'0.33333'
공백 크기와 소숫점 아래 자릿수를 같이 지정할 수도 있다.
"[%-20.6f]" % x # 20칸의 공백의 앞쪽에 소숫점 아래 6자리 출력
'[0.333333 ]'
연습 문제 2.4.2
(1) a
, b
두 개의 변수에 3과 12라는 값을 넣고 이 변수를 사용하여 다음과 같이 세로셈으로 곱셈 결과를 출력하는 코드를 만들어라.
```
3
x 12
--------
36
```
(2) a
, b
두 개의 변수에 123456
과 7890
이라는 값을 넣고 이 변수를 사용하여 다음과 같이 세로셈으로 덧셈 결과를 출력하는 코드를 만들어라. 천의 자리 쉼표를 표시해야 한다.
```
123,456
+ 7,890
----------
131,346
```
format
메서드를 사용한 문자열 형식화¶
format
메서드를 사용하여 문자열을 형식화하는 방법도 있다. 이 때는 %
기호로 시작하는 형식지정 문자열 대신 {}
기호를 사용한다. 또한 자료형을 표시할 필요가 없다. 문자열 내에서 {
문자를 출력하고 싶을 때는 {{
라는 글자를 사용한다.
"내 이름은 {}입니다.".format("홍길동")
'내 이름은 홍길동입니다.'
"내 이름은 {{{}}}입니다.".format("홍길동")
'내 이름은 {홍길동}입니다.'
{}
안에 값의 순서를 지정하는 숫자를 넣을 수도 있다. 가장 앞에 있는 값은 {0}
, 그 뒤의 값은 {1}
, 이런 식으로 지정한다. 이 방법을 사용하면 값의 순서를 바꾸거나 같은 값을 여러번 인쇄할 수도 있다.
"{2}의 {0} 점수는 {1}점입니다. {1}점! {1}점!".format("수학", 100, "철수")
'철수의 수학 점수는 100점입니다. 100점! 100점!'
순서를 나타내는 숫자 대신 인수 이름을 지정할 수도 있다.
"{a}점수: {x}점, {b}점수: {y}점".format(a="영어", b="수학", x=100, y=90)
'영어점수: 100점, 수학점수: 90점'
만약 {}
를 여러개 사용하면서 순서 숫자나 인수 이름을 지정하지 않으면 순서대로 입력된다.
"{}점수: {}점, {}점수: {}점".format("영어", 100, "수학", 90)
'영어점수: 100점, 수학점수: 90점'
format 방식에서 공백의 크기를 지정하거나 부동소수점의 소수점 아래 숫자를 지정할 때는 {}
안에 :
기호를 넣고 그 뒤에 고급 형식지정 문자열을 넣는다. :
뒤에 오는 숫자는 공백의 크기를 뜻한다. <
는 값을 앞쪽으로 붙이고 공백을 뒤로 붙인다. 반대로 >
는 값을 앞쪽으로 붙이고 공백을 뒤로 붙인다. 소숫점의 자릿수를 지정할 때는 .
(점)과 숫자, 그리고 f
글자를 사용한다. ,
기호를 넣으면 영미권에서 숫자를 쓸 때 천(1000)단위마다 붙이는 쉼표(thousand comma)를 붙인다.
고급 형식지정 문자열 |
의미 |
---|---|
|
전체 10칸을 차지하며 공백을 앞에 붙임 (문자열을 오른쪽에 붙여서 출력) |
|
전체 10칸을 차지하며 공백을 뒤에 붙임 (문자열을 왼쪽에 붙여서 출력) |
|
전체 10칸을 차지하며 공백을 앞뒤에 붙임 (문자열을 중앙에 붙여서 출력) |
|
부동소수점의 소수점 아래 5자리까지 표시 |
|
천단위 쉼표 표시 |
"[{:<20}]".format("*")
'[* ]'
"[{:>20}]".format("*")
'[ *]'
"[{:^20}]".format("*")
'[ * ]'
"[{:20.5f}]".format(1 / 3)
'[ 0.33333]'
"[{:20,}]".format(1234567890)
'[ 1,234,567,890]'
만약 >
기호앞에 문자열을 쓰면 해당 문자열로 공백을 채운다.
고급 형식지정 문자열 |
의미 |
---|---|
|
전체 10칸을 차지하며 “*”을 앞에 붙임 (문자열을 오른쪽에 붙여서 출력) |
|
전체 10칸을 차지하며 “*”을 뒤에 붙임 (문자열을 왼쪽에 붙여서 출력) |
|
전체 10칸을 차지하며 “*”을 앞뒤에 붙임 (문자열을 중앙에 붙여서 출력) |
"[{:-<20}]".format("*")
'[*-------------------]'
"[{:->20}]".format("*")
'[-------------------*]'
"[{:-^20}]".format("*")
'[---------*----------]'
format 방법의 또다른 특징은 {}
안에서 리스트나 사전의 인덱싱을 할수 있다는 것이다.
x = [10, 11, 12]
"리스트의 첫번째 원소={0[0]}".format(x)
'리스트의 첫번째 원소=10'
y = {"a": 10, "b": 11, "c": 12}
"사전의 a키 값={0[a]}".format(y)
'사전의 a키 값=10'
연습 문제 2.4.3
연습 문제 1, 2를 format 방법으로 다시 풀어라.
f 문자열¶
파이썬 3.6부터는 f 문자열(f-string)이라는 것을 사용할 수 있다. f 문자열은 문자열의 앞에 f 글자를 붙인 문자열이다. f 문자열에서는 {}
안에 변수의 이름을 바로 사용할 수 있다.
name = "홍길동"
age = 32
print(f"{name}의 나이는 {age}살이다.")
홍길동의 나이는 32살이다.
f 문자열에서 공백의 크기 등을 지정할 때는 format 방법과 같은 고급 형식지정 문자열을 사용할 수 있다.
number = 1234567
f"[{number:<20}]"
'[1234567 ]'
f"[{number:>20}]"
'[ 1234567]'
f"[{number:^20}]"
'[ 1234567 ]'
f"[{number:-<20}]"
'[1234567-------------]'
f"[{number:->20}]"
'[-------------1234567]'
f"[{number:-^20}]"
'[------1234567-------]'
f"[{number:-^20,}]"
'[-----1,234,567------]'
f_number = 3.141592
f"[{f_number:20.3f}]"
'[ 3.142]'
연습 문제 2.4.4
연습 문제 1, 2를 f 문자열 방법으로 다시 풀어라.