상세 컨텐츠

본문 제목

[Python] f-string 인터폴레이션

Programming/Python

by leediz 2022. 7. 2. 21:49

본문

[Python] f-string 인터폴레이션


python 코드를 작성하다보면 문자열을 사용하며 문자열 안에 변수를 처리해야 하는 경우가 많다. 이를 형식화(formatting)라고 하며 python에서는 여러 방식으로 형식화를 할 수 있다. 여러 방법 중 f-string을 사용하는 것이 가장 권장되고 실제로도 여러 이점이 있다. 이번 포스팅에서는 f-string에 대해 포스팅하겠다.

 

Python에서 문자열을 형식화 하는 방법

  • C 언어 스타일의 ‘%’ 형식화 연산자 사용
  • 내장 함수 format() 함수 사용
  • f-string 사용

 

0.  C 언어 스타일의 ‘%’ 형식화 연산자 사용

이 방법은 C 언어의 printf 함수에서 비롯되었으며 python 외에도 다른 프로그래밍 언어에서도 사용하는 방법이다.
문법은 미리 정의된 텍스트에 %d, %s, %f등의 형식 지정자를 사용하여 해당 위치에 변수를 할당하는 방식의 문법이며 실제 예제 코드는 아래와 같다.

month = 6
day = 27
print("오늘은 %d월 %d일 입니다." % (month, day))

오늘은 6월 27일 입니다.

간단해 보이는 이 방법에는 몇 가지 문제점이 있다.

  • 형식화 식(’%’)의 오른쪽 튜플 내 변수의 순서를 바꾸거나 형식 지정자의 타입을 바꾸면 오류가 발생한다.
  • 변수의 개수가 많아지거나 복잡해지면 가독성이 매우 떨어진다.
  • 같은 값을 여러 번 사용하고 싶다면 튜플 내에서 같은 값을 여러 번 반복해야 한다.

하나씩 살펴보면 다음과 같다.

 

  • 형식화 식(’%’)의 오른쪽 튜플 내 변수의 순서를 바꾸거나 형식 지정자의 타입을 바꾸는 케이스

key와 value를 각각 할당한 예제 코드이다.
key는 문자열(string format)이고 value는 소수점(float format)이다. 아래와 같이 문제없이 값이 잘 나온다.

key = "pie"
value = 3.14
formatted = "%-2s = %.2f" % (key, value)
print(formatted)

pie = 3.14

하지만 key와 value의 순서를 바꾸면 형식 지정자의 타입과 맞지 않아 런타임 오류(runtime error)가 발생한다.

reordered_tuple = "%-10s = %.2f" % (value, key)

TypeError                                 Traceback (most recent call last)
Input In [3], in <module>
----> 1 reordered_tuple = "%-10s = %.2f" % (value, key)

TypeError: must be real number, not str

 

  • 변수의 개수가 많아지거나 복잡해지는 케이스
score = [
    ("korean", 85.67),
    ("english", 95.23),
    ("mathematics", 88.43),
]

for i, (item, count) in enumerate(score):
    print("#%d: %-10s = %.2f" % (i, item, count))

#0: korean = 85.67
#1: english = 95.23
#2: mathematics = 88.43

리스트에 튜플로 각각 국어, 영어, 수학 성적을 점수와 함께 저장한 내용을 출력한 코드와 결과이다.
출력 형식에서 과목 이름의 앞글자를 대문자로 바꾸고, 점수의 소수점을 반올림을 해서 보고싶다면 아래와 같이 코드를 수정하여 다시 출력하면 된다.

for i, (item, count) in enumerate(score):
    print("#%d: %-2s = %.2f" % (
        i + 1, 
        item.title(), 
        round(count)))

#1: Korean = 86.00
#2: English = 95.00
#3: Mathematics = 88.00

그런데 위 코드에서 형식화 식 오른쪽의 튜플 내 변수들이 길어지면서 복잡해지고 가독성이 떨어진다.
print함수의 내용이 한 눈에 들어오지 않는다.

 

  • 같은 값을 여러 번 사용하는 케이스
