본문 바로가기
파이썬/파이썬 문법(심화)

[WIP]대한민국에서 가장 자세한 f-string 가이드

by soypablo 2023. 5. 26.

대한민국에서 가장 자세한 Python의 f-string에 대한 가이드

여러분이 이미 Python의 f-string에 대해 알고 있을지라도, 이 글은 그 기능과 사용법에 대해 최대한 많은 정보를 제공하려고 합니다. f-string은 Python 3.6부터 도입된 문자열 포매팅 방식으로, 표현력이 뛰어나고 읽기 쉬워 많은 Python 개발자들에게 사랑받고 있습니다.

해당 글 작성을 위해 구글에 f-string에 대한 한국어 게시글을 30개 정도 읽었습니다. 그리고 현존하는 f-string에 관한 한국어 글중, 가장 자세한 글이라고 자부합니다!

예시 코드 실행을 위해 파이썬 3.11버전 이상을 권장합니다.

f-string이란?

f-string, 또는 "formatted string literal"의 약자입니다.

사용방법은 간단합니다. 문자열 앞에 f를 붙여서 생성합니다. 이 방식은 문자열 내에서 중괄호 {}를 사용해 변수나 표현식을 직접 삽입할 수 있게 합니다. 이렇게 하면 문자열을 생성하거나 수정할 때 더 간편하고 직관적인 방법을 제공합니다.

f-string을 사용한 간단한 예시를 하나 살펴보겠습니다.

name = "Alice"
age = 25
print(f"Hello, my name is {name} and I'm {age} years old.")
Hello, my name is Alice and I'm 25 years old.

포맷 사양 미니 언어

f-string은 "포맷 명세 미니 언어"를 지원합니다.

"포맷 명세 미니 언어"를 가장 간단하게 설명하면, f-string에서 중괄호 안에 :이후에 오는 기호들을 의미합니다.

f-string은 이 "포맷 명세 미니 언어"를 사용하여 좀 더 다양한 형태의 데이터에 대한 출력을 자세히 제어할 수 있습니다.

(포맷 사양 미니 언어는 기존의 str.format()에서 사용하던 것을 f-string에서도 사용할 수 있도록 한 것입니다.)

포맷 사양 미니 언어를 사용하면, 다음과 같은 이점이 있습니다.

  • 유연성: 포맷 명세 미니 언어를 사용하면 숫자, 문자열, 날짜 및 시간 등 다양한 데이터 유형에 대한 출력 형식을 제어할 수 있습니다. 예를 들어, 숫자의 소수점 이하 자릿수, 날짜 및 시간 형식, 문자열 정렬 등을 지정할 수 있습니다.

  • 가독성: 포맷 명세 미니 언어를 사용하면 복잡한 문자열 구성을 간결하게 표현할 수 있습니다. 이는 코드의 가독성을 높여주며, 따라서 코드의 유지 보수를 용이하게 합니다.

  • 지역화: 포맷 명세 미니 언어는 다양한 지역화 요구 사항을 지원합니다. 예를 들어, 숫자를 표시하는 방식이나 날짜 형식이 지역에 따라 다르기 때문에, 이를 적절하게 지원하는 것이 중요합니다.

  • 디버깅: 특히 Python 3.8부터는 f-string의 = 연산자를 사용하여 표현식과 그 결과를 함께 출력할 수 있습니다. 이는 디버깅 과정에서 매우 유용합니다.




예를 들면 아래의 예시와 같이, 실수를 출력할 때 소수점 아래 자릿수를 제한하거나, 정수를 출력할 때 쉼표를 사용하여 천 단위를 구분하는 것이 가능합니다.

# 소수점 아래의 출력을 2자리로 제한합니다.
pi = 3.14159265358979
print(f"Pi to 2 decimal places: {pi:.2f}")
# 천 단위마다 쉼표를 표시합니다.
print(f"One million with commas: {1000000:,}")
Pi to 2 decimal places: 3.14
One million with commas: 1,000,000

이 코드는 다음과 같은 출력을 생성합니다.

Pi to 2 decimal places: 3.14
One million with commas: 1,000,000

포맷 명세 미니 언어 깊게 파보기⭐⭐⭐

파이썬의 포맷 명세 미니 언어 는 다음과 같은 형태로 규정할 수 있습니다.

