formatted string을 이용할 때 대략 세가지 정도의 방법이 있습니다.
첫번째가 c-style string format인 %-formatting ,
두번째, string format 이 기존에 제공되었던 방법이라면
세번째, python 3.6 부터는 f-string 이란 것을 제공합니다.
오늘 이야기 드릴 것은 f-string입니다. 이것 정말 편합니다
아래는 예제입니다.
name = "Alice"
score = 0.12345
print (f'Name : {name} / Score : {score:.2%}')
a = 2
b = 3
print (f'{a} + {b} = {a+b}')
이런식으로 inline으로 문자를 치환하는 방식을 string interpolation 이라고도 이야기합니다.
이게 문자열 보간이라고 번역이 되어서, 문자열 보간이라는 용어도 사용합니다.
python에서는 Jinja2, mako 같은 template engine들이 이런 기능을 제공하고 있었는데,
더 간결하게 지원을 합니다.
이것은 어찌보면 간단한 template을 내장한 형태인데, 간결하면서도
굉장히 편리합니다.
C-style인 %-formatting에서는 %2d와 같은 형태로 지원하기때문에 기본적으로 줄맞추기가 굉장히 수월합니다. 이런 부분 역시, {aaa:2d} 와 같은 형태로 :(콜론)을 가지고 자리수를 맞추는 기능도 지원이 됩니다.
f-string은 mustache 를 사용하는 template들과 비슷하기도 합니다
게다가 scope상의 variable들이 인자가 되어서, 따로 변수들을 입력할 필요가 없이 동작합니다.
그 결과 template에 기본적으로 들어가는 if branch 구문이나, for loop 같은 건 없지만,
굉장히 편리하면서도 사용하기 용이합니다.
물론 대규모시스템의 MVC같은 형태로 template과 로직을 분리해서 하는 것과 비교하면
좀 안맞을 수도 있지만, 효율성이 시스템을 압도하는 케이스로 만들어 버린 것 같습니다.
이 기능은 처음엔 낮설지만 사용하다 보면, print관련해서 이것만큼 편리한 기능은 없어 보입니다. python 3.6 이상 사용하시면, 별도 템플릿 엔진을 사용하지 않더라도, 거의 템플릿엔진 수준으로 사용 가능하니, 꼭 활용 하시는 것 추천 드립니다.
아래는 좀더 예제를 보강합니다
정수, 16진수, 2진수 정렬
많이들 사용하는 정수 , 16진수, 2진수에 대한 예제들입니다.
score1 = 240
print (f'Score (hex) : {score1:x}') # hex 소문자
print (f'Score (hex) : {score1:X}') # hex 대문자
print (f'Score (dec) : {score1:d}') # dec
print (f'Score (bin) : {score1:b}') # binary
print (f'Score (hex) : {score1:4x}') # 4자리 hex : default는 오른쪽 정령
print (f'Score (dec) : {score1:4d}') # 4자리 dec : 빈칸은 놔두고 오른쪽 정렬
print (f'Score (bin) : {score1:12b}') # 12자리 bin : default는 오른쪽 정렬
print (f'Score (bin) : {score1:<12b}') # 12자리 bin : 왼쪽정렬
print (f'Score (hex) : {score1:04x}') # 4자리 hex : 빈자리는 0으로 채움
print (f'Score (dec) : {score1:04d}') # 4자리 dec : 빈자리는 0으로 채움
print (f'Score (bin) : {score1:012b}') # 12자리 bin : 빈자리는 0으로 채움
결과 :
Score (hex) : f0
Score (hex) : F0
Score (dec) : 240
Score (bin) : 11110000
Score (hex) : f0
Score (dec) : 240
Score (bin) : 11110000
Score (bin) : 11110000
Score (hex) : 00f0
Score (dec) : 0240
Score (bin) : 000011110000
소수점자리 지정 및 자리지정
formatting하는건 string formatter와 비슷합니다.
score1 = 0.12345
score2 = -0.34567
print (f'Score1 : {score1:x%}')
print (f'Score2 : {score1:.3f}')
# Score1 : 12.35%
# Score2 : 0.123
score1 = 24
score2 = 23
print (f'Score1 : {score1:x}')
print (f'Score2 : {score1:x}')
# Score1 : 12.35%
# Score2 : 0.123
자리 정렬 (alignment)
정렬의 경우 아래와 같이 왼쪽, 오른쪽, 가운데 정렬을 합니다. 아래와 같이 직관적입니다.
score1 = 0.12345
print (f'left : |{score1:<10.2f}|')
print (f'right : |{score1:>10.2f}|')
print (f'center : |{score1:^10.2f}|')
#left : |0.12 |
#right : | 0.12|
#center : | 0.12 |