Python 라이브러리 공부 기록 04. 숫자와 수학모듈
카테고리: Python
💡
파이썬에서 자주 쓰이는 라이브러리, 통계, 데이터 분석에 유용한 라이브러리들을 학습하고 정리한 페이지입니다.
관심분야인 야구에 관한 응용문제를 직접 만들어 풀어보며 학습했습니다.
04. 숫자와 수학모듈
04-01 math.gcd - 최대공약수
math.gcd
함수는 최대공약수를 구하는 함수이다. 인수에 숫자를 입력하면 그 숫자들의 최대공약수를 출력해준다.
사탕 60개와 초콜릿 100개 그리고 젤리 80개를 각각 나누어 똑같이 봉지에 나누어 담으려고 한다. 최대한으로 만들수 있는 봉지의 개수를 구해보자.
import math
math.gcd(60,100,80)
#결과
20
04-02. math.icm - 최소공배수
math.icm
함수는 최소공배수를 구하는 함수이다. 인수에 숫자를 입력하면 그 숫자들의 최소공배수를 출력해준다.
import math
math.icm(15,25) #15와 25의 최소공배수
#결과
75
04-03. decimal.Decimal - 정확한 소수점 연산
decimal.Decimal
모듈은 숫자를 10진수로 처리하여 정확한 소수점 자릿수를 표현할 때 사용하는 모듈이다.
이진수 기반의 파이썬 float 연산은 미세한 오차가 발생한다. 아래 결과가 이상한 것을 보자.
print(0.1*3)
print(1.2-0.1)
#결과
0.30000000000000004
1.0999999999999999
이를 해결하기 위해 decimal.Decimal
모듈을 사용하자.
인수를 넣을 땐 반드시 문자열로 써줘야 한다!
from decimal import Decimal
print(Decimal('0.1')*3)
print(Decimal('1.2')-Decimal('0.1'))
#결과
0.3
1.1
결과가 잘 출력됐다. Decimal 자료형은 다시 float형으로 변환할 수 있다.
print(float(Decimal('0.1')*3))
print(float(Decimal('1.2')-Decimal('0.1')))
Decimal은 정확성을 향상시키기 위해 고정소수점을 사용하여 메모리를 많이 사용하기 때문에 모든 float연산을 Decimal로 바꾸는 것은 좋은 방법이 아니다.
Decimal은 보통 한치의 오차도 허용하지 않는 금융권 또는 재무/회계 관련 프로그램을 작성할 때 사용하는 것이 유리하다.
04-04. fractions - 유리수
파이썬에서 유리수를 그냥 더하면 미세한 오차가 생긴다. 때문에 fractions.Fraction
을 사용해줘야 한다.
from fractions import Fraction
a = Fraction(1,5)
b = Fraction(2,5)
print(a.numerator) #분자의 값
print(a.denominator) #분모의 값
print(a+b)
print(float(a+b))
#결과
1
5
3/5
0.6
04-05. random - 난수 생성
random
모듈은 난수를 생성할 때 사용하는 모듈이다.
6개의 숫자로 이루어진 로또 번호를 무작위로 생성해 주는 프로그램을 작성해보자. 이 때 숫자는 중복될 수 없다.
random.randint
함수는 임의의 숫자를 생성해준다.
import random
result = []
while len(result) <6:
num = random.randint(1,45)
if num not in result:
result.append(num)
print(result)
리스트의 순서를 무작위로 섞고 싶을 땐 shuffle
함수를 사용하고, 랜덤으로 하나를 선택하려면 choice
함수를 사용한다.
a = [1,2,3,4,5]
random.shuffle(a)
print(a)
print(random.choice(a))
#결과
[3, 5, 4, 1, 2]
4
04-06. statistics - 평균값과 중앙값
평균값은 statistics.mean
을 이용하여 구할 수 있고, 중앙값은 statistics.median
을 이용하여 구할 수 있다.
❓ 문제
2021 보스턴 레드삭스의 투수들의 통산 whip를 나열하고, 이 값의 평균과 중앙값을 출력하라.
💡 정답.
whip = []
for n in statsapi.get('sports_players',{'season':2021, 'gameType':'R'})['people']:
#보스턴 선수이고 투수인 선수를 뽑아서
if n['currentTeam']['id'] == 111 and n['primaryPosition']['code'] =='1':
#스탯 값은 문자열로 출력되니 float을 이용하여 실수로 만든다.
whip.append(float(statsapi.player_stat_data(n['id'], 'pitching', 'career')['stats'][0]['stats']['whip']))
print(whip)
import statistics
print(statistics.mean(whip))
print(statistics.median(whip))
#결과
1.6066666666666667
1.3599999999999999