본문 바로가기
목차
Python

percent(%) formatting

by ds31x 2025. 7. 31.
728x90
반응형

https://realpython.com/python-modulo-string-formatting/

Percent formatting

  • Old Style String Formatting이라고도 불림.
  • 파이썬에서 string 내에 variable의 값을 삽입하기 위해 % 연산자를 사용하는 방식.
  • C 언어에서와 매우 유사하기 때문에 "printf-style formatting"이라고도 불림.

Python 2.x 대의 주요 string formatting 방법이었으나,
오늘날에는 str.format() 메서드나 f-string이 보다 권장됨.

 

과거의 레거시 코드에서 많이 보이므로 사용법을 알고는 있어야 함.


관련 gist

https://gist.github.com/dsaint31x/a999f4c710d79c9d736f02d4b175c140

 

py_percent_formatting.ipynb

py_percent_formatting.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


기본 문법

문자열 안에 format specifier 를 넣고,
string 뒤에 % 연산자를 사용하여 삽입할 값을 전달 (tuple이용):

"string %format_specifier0 %format_specifier1" % (값1, 값2)

Simple Example:

name = "Alice"
age = 30
height = 1.75

# 단일 값
message1 = "My name is %s." % name
print(message1) # 출력: My name is Alice.

# 여러 값 (튜플로 묶어서 전달)
message2 = "My name is %s and I am %d years old." % (name, age)
print(message2) # 출력: My name is Alice and I am 30 years old.

# 다른 타입의 값
message3 = "My height is %.2f meters." % height
print(message3) # 출력: My height is 1.75 meters.
  • s, d, f 를 conversion specifier라고도 부름.
  • format specifier는 conversion specifier에 format flag, width, precision 을 합친 것을 가리킴.

주요 Conversion Specifiers

각 포맷 지정자는 삽입될 value의 데이터 타입을 지정함.

실제로 어떤 형식의 문자열로 변환하여 출력될지를 결정해서 conversion specifier라고도 불림.

  • %s: string (문자열)
    • 어떤 데이터 타입이든 str 객체로 변환하여 삽입.
    • 가장 유연하게 사용됨.
  • %d: decimal integer (정수)
    • 정수 값을 삽입.
    • int() 생성자의 인자로 넘겨져서 문제 없는 경우만 가능함.
  • %f: float (부동소수점)
    • 기본적으로 6자리 소수점까지 표시.
    • float() 생성자의 인자로 넘겨져서 문제 없는 경우만 가능함.
    • %.Nf: 소수점 이하 N자리까지 표시
    • 예: %.2f는 소수점 둘째 자리까지
  • %X 또는 %x: hexadecimal (16진수)
    • 대소문자 16진수로 변환하여 삽입
    • 정수(int)만 가능: float도 동작 안함.
  • %o: octal (8진수)
    • 정수를 8진수로 변환하여 삽입.
    • 정수(int)만 가능: float도 동작 안함.
  • %c: 문자 (character)
    • 하나의 문자를 삽입.
    • 정수(ASCII 값, 정확히는 Unicode code point)나 길이가 1인 문자열.
    • 예를 들어, 9730 이면 우산 모양 글자.
  • %e 또는 %E: 지수 표기법 (exponential notation)
    • 부동 소수점을 지수 형태로 표시 (예: 1.23e+02).

Format Flags 및 Width/Precision

conversion specifier 앞에 추가적인 format flag숫자를 사용하여 출력방식을 제어.

문법:

%[format_flag][width][.precision]coversion_specifier
  • format flags:
    • 지정하지 않은 경우, width를 채우기 위해 공백문자로 채우며 오른 정렬.
    • +: 음수에 - 부호가 붙듯이 양수에도 + 부호가 붙게 됨.
      • 예: %+d #+10
    • -: 왼쪽 정렬. (기본은 오른쪽 정렬임. 주의할 것)
    • 0: 숫자를 0으로 채움 - modulo를 이용하는 이 방식에서 공백문자를 제외한 유일한 padding character
      • width와 숫자에 해당하는 conversion specifier와 함께 사용: s와는 같이 사용 못함.
      • 예: %05d # 00010
    • #:
      • 8진수/16진수에 0o/0x/0X prefix가 붙음.
  •  width (폭):
    • 최소 필드 폭을 지정함.
    • 값이 지정된 폭보다 작으면 공백문자(또는 0)으로 채워짐.
  •   precision (정밀도):
    • %f 의 경우엔 소수점 이하 자리수를 지정에.
    • %s 의 경우엔 출력할 문자열의 최대 필드 폭을 지정.

Example :

value = 123

# 최소 폭 지정 (오른쪽 정렬)
print("Value: %5d" % value)    # 출력: Value:   123 (앞에 2칸 공백)

# 0으로 채우기
print("Value: %05d" % value)    # 출력: Value: 00123

# 왼쪽 정렬
print("Value: %-5d" % value)   # 출력: Value: 123   (뒤에 2칸 공백)

# 부동 소수점 정밀도
pi = 3.14159265
print("Pi: %.2f" % pi)          # 출력: Pi: 3.14
print("Pi: %10.3f" % pi)        # 출력: Pi:      3.142 (총 10칸, 소수점 3자리)

# 문자열 정밀도 (최대 길이)
text = "Hello World"
print("%.5s" % text)           # 출력: Hello

Dictionary를 사용한 포맷팅

key-value pair를 사용하여 보다 가독성 있는 코드 작성이 가능함: 오히려 번잡하다고 느끼는 프로그래머도 많고 실제로 많이 사용 안 됨.

  • %와 format specifier 사이에 (key)를 추가
  • 값을 dict 객체로 전달.
  • (key)%뒤에 놓이며, 이후 format flag 와 width, precision, conversion specifier 가 놓임.
data = {'name': 'Charlie', 'age': 40}
message = "My name is %(name)s and I am %(age)d years old." % data
print(message)
# 출력: My name is Charlie and I am 40 years old.

 

format 을 변경하는 경우는 다음을 참고

data = {'name': 'Charlie', 'age': 40}
message = "My name is [%(name)-10s] and I am %(age)03d years old." % data
print(message)
# 출력: My name is [Charlie   ] and I am 040 years old.

결론

Legacy code에서 가장 많이 쓰이는 형태이며, C 스타일과 같아서 C언어 등에 익숙한 개발자에게 매우 친숙한 방식임.

C/C++ 에 익숙치 않은 프로그래머들에게는 가독성이 떨어짐.

특히, 다른 방식들에 비해 복잡한 포맷팅에서 객관적으로 가독성이 높다고 보기 어려움.

실제로 f-string 에 비해 가독성이나 기능성이 높다고 보긴 어렵기 때문에 신규 코드에서는 f-string을 보다 사용하는 것이 권장됨.


같이 보면 좋은 자료들

2024.09.04 - [Python] - [Py] Python에서 string formatting.

 

[Py] Python에서 string formatting.

Python에서 문자열에서 변수의 값을 출력하는 방법(string formatting)에는다음과 같은 세 가지 주요 방법이 있음:% 포맷팅 (%-formatting):공식 명칭: Percent formatting도입 버전: Python 초기 버전부터 사용 가

ds31x.tistory.com

https://dsaint31.tistory.com/532

 

[Python] f-String

Python : f-StringPython 3.6 이후 도입됨.기존의 중괄호 {}과 format 메소드를 사용하여 문자열 포매팅을 설정하는 방식(Python 2.6 이후)과 유사하지만, 더 직관적으로 문자열을 포맷팅할 수 있는 기능으로

dsaint31.tistory.com


 

728x90