f-string: 파이썬 문자열 포매팅의 정석

Python f-string의 기본 문법부터 포맷 명세, = 디버깅 출력, 조건식 삽입, 중첩 사용까지 완전히 다룹니다. 구식 % 포매팅 및 .format()과도 비교합니다.

· 5 min read · PALDYN Team

지난 글에서 문자열의 기초인 생성과 인덱싱, 슬라이싱을 살펴봤다. 이번에는 Python 3.6에서 도입된 f-string(formatted string literal)을 깊이 다룬다. 현대 Python 코드에서 문자열 포매팅의 표준이 된 도구다.

f-string이란

f-string은 문자열 리터럴 앞에 f 또는 F를 붙인 것이다. 중괄호 {}안에 임의의 Python 표현식을 넣을 수 있고, 실행 시점에 해당 값으로 치환된다.

name = "파이썬"
version = 3.12

print(f"안녕하세요, {name}!")
print(f"현재 버전: {version}")
print(f"1 + 1 = {1 + 1}")

왜 f-string인가

Python에는 문자열 포매팅 방법이 여러 가지 있다.

name, score = "Alice", 95

# % 포매팅 (Python 2 스타일)
"이름: %s, 점수: %d" % (name, score)

# str.format()
"이름: {}, 점수: {}".format(name, score)
"이름: {name}, 점수: {score}".format(name=name, score=score)

# f-string (권장)
f"이름: {name}, 점수: {score}"

f-string이 가장 간결하고, 세 방법 중 실행 속도도 가장 빠르다.

식 삽입

중괄호 안에는 변수뿐 아니라 임의의 표현식을 넣을 수 있다.

a, b = 3, 4
print(f"합: {a + b}")                          # 합: 7
print(f"제곱: {a ** 2 + b ** 2}")              # 제곱: 25
print(f"거듭제곱: {2 ** 10}")                  # 거듭제곱: 1024
print(f"대문자: {'hello'.upper()}")            # 대문자: HELLO
print(f"타입: {type(3.14).__name__}")          # 타입: float

조건식(삼항 연산자)도 넣을 수 있다.

score = 85
print(f"결과: {'합격' if score >= 60 else '불합격'}")
# 결과: 합격

f-string 기본 문법

포맷 명세 — {값:포맷}

중괄호 안에 콜론(:) 뒤에 포맷 명세를 붙이면 다양한 형식으로 출력할 수 있다.

소수점 자릿수

pi = 3.141592653589793
print(f"{pi:.2f}")   # 3.14
print(f"{pi:.4f}")   # 3.1416
print(f"{pi:.0f}")   # 3

너비와 정렬

print(f"{'left':<10}|")    # 'left      |' (왼쪽 정렬)
print(f"{'right':>10}|")   # '     right|' (오른쪽 정렬)
print(f"{'center':^10}|")  # '  center  |' (가운데 정렬)
print(f"{'fill':*^10}|")   # '***fill***|' (채우기 문자)

숫자 형식

n = 1_000_000
print(f"{n:,}")      # 1,000,000  (천 단위 콤마)
print(f"{n:_}")      # 1_000_000  (언더스코어)
print(f"{0.75:.1%}") # 75.0%      (백분율)
print(f"{255:#x}")   # 0xff       (16진수)
print(f"{255:#b}")   # 0b11111111 (2진수)
print(f"{1.5e4:e}")  # 1.500000e+04 (지수)

부호

print(f"{42:+}")    # +42
print(f"{-42:+}")   # -42
print(f"{42: }")    # 양수 앞에 공백 (음수와 자리 맞춤)

= 자기 문서화 표현식 (Python 3.8+)

디버깅할 때 변수 이름과 값을 함께 출력하는 {변수=} 문법이 있다.

x = 42
y = [1, 2, 3]

print(f"{x=}")     # x=42
print(f"{y=}")     # y=[1, 2, 3]
print(f"{x + 1=}") # x + 1=43

print(f"x={x}")를 반복해서 타이핑하는 대신 훨씬 간결하게 쓸 수 있다.

중첩과 여러 줄

f-string을 여러 줄로 나누려면 괄호로 감싼다.

name = "Alice"
score = 95
grade = "A"

report = (
    f"이름: {name}\n"
    f"점수: {score}\n"
    f"등급: {grade}"
)
print(report)

삼중 따옴표 f-string도 가능하다.

msg = f"""
이름: {name}
점수: {score}
""".strip()

변환 플래그

!r, !s, !a로 내장 변환 함수를 적용할 수 있다.

name = "파이썬"
print(f"{name!r}")   # '파이썬'  (repr)
print(f"{name!s}")   # 파이썬   (str, 기본값)
print(f"{name!a}")   # '\\ud30c\\uc774\\uc36c' (ascii)

f-string 고급 기능

주의사항

람다와 조건부 표현식의 중괄호 충돌

f-string 안에서 딕셔너리 리터럴이나 집합 리터럴을 직접 쓰면 충돌이 생길 수 있다.

d = {"key": "value"}
print(f"{d['key']}")   # OK: 다른 따옴표 사용

반복 성능

루프 안에서 f-string으로 문자열을 계속 더하는 패턴은 효율적이지 않다. 대신 "".join()을 사용한다.

# 비권장
result = ""
for i in range(1000):
    result += f"{i} "

# 권장
result = " ".join(str(i) for i in range(1000))

정리

기능문법
변수 삽입f"{name}"
식 삽입f"{1 + 2}"
소수점f"{pi:.2f}"
너비·정렬f"{'text':>10}"
천 단위f"{n:,}"
디버깅f"{x=}" (3.8+)

지난 글: 문자열 기초: 생성, 인덱싱, 슬라이싱

다음 글: 문자열 메서드: split, join, replace와 친구들


읽어주셔서 감사합니다. 😊