2.4 파이썬의 문자열 형식화

파이썬에서는 복잡한 문자열 출력을 위한 문자열 형식화(string formatting)를 지원한다. 문자열을 형식화하는 방법에는 % 기호를 사용한 방식과 format 메서드를 사용한 방식, 그리고 f 문자열을 사용하는 방식이 있다.

% 기호를 사용한 문자열 형식화

문자열 뒤에 % 기호를 붙이고 그 뒤에 다른 값을 붙이면 뒤에 붙은 값이 문자열 안으로 들어간다.

"문자열" %

이 때 문자열의 어느 위치에 값이 들어가는지를 표시하기 위해 문자열 안에 % 기호로 시작하는 형식지정 문자열(format specification string)을 붙인다. 대표적인 형식지정 문자열은 다음과 같다.

형식지정 문자열

의미

%s

문자열

%d

정수

%f

부동소수점 실수

다음은 % 기호를 사용한 문자열 형식의 예이다.

"내 이름은 %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) nameage라는 변수에 각각 이름과 나이를 넣고 다음과 같이 출력하는 코드를 만들어라

Tom is 13 years old

(2) a, b 두 변수에 10과 3이라는 값을 대입하라. a, b 변수와 문자열 형식화를 사용하여 다음과 같은 문자열을 출력하는 코드를 만들어라.

10 / 3 = 3.333 

고급 형식지정 문자열

형식지정 문자열은 여러가지 숫자 인수를 가질 수도 있다. % 기호 다음에 오는 정수는 값이 인쇄될 때 차지하는 공간의 길이를 뜻한다. 만약 공간의 길이가 인쇄될 값보다 크면 정수가 양수일 때는 값을 뒤로 보내고 공백을 앞에 채우거나 반대로 정수가 음수이면 값을 앞으로 보내고 공백을 뒤에 채운다. 만약 % 기호 다음에 소숫점이 있는 숫자가 오면 점 뒤의 숫자는 실수를 인쇄할 때 소숫점 아래로 그만큼의 숫자만 인쇄하라는 뜻이다.

고급 형식지정 문자열

의미

%20s

전체 20칸을 차지하는 문자열(공백을 앞에 붙인다.)

%-10d

전체 10칸을 차지하는 숫자(공백을 뒤에 붙인다.)

%.5f

부동소수점의 소수점 아래 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 두 개의 변수에 1234567890이라는 값을 넣고 이 변수를 사용하여 다음과 같이 세로셈으로 덧셈 결과를 출력하는 코드를 만들어라. 천의 자리 쉼표를 표시해야 한다.

```
   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}

전체 10칸을 차지하며 공백을 뒤에 붙임 (문자열을 왼쪽에 붙여서 출력)

{:^10}

전체 10칸을 차지하며 공백을 앞뒤에 붙임 (문자열을 중앙에 붙여서 출력)

{:.5f}

부동소수점의 소수점 아래 5자리까지 표시

{:,}

천단위 쉼표 표시

"[{:<20}]".format("*")
'[*                   ]'
"[{:>20}]".format("*")
'[                   *]'
"[{:^20}]".format("*")
'[         *          ]'
"[{:20.5f}]".format(1 / 3)
'[             0.33333]'
"[{:20,}]".format(1234567890)
'[       1,234,567,890]'

만약 > 기호앞에 문자열을 쓰면 해당 문자열로 공백을 채운다.

고급 형식지정 문자열

의미

{:*>10}

전체 10칸을 차지하며 “*”을 앞에 붙임 (문자열을 오른쪽에 붙여서 출력)

{:*<10}

전체 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 문자열 방법으로 다시 풀어라.