template = "The %s of the rings VS The dark %s"
name = "lord"
formatted = template % (name, name)
print(formatted)

The lord of the rings VS The dark lord

같은 변수를 형식 지정자에서 출력하지만 형식화 식 오른쪽 튜플에서는 같은 변수를 두 번 써줘야 한다.
예제가 간단하지만 중간중간 다른 변수가 있다거나 변수를 변경해야할 때에 실수를 유발할 수가 있다.

formatted = template % (name.title(), name)
print(formatted)

The Lord of the rings VS The dark lord

 

1.  내장 함수 format() 함수 사용

python3부터 ‘%’를 사용하는 C 스타일 형식화 문자열보다 표현력이 좋은 고급 문자열 형식화 기능이 추가되었다.
사용법은 아래와 같이 문자열에 .format() 메서드를 호출하는 방식이다.

key = "pie"
value = 3.14
formatted = "{} = {}".format(key, value)
print(formatted)

pie = 3.14 

C 스타일의 ‘%’ 형식화 연산자 사용하는 방법과 비슷하지만 형식지정자 사용 대신 위치 지정자 ‘{}’를 사용한다.
기본적으로 순서는 format 메서드의 파라미터 순서대로 할당되지만 순서를 변경할 수도 있다. 또한 같은 위치의 인덱스를 여러번 사용할 수 있다.

name = "lord"
formatted = "The {0} of the rings VS The dark {0}".format(name)
print(formatted)

name 인덱스를 한 번만 사용하지만 위치 지정자의 인덱스를 동일하게 지정함으로써 같은 값이 할당되도록 했다.
하지만 이 방법 역시 별도의 메소드를 호출하는 방식으로 실수를 유발할 수도 있고, 여전히 가독성이 떨어지는 느낌이다.

 

2.  f-string 사용

오늘의 주인공인 인터폴레이션(interpolation)을 통한 형식 문자열(a.k.a f-string) 사용 방식이다.
python3.6 버전부터 도입이 되었으므로 해당 버전 이후에서만 유효한 문법이다.
f-string 사용 하는 방법은 간단하다. 문자열 앞에 ‘f’ 문자를 붙이고 변수를 할당해야 하는 부분은 ‘{}’ 지정자 안에 변수 이름을 그대로 써주면 된다.

key = "pie"
value = 3.14
formatted = f"{key} = {value}"
print(formatted)

pie = 3.14

하나의 변수를 사용할 때도 아래와 같이 보다 편하게 변수만 할당해주면 된다.

name = "lord"
formatted = f"The {name} of the rings VS The dark {name}"
print(formatted)

The lord of the rings VS The dark lord

python에서 사용할 수 있는 문자열 문법을 모두 나열해보면 아래와 같다.

f_string = f"{key:<10} = {value:.2f}"
c_tuple = "%-10s = %.2f" % (key, value)
str_args = "{:<10} = {:.2f}".format(key, value)
str_kw = "{key:<10} = {value:.2f}".format(key=key, value=value)
c_dict = "%(key)-10s = %(value).2f"  %{"key": key, "value": value}

assert f_string == c_tuple == c_dict
assert f_string == str_kw == str_args

위의 문자열의 결과는 모두 같다. 언뜻 봐도 f_string이 제일 간단해 보인다.
가독성이나 유지보수성에 많은 장점이 있는 만큼 적극적으로 사용하면 좋겠다.

 

마무리

python에서 문자열 안에 변수를 할당하는 방법들에 대해 알아봤다. 다양한 방법 중 C 언어 스타일의 ‘%’ 형식화 연산자 사용, format 함수 사용, f-string 사용에 사용방법과 각각의 장단점에 대해 알아봤다. 여러 방법 중 f-string이 가장 간편하고 가독성이 좋고 유지보수성이 좋으므로 가장 권장되는 방식이다.

 

참고자료


댓글 영역