Python 문자열 포매팅
Python 3 설명서에서 발췌
여기에 설명된 포매팅 작업 (% 연산자) 은 일반적인 오류를 유발하는 다양한 특이점을 보입니다 [...]. 더 새로운 포맷된 문자열 리터럴 [...]을 사용하면 이러한 오류를 피할 수 있습니다. 이러한 대안들은 텍스트 포매팅을 위한 더 강력하고 유연하며 확장 가능한 접근 방식을 제공합니다.
% operator
문자열 리터럴 선호
새로운 코드의 경우, % 연산자 대신 str.format 또는 포맷된 문자열 리터럴(Python 3.6 이상) 을 사용하는 것이 강력히 권장됩니다.
# % operator: 구식 문자열 포매팅 (새로운 코드에는 권장되지 않음)
name = 'Pete'
'Hello %s' % name # %s = 문자열 자리 표시자
"Hello Pete"
%d 포맷 지정자를 사용하여 int 값을 문자열로 변환할 수 있습니다:
num = 5
'I have %d apples' % num
"I have 5 apples"
str.format
Python 3 는 문자열 포매팅을 위한 새로운 방식을 도입했으며, 이는 나중에 Python 2.7 로 역이식되었습니다. 이로 인해 문자열 포매팅 구문이 더 규칙적으로 변했습니다.
# str.format() 메서드: 최신 문자열 포매팅 (Python 2.7 이상)
name = 'John'
age = 20
"Hello I'm {}, my age is {}".format(name, age) # {} = 자리 표시자
"Hello I'm John, my age is 20"
"Hello I'm {0}, my age is {1}".format(name, age)
"Hello I'm John, my age is 20"
Formatted String Literals or f-Strings
Python 3.6 이상을 사용 중이라면, 문자열 f-Strings가 문자열을 포매팅하는 권장되는 방법입니다.
Python 3 설명서에서 발췌
포맷된 문자열 리터럴 또는 f-문자열은 f 또는 F로 접두사가 붙은 문자열 리터럴입니다. 이러한 문자열에는 중괄호 {}로 구분된 표현식인 대체 필드가 포함될 수 있습니다. 다른 문자열 리터럴은 항상 상수 값을 갖는 반면, 포맷된 문자열은 실제로 런타임에 평가되는 표현식입니다.
# f-string: 문자열 포매팅을 위한 권장 방식 (Python 3.6 이상)
name = 'Elizabeth'
f'Hello {name}!' # f 접두사는 {} 내의 표현식을 허용합니다
'Hello Elizabeth!'
로그인하여 이 퀴즈에 답하고 학습 진행 상황을 추적하세요
fmtf 또는 Fformatstr인라인 산술 연산도 가능합니다:
# f-strings 는 표현식을 지원합니다: {} 내에 계산 포함 가능
a = 5
b = 10
f'Five plus ten is {a + b} and not {2 * (a + b)}.' # 표현식 평가
'Five plus ten is 15 and not 30.'
여러 줄 f-문자열
name = 'Robert'
messages = 12
(
f'Hi, {name}. '
f'You have {messages} unread messages'
)
'Hi, Robert. You have 12 unread messages'
= 지정자
이것은 표현식과 그 값을 출력합니다:
# = 지정자: 변수 이름과 값 모두 출력 (Python 3.8 이상)
from datetime import datetime
now = datetime.now().strftime("%b/%d/%Y - %H:%M:%S")
f'date and time: {now=}' # "now='Nov/14/2022 - 20:50:01'" 출력
"date and time: now='Nov/14/2022 - 20:50:01'"
공백 또는 문자 추가
name = 'Robert'
f"{name.upper() = :-^20}"
'name.upper() = -------ROBERT-------'
f"{name.upper() = :^20}"
'name.upper() = ROBERT '
f"{name.upper() = :20}"
'name.upper() = ROBERT '
자릿수 포매팅
천 단위 구분 기호 추가
a = 10000000
f"{a:,}"
'10,000,000'
반올림
a = 3.1415926
f"{a:.2f}"
'3.14'
로그인하여 이 퀴즈에 답하고 학습 진행 상황을 추적하세요
f"{a:.2f}"는 무엇을 수행합니까?백분율로 표시
a = 0.816562
f"{a:.2%}"
'81.66%'
숫자 포매팅 표
| 숫자 | 포맷 | 출력 | 설명 |
|---|---|---|---|
| 3.1415926 | {:.2f} | 3.14 | 소수점 이하 2 자리 부동 소수점으로 포맷 |
| 3.1415926 | {:+.2f} | +3.14 | 부호와 함께 소수점 이하 2 자리 부동 소수점으로 포맷 |
| -1 | {:+.2f} | -1.00 | 부호와 함께 소수점 이하 2 자리 부동 소수점으로 포맷 |
| 2.71828 | {:.0f} | 3 | 소수점 자리 없이 부동 소수점으로 포맷 |
| 4 | {:0>2d} | 04 | 0 으로 채우기 (왼쪽 채우기, 너비 2) |
| 4 | {:x<4d} | 4xxx | x 로 채우기 (오른쪽 채우기, 너비 4) |
| 10 | {:x<4d} | 10xx | x 로 채우기 (오른쪽 채우기, 너비 4) |
| 1000000 | {:,} | 1,000,000 | 쉼표 구분 기호가 있는 숫자 포맷 |
| 0.35 | {:.2%} | 35.00% | 백분율 포맷 |
| 1000000000 | {:.2e} | 1.00e+09 | 지수 표기법 |
| 11 | {:11d} | 11 | 오른쪽 정렬 (기본값, 너비 10) |
| 11 | {:<11d} | 11 | 왼쪽 정렬 (너비 10) |
| 11 | {:^11d} | 11 | 가운데 정렬 (너비 10) |
Template Strings
템플릿 문자열은 덜 강력하지만 더 단순한 메커니즘이며, 사용자로부터 생성된 문자열을 처리할 때 권장됩니다. 복잡성이 줄어들어 템플릿 문자열이 더 안전한 선택이 됩니다.
from string import Template
name = 'Elizabeth'
t = Template('Hey $name!')
t.substitute(name=name)
'Hey Elizabeth!'