레이블이 정수인 게시물을 표시합니다. 모든 게시물 표시
레이블이 정수인 게시물을 표시합니다. 모든 게시물 표시

2022년 10월 24일 월요일

파이썬 정수 나눗셈 (/, // 차이)

 이건 버젼별로 살짝 다른 부분이 있습니다. 파이썬 2.7에서 다음과 같이 나누기를 하면 나눗셈 연산이 버림을 기본으로 하는 정수 연산으로 수행이 됩니다. 정수끼리 나눗셈을 하면 정수를 리턴하고 , 실수가 중간에 끼어있으면 실수값이 리턴됩니다.

이게 C와 비슷한데 정수끼리 나눗셈을 할 경우 기본적으로 정수로 가정해서 연산을 하고는 합니다. 실수형을 리턴받기 위해서는 아래와 같이 하나를 실수로 변경(2 -> 2.0)하면 결과값이 실수가 리턴이 됩니다.

# python 2.7 
4 / 2 
>> 2 # int
4 / 2.0
>> 2.0 # float

파이썬 3에서는 / 연산은 float 을 리턴합니다. 즉, 나눗셈연산이 기본적으로 실수연산으로 전환이 됩니다. 정수연산을 하기위해서는 // 을 사용해서 정수연산을 수행합니다.

# python 3
4 / 2 
>> 2.0 # float
4 // 2
>> 2 # int

/ 연산자를 floating으로 전환 한다해도 정수연산이 필요한 경우가 여전히 존재하므로, 이때는 //로 정수 나눗셈연산으로 처리를 할 수가 있습니다.

이걸 왜 구분해야하는냐 이 float 연산과 int 연산은 속도 차이가 좀 있습니다. 보통은 나눗셈연산이 오래 걸리기때문에, 정수로 처리할 수 있는 것들은 정수로 처리하는게 수행시간 측면에서 유리합니다 그리고 이런 나눗셈연산자는 % 와 같은 나머지 연산자와 보통 정수와 같이 핸들링하는 경우가 많습니다.

그래서 이 차이를 알고 사용하는 것이 좀더 최적화된 구조를 만드는데 도움이 되리라 생각합니다.

이번에는 정수 나눗셈연산에 정리해보았습니다. 이부분이 실제로 작성하다보면 종종 놓치는 부분이기도 하니, 이 정수 나눗셈이 버젼별로 다름을 살짝 인지하고 정수 나눗셈이랑 실수 나눗셈을 구분해서 사용하면 좋을듯합니다.

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   |