{:[fill][align][sign][z][#][0][width][grouping_option][.precision][type]}

아주 복잡해 보이지만, 찬찬히 하나씩 살펴보면 그다지 어렵지 않습니다.

각 요소는 다음과 같은 의미를 가집니다:

  • fill: 공백을 채울 문자를 지정합니다.
  • align: 정렬 방식을 지정합니다 (<는 왼쪽 정렬, >는 오른쪽 정렬, ^는 가운데 정렬, =는 부호와 숫자 사이를 채웁니다).
  • sign: 부호 표시를 지정합니다 (+는 양수와 음수 모두에 부호를 붙이고, -는 음수에만 부호를 붙이며,는 양수에는 공백을, 음수에는 -를 붙입니다).
  • z(3.11에 추가): 포맷 정밀도로 반올림 후 음의 제로 부동 소수점 값을 양의 제로로 강제합니다. 이 옵션은 부동 소수점 프레젠테이션 타입에만 유효합니다.
  • #: 0b, 0o, 0x와 같은 진법 접두어를 자동으로 표시해 줍니다. 정수에만 적용이 가능합니다.
  • 0: 숫자형에 해당하는 변수에 한해서, 필드 너비에 맞게 0으로 채웁니다.(기본적으로 =정렬을 따릅니다. -> 3.10에서 변경)
  • width: 최소 필드 너비를 지정합니다.
  • grouping_option: 천 단위로 콤마를 붙이는 등의 숫자 그룹화 옵션을 지정합니다.
  • .precision: 부동소수점 수의 소수점 이하 자릿수나 문자열의 최대 너비를 지정합니다.
  • type: 출력될 데이터의 형식을 지정합니다 (b, d, o, x는 각각 이진수, 십진수, 팔진수, 16진수 형식의 정수를 의미하며, e, f, g는 각각 지수형, 고정소수점, 일반형 실수를 의미합니다. s는 문자열을 의미합니다).

아래에서 각각의 요소에 대해 더 자세히 알아봅시다!

fill, width, align, precision ⭐⭐⭐

  • width: 출력할 데이터에 대한 폭을 지정합니다.
  • fill: 공백을 채울 문자를 지정합니다.
  • align: 출력할 데이터를 어떻게 정렬할지 정합니다.
  • precision: 숫자형에 한해서, 소수점 이하 자릿수를 얼마나 표현할지 정할 수 있습니다.

width(정수)

데이터를 출력할 최소 폭을 지정합니다. (width를 정의하지 않은 경우, 필드의 폭은 항상 채울 데이터와 동일한 크기를 가집니다.)

# width 예제
number = 12345

# 일반 출력(폭=5)
print(f"{number}")

#width을 10으로 지정
print(f"{number:10}")  

#데이터의 출력길이가 width보다 길면 width가 적용되지 않습니다.
print(f"{number:2}")
12345
     12345
12345

fill

출력할 데이터의 길이가 width보다 작을 때, 남은 공백을 어떤 문자로 채울지 정합니다.(default=공백)

# fill과 width를 사용하는 예제
name = "정렬"
# 일반 출력
print(f"{name}")
# 데이터의 폭=10, 좌측 정렬, 공백을 채울 문자 '*'
print(f"{name:*<10}")
# 데이터의 폭=10, 가운데 정렬, 공백을 채울 문자 '$'
print(f"{name:$^10}")
# 데이터의 폭=10, 우측 정렬, 공백을 채울 문자 'ㅠ'
print(f"{name:ㅠ>10}")
정렬
정렬********
$$$$정렬$$$$
ㅠㅠㅠㅠㅠㅠㅠㅠ정렬

precision

소수점 아래 몇자지를 표현할지 정합니다.

# precision을 사용하는 예제
pi = 3.1415926535
print(f"{pi:.4f}")  
# 출력>>>: '3.1416'

# fill, width, precision을 동시에 사용하는 예제
print(f"{pi:0>10.2f}")  
#출력>>> '0000003.14'
3.1416
0000003.14

디버깅에 유용한 = 지정자 ⭐⭐⭐

Python 3.8부터는 f-string이 "self-documenting expressions"를 지원하게 되었습니다. 이 기능은 print 함수를 통해 디버깅을 할때 유용하게 사용됩니다. 이를 통해 f"{expr=}"와 같은 형태로 f-string을 작성하면, 해당 식의 텍스트, 등호, 그리고 평가된 표현식의 표현이 확장되어 출력됩니다.

foo = 42
print(f"{foo=}")

위의 코드는 foo=42를 출력합니다. 이는 f"foo={foo}"와 같은 결과를 출력하지만, 변수의 이름을 직접 적을 필요가 없어 코드를 간결하게 만들어 줍니다.

정리

Python의 f-string은 강력한 기능으로, 기존의 문자열 출력 방식을 대체했습니다.


Reference

https://docs.python.org/3/reference/lexical_analysis.html#f-strings
https://peps.python.org/pep-0498/#id19