2020년 2월 12일 수요일

Python f-string (3.6이상), 문자열 보간, 소수점 추가


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%}')
# Name : Alice / Score : 12.35%
a = 2
b = 3
print (f'{a} + {b} = {a+b}')
# 2 + 3 = 5
# 개별값도 출력가능하고 계산값도 출력가능 
# {} 안에는 위와 같이 expression이 들어가도 됨..


이런식으로 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   |



2020년 2월 4일 화요일

파이썬 삼항 연산자


보통 C나 예전 언어들 보면 Ternary operator라고 삼항 연산자라는게 있다.

형식이 대략 아래와 같은데,
A ? B : C


파이썬에서는 위와 같이 ?(물음표)를 사용하지 않고

B if A else C


와 같은 형태로 guide를 하고 있다.

근데 이건 다른 언어들이랑 다르고 줄세우기 할때 가독성도 떨어지는데,,
아래와 같은 방법으로도 가능하다.

(C,B)[A]

튜플을 이용한 방법인데 참이면 1이므로 B, 거짓이면 0이므로 C를 선택하는 것이다.

그외에  A and B or C와 같이 short circuit구문을 이용하는 방법도 있는데,
이게 기존 다른언어의 삼항연산자들과 순서가 맞긴하다.

다만 이건 판정중에, B의 실제 값이 0인 경우 그 항이 False가 되면서
C가 실행되는 점이 있어서, 추천하지는 않는다.