본문 바로가기
요약정리/하우투파이썬

f 문자열(feat. 근삿값)

by JustDoIT 2020. 3. 12.

f 문자열     f 문자열 사용하기     f 문자열에 포맷 지정하기     수학의 버림 vs int()     round() 사용하기    


 

f 문자열

이번 글에서는 print()로 데이터를 출력하기 위한 여러 방식 중 하나인 f 문자열을 소개합니다. f 문자열은 파이썬 3.6 이후부터 사용할 수 있는 파이썬의 문자열 삽입string interpolation 방식입니다.

 

문자열 삽입string interpolation
문자열 삽입은 단순하게 생각하자면 프로그래밍에서 문자열 중간에 변수의 값을 특정 형식으로 삽입하기 위한 방식입니다. 대개 변수의 값이 들어갈 자리에 일종의 자리 맡기용 기호를 두고 출력 형식과 변수를 지정하면 문자열이 완성됩니다. 파이썬의 자리 맡기 기호는 { }입니다.

더러 문자열 보간이라는 표현도 사용되나 이는 오해에서 비롯된 것으로 보입니다. 수학에서 말하는 인터폴레이션interpolation보간이 맞습니다. 하지만 문자열 처리에서 인터폴레이션삽입insertion의 다른 표현입니다. interpolate와 insert는 유의어 관계거든요. 이를 차치하더라도 보간은 문자열에 적용할 수도 없는 전혀 다른 과정입니다.

 

에피트로코이드의 점들의 인터폴레이션(출처: WIKIPEDIA)

 

 

f 문자열 사용하기

 

# f_str_basic.py
import math

radius = int(input("반지름: "))
area = radius * radius * math.pi
print(f"넓이: {area}")


# 실행 결과
반지름: 100
넓이: 31415.926535897932

 

f 문자열은 f"..."의 형태로 틀을 갖추고, { }를 자리 맡기 기호로 사용해 문자열을 완성하는 구조입니다. 중괄호 안에는 변수를 지정합니다. area는 연산 결과에 따라 부동소수점수로 처리됩니다. f 문자열에도 format()이나 % 포맷을 적용할 때처럼 자릿수를 지정할 수 있습니다.

 

 

f 문자열에 포맷 지정하기

 

# f_str_basic_format.py
import math

radius = int(input("반지름: "))
area = radius * radius * math.pi
print(f"넓이: {area}")
print(f"넓이: {area:.0f}")	# .0f는 소수점 첫째 자리에서 반올림합니다.


# 실행 결과
반지름: 100
넓이: 31415.926535897932
넓이: 31416

 

여기서 한 가지 주의해야 합니다. {area:.0f}는 소수점 첫째 자리에서 반올림하는 반면, int()를 사용해 정수로 변환하면 무조건 소수점 이하가 잘립니다(수학의 버림과 다릅니다). 다음 코드를 비교해 보세요.

 

# f_str_basic_format_int.py
import math

radius = int(input("반지름: "))
area = radius * radius * math.pi
print(f"넓이(단순 area 출력): {area}")
print(f"넓이(.0f 자릿수 지정): {area:.0f}")
print(f"넓이(int() 변환): {int(area}")


# 실행 결과
반지름: 100
넓이(단순 area 출력): 31415.926535897932
넓이(.0f 자릿수 지정): 31416
넓이(int() 변환): 31415

 

수학의 버림 vs int()
수학에서는 버림을 적용하면 원래 수보다 작아집니다. 3.14나 3.94를 소수점 첫째 자리에서 버림하면 3이 됩니다. 따라서 -3.14를 같은 자리에서 버림하면 -4가 되고, -3.94 또한 -4가 됩니다. 그리고 -314를 일의 자리에서 버림하면 -320이 됩니다.

반면, int()는 소수점 이하의 절사, 즉 잘라 버림을 적용합니다. int(3.14)int(3.94)는 3이고, int(-3.14)int(-3.94)는 -3이 됩니다. 따라서 음수에 버림을 적용해야 할 때는 int() 대신 math 모듈의 floor()를 사용해야 합니다.

 

버림 vs 내림
수학 용어로서 버림과 내림은 동의어입니다. 하지만 프로그래밍에서는 내림을 버림과 달리 취급해 절사, 즉 잘라 버림의 의미로 잘못 사용하는 경우가 있습니다. 파이썬에서 절사를 구현한 메서드는 math 모듈의 trunc()입니다.

 

round()
round()는 반올림을 구현한 파이썬의 내장 함수입니다. 우리는 흔히 5 이상이면 올리고, 5 미만이면 내리는(버리는) 방식으로 반올림을 계산합니다. 이를 가리켜 사사오입 방식이라고 합니다. 그런데 round()오사오입 방식에 따라 동작합니다. 오사오입은 사사오입과 기본적으로는 같지만, 5의 경우에는 5의 앞자리가 홀수일 때만 올림을 하고 짝수일 때는 버림을 합니다. 하지만 이는 정수로 반올림할 때만 적용됩니다. 소수점 이하 부분에서 반올림을 계산할 때는 사사오입이 적용됩니다. 다만, 버그가 존재하니 주의해야 합니다. 아래 코드를 참고하세요.

 

 

round() 사용하기

 

>>> round(53.5)
54		# 앞 자리가 홀수라서 짝수에 맞춰 반올림됩니다.
>>> round(54.5)
54		# 55가 아닙니다.
		# 앞 자리가 짝수라서 그렇습니다.

>>> round(53.545, 2)
53.55	# 오사오입이 아닌 사사오입에 따른 결과입니다.
>>> round(53.535, 2)
53.53	# 파이썬의 버그로 보입니다.
>>> round(53.536, 2)
53.54	# 올바른 결과입니다.

>>> round(53.5333335, 6)
53.533333
>>> round(53.5333345, 6)
53.533335

# round(number, ndigits)에서 ndigits는 소수점 이하 자리의 개수입니다.
# 따라서 실제 반올림은 ndigits+1 자리에서 일어납니다.

 

여기까지입니다. 읽어 주셔서 고맙습니다.

 

Today is mutant yesterdays.
영리 목적으로는 저자의 허락 없이 편집, 배포하실 수 없습니다.
Authored by justdoit709@gmail.com

댓글