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!'
퀴즈

로그인하여 이 퀴즈에 답하고 학습 진행 상황을 추적하세요

Python 에서 f-문자열에 사용되는 접두사는 무엇입니까?
A. fmt
B. f 또는 F
C. format
D. str

인라인 산술 연산도 가능합니다:

# 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. 숫자를 가장 가까운 정수로 반올림합니다
B. 백분율로 포맷합니다
C. 숫자를 소수점 이하 2 자리 부동 소수점으로 포맷합니다
D. 과학적 표기법으로 변환합니다

백분율로 표시

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}040 으로 채우기 (왼쪽 채우기, 너비 2)
4{:x<4d}4xxxx 로 채우기 (오른쪽 채우기, 너비 4)
10{:x<4d}10xxx 로 채우기 (오른쪽 채우기, 너비 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!'

관련 링크

Morty Proxy This is a proxified and sanitized view of the page, visit original site.