C 스타일 형식 문자열보다 f-문자열을 사용하라

Sue·2025년 8월 5일
0

Effective Python

목록 보기
2/9
post-thumbnail

아래는 「파이썬 코딩의 기술 (Effective Python)」 2판의 아이템 4 내용을 코드와 함께 정리 + 예제 분석한 것입니다.


✅ 아이템 4. C 스타일 형식 문자열보다 f-문자열을 사용하라

📌 핵심 아이디어

  • 파이썬에는 3가지 주요 문자열 포맷팅 방식이 있다.

    1. C 스타일(% 연산자)
    2. str.format 메서드
    3. f-string (formatted string literal, 파이썬 3.6+)
  • 이 중 f-문자열은 다음 장점을 가진다.

    • 가독성 높음: 변수/표현식을 {} 안에 바로 넣을 수 있음
    • 성능 우수: %format()보다 빠름
    • 표현식 지원: 함수 호출, 연산, 변환(!r, !s, !a)까지 가능
    • 포매팅 옵션 간결: :.2f, :<10, :{변수}f 등 직관적

🧩 1. 기존 방식: C 스타일 (% 연산자)

a = 0b10111011
b = 0xc5f
print('이진수: %d, 십육진수: %d' % (a, b))
  • %d, %s, %.2f 등 C 언어 스타일 형식을 그대로 사용.
  • 순서가 고정되어 있어, 매개변수 순서를 바꾸려면 별도 처리 필요.
key = 'my_var'
value = 1.234
formatted = '%-10s = %.2f' % (key, value)
print(formatted)  # my_var     = 1.23
  • % 포맷에서는 위치 인자를 잘못 넣으면 TypeError 발생.
  • 딕셔너리 포맷('%(key)s')으로 개선 가능하지만 여전히 복잡.
old_way = '%-10s = %.2f' % (key, value)
new_way = '%(key)-10s = %(value).2f' % {'key': key, 'value': value}

🧩 2. str.format 메서드

formatted = '{:<10} = {:.2f}'.format(key, value)
print(formatted)  # my_var     = 1.23
  • 명시적인 위치 지정 {1} = {0} 도 가능.
  • 키워드 인자를 활용해 가독성을 높일 수 있다.
  • 그러나 중괄호와 인덱스가 늘어나면 복잡해진다.
formatted = '{1} = {0}'.format(key, value)  
print(formatted)  # 1.234 = my_var

🧩 3. f-string (추천 방식)

간결하고 직관적

formatted = f'{key:<10} = {value:.2f}'
print(formatted)  # my_var     = 1.23
  • {} 안에 변수, 연산, 함수 호출, 포맷 지정 모두 가능.

표현식 사용 가능

places = 3
number = 1.23456
print(f'내가 고른 숫자는 {number:.{places}f}')  # 내가 고른 숫자는 1.235
  • 중괄호 안에서 포매팅 자릿수도 변수로 지정 가능.

🧩 4. f-문자열, %, format 비교

🔹 같은 결과를 세 가지 방식으로 표현

key = 'my_var'
value = 1.234

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

assert c_tuple == str_args == str_kw == f_string

🧩 5. 반복문에서의 예시

  • 기존 방식 (C 스타일)
for i, (item, count) in enumerate(pantry):
    old_style = '#%d: %-10s = %d' % (i + 1, item.title(), round(count))
  • str.format 방식
for i, (item, count) in enumerate(pantry):
    new_style = '#{}: {:<10s} = {}'.format(i + 1, item.title(), round(count))
  • f-string 방식 (가장 간결)
for i, (item, count) in enumerate(pantry):
    f_string = f'#{i+1}: {item.title():<10s} = {round(count)}'

정리

방식장점단점
C 스타일 %간단한 경우는 빠름가독성 낮음, TypeError 발생 쉬움
str.format명시적 키워드, 다양한 기능문법이 장황함
f-string (추천)가독성 최고, 표현식 지원, 성능 우수파이썬 3.6 이상 필요

🎯 아이템 4 핵심 요약

  • C 스타일(%)낡은 방식 → 유지보수 어려움.

  • str.format 은 강력하지만 장황.

  • f-string을 사용하라

    • 가장 간단하고 읽기 쉽다.
    • 표현식과 포매팅 옵션을 직관적으로 지원.
    • 성능도 가장 우수.

profile
AI/ML Engineer

0개의 댓글