여기서는 문자열을 이어 붙이는 것보다 값을 바로 끼워 넣을지, 출력 형식을 맞출지, 레거시 포매팅을 읽어야 할지를 먼저 봅니다.
새 코드의 기본 선택은 보통 f-string이고, 자리수와 정렬은 format specifier가 맡습니다.
숏컷 코드
name = "Mina"
score = 93.456
message = f"{name} scored {score:.1f}"
percent = f"{0.378:.2%}"
aligned = f"|{name:>10}|"문법
기본형은 값 삽입, 숫자 자리수, 정렬, 퍼센트, 레거시 포매팅까지 같이 보면 됩니다.
f"{value}"
f"{value:.2f}"
f"{name:>10}"
"{}".format(value)
"%s" % valuef-string은 값을 문자열 안에 직접 넣는 기본형이고, : 뒤의 format specifier는 출력 모양을 맞추는 자리입니다.
기본 선택
값을 문자열에 바로 넣으면 f-string이 가장 직접적이다
Python에서 출력 문자열을 만들 때는 f-string이 기본 선택입니다. 문자열 안에 값을 직접 넣을 수 있어서 결과 모양을 상상하기 쉽습니다.
user = "Mina"
age = 26
text = f"{user} is {age} years old"+로 문자열을 이어 붙이는 방식보다 의도가 훨씬 분명합니다.
출력 형식
숫자 자리수와 정렬은 format specifier가 맡는다
소수점 자리수, 퍼센트, 정렬, 폭 지정은 중괄호 뒤 : 문법으로 제어합니다.
price = 12.3456
print(f"{price:.2f}") # 12.35
print(f"{0.123:.1%}") # 12.3%
print(f"|{'cat':>6}|") # | cat|화면 출력, 로그, 보고서 문자열처럼 형식을 일정하게 맞춰야 할 때 특히 중요합니다.
역할 구분
join()과 f-string은 서로 다른 질문에 답한다
이 구간은 strings-basics와 연결되는 부분입니다.
- 여러 조각을 구분자로 합친다:
join() - 문장 안에 값을 끼워 넣는다:
f-string
names = ["Mina", "Jin", "Sora"]
joined = ", ".join(names)
count = len(names)
text = f"users={count}"즉 문자열을 만든다는 공통점은 있지만, 질문 자체가 다릅니다.
레거시 읽기
str.format()과 % 포매팅은 주로 기존 코드에서 읽게 된다
새 코드는 f-string이 대체로 가장 읽기 쉽습니다.
다만 기존 코드베이스나 특정 템플릿 규칙 때문에 str.format()이나 % 포매팅을 여전히 볼 수 있습니다.
name = "Mina"
text1 = "Hello, {}".format(name)
text2 = "Hello, %s" % name
text3 = f"Hello, {name}"새로 쓸 때는 보통 f-string, 기존 형식이나 호환성을 따라야 하면 다른 방식을 유지하는 쪽이 자연스럽습니다.
표현식 경계
f-string은 출력용 표현식이지 템플릿 엔진이 아니다
f-string 중괄호 안은 이미 계산된 표현식을 보여 주는 자리입니다.
사용자 입력 문자열을 거기서 "코드처럼 실행"하는 발상으로 이해하면 안 됩니다.
주의할 점
사용자 입력 전체를 eval처럼 f-string 식 안에 직접 넣는 식으로 오해하면 안 됩니다. 중괄호 안은 이미 코드로 평가되는 표현식이지, 텍스트 템플릿 치환기가 아닙니다.
# ❌ 문자열 자체를 Python 식처럼 다루려는 발상은 위험하다
expr = "2 + 2"
text = f"result: {expr}"
# ✅ f-string은 이미 계산된 값을 보여 주는 용도
result = 2 + 2
text = f"result: {result}"참고 링크
2 sources