티스토리 뷰

Python

Python,module fractions [분수]

hwangyoungjae 2016. 5. 19. 13:00
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

파이썬에서 유리수와 관련된 연산을 효율적으로 처리하고자 2.6버전부터 분수(fractions)모듈이 추가되었다분수모듈에는 유리수를 나타내는 Fraction클래스와 최대공약수(GCD:Greatest Common Divisor)를 구하는 모듈 함수가 있다.

※ 유리수는 두 정수의 분수형태로 나타낼수 있는 실수를 말한다. 2, 4/8, 1/3 = 0.333... 이 모두 유리수이다.

반면에 두 정수의 분수 형태로 나타낼수 없는 실수를 무리수라고 한다π(파이_, 는 대표적인 무리수이다.

 

유리수 자체가 분수형태소수형태로 나타낼수 있기 때문에, Fraction객체 역시 다양한 방법으로 생성할수 있다생성된 결과는 분수형태로 저장되며두 정수 사이에 공약수가 존재하면 약분하여 기약분수형태를 만든후 Fraction객체를 생성한다.

Fraction클래스의 생성자는 아래와 같다.

>fractions.Fraction(분자=0, 분모=1)

>fractions.Fraction(Fraction 객체)

>fractions.Fraction(문자열)

첫번째생성자는 두 정수인 분자분모를 받아서 '분자/분모'형태의 유리수를 나타낸다.

만약 입력받은 분모의 값이 '0'인 경우 ZeroDivisionError가 발생한다.

두번째생성자는 이미 생성된 Fraction객체를 입력받아 동일한 인스턴스를 생성한다.

세번째생성자는 문장열형태의 유리수를 입력받아 생성한다.

 

Fraction객체의 생성방법에 대해서 예제를 통하여 알아보겠다.

우선 "fractions.Fraction(분자=0, 분모=1)"생성자를 이용하는 경우이다.

>>> import fractions

>>> fractions.Fraction(4,16) #공약수가 존재하는 경우자동으로 제거

Fraction(1, 4)

>>> fractions.Fraction(-6,21)

Fraction(-2, 7)

>>> fractions.Fraction(3) #분자만 입력되는경우분모는 1이 기본값

Fraction(3, 1)

이미 생성된 Fraction객체를 매개변수로 하여 동일한 유리수를 나타내는 Fraction객체를 생성할수 있다.

>>> f = fractions.Fraction(4,3)

>>> f

Fraction(4, 3)

>>> f2 = fractions.Fraction(f) #Fraction 객체를 이용하여 새로운 Fraction 객체생성

>>> f2

Fraction(4, 3)

또한 문자열형태의 유리수를 입력받아서 Fraction객체를 생성할수 있다이러한 경우 입력가능한 문자열의 형태는 아래와 같다.

- [+ | -] <정수>

- [+ | -] <정수>/<정수>

- [+ | -] <정수>.<정수>

- [+ | -] .<정수>

아래는 이러한 형태의 문자열을 이용하여 Fraction객체를 생성하는 예이다.

>>> fractions.Fraction('6/21'#공약수가 존재하는 경우자동으로 제거됨

Fraction(2, 7)

>>> fractions.Fraction('3.14')

Fraction(157, 50)

>>> fractions.Fraction('   -0.34   '#문자열에 공백/개행이 있어도 가능함

Fraction(-17, 50)

>>> s = '''

-0.34

'''

>>> fractions.Fraction(s)

Fraction(-17, 50)

 

Fraction클래스는 유리수연산을 위한 몇가지 메서드를 가지고 있다.

>from_float(flt)

실수(float)값을 받아서 Fraction객체를 생성

 

>from_decimal(dec)

10진수 값을 받아서 Fraction객체를 생성

 

>limit_denominator(max_denomiator=1000000)

입력받은 분모의 최댓값을 넘지 않은 가장 가까운 Fraction객체를 찾아 반환

 

>__floor__()

해당 유리수를 넘지않는 가장 큰 정수를 반환(내림 연산). 이 메서드는 math.floor()에 의해 호출될수 있다.

 

>__ceil__()

해당 유리수를 넘는 가장 작은 정수를 반환(올림 연산). 이 메서드는 math.ceil()에 의해 호출될수 있다.

 

>__round__()

>__round__(ndigits)

반올림하여 가장 가까운 정수를 반환

 

>fractions.gcd(a,b)

두 정수사이의 최대공약수를 반환

 

기존 생성자와 별개로 2개의 Fraction객체를 생성하는 클래스메서드를 가지고 있다.

>>> from fractions import Fraction

>>> Fraction.from_float(0.5) #float값을 입력받아 Fraction객체 생성

Fraction(1, 2)

>>> Fraction.from_decimal(4) #10진수를 입력받아 Fraction객체 생성

Fraction(4, 1)

 

π(파이)와 같이 무한히 계속되는 소수를 Fraction객체로 생성하면분자와 분모 모두 매우 큰값을 갖게 된다.

이러한 경우 연산의 효율성을 위해서 limit_denominator()메서드를 이용하여 분모의 값을 제한함으로써 분자,분모숫자의 크기를 줄일수 있다이 메서드를 이용하면 인자로 전달된 분모의 값을 넘지 않는원래의 값과 가장 가까운 Fraction객체를 반환한다.

>>> from math import pi, cos

>>> from fractions import Fraction

>>> Fraction.from_float(pi)

Fraction(884279719003555, 281474976710656)

>>> Fraction.from_float(pi).limit_denominator(100) #분모의 값이 100보다 작은 Fraction객체를 반환

Fraction(311, 99)

올림내림반올림과 같은 연산을 위한 메서드도 지원한다.

이 메서드는 명시적인 호출로도 가능하지만일반적으로 math.floor(), math.ceil(),round()와 같은 함수를 통해서 호출하는것이 일반적이다.

>>> from fractions import Fraction

>>> f = Fraction.from_float(3.14)

>>> f.__floor__() #명시적으로 __floor__()메서드를 호출

3

>>> import math

>>> math.floor(f) #floor()함수에 의해서 __floor__()메서드가 호출됨

3

>>> math.ceil(f) #ceil()함수에 의하여 __ceil__()메서드가 호출됨

4

>>> round(f) #round()함수에 의하여 __round__()메서드가 호출됨

3

또한 두수를 입력받아서 최대공약수를 반환하는 클래스메서드 fractions.gcd()가 있다.

>>> import fractions

>>> fractions.gcd(120,180)

60

>>> fractions.gcd(0.5,6)

0.5

 

 

참조 : 빠르게 활용하는 파이썬프로그래밍

'Python' 카테고리의 다른 글

Python,module random [랜덤]  (0) 2016.05.19
Python,module decimal [십진법]  (0) 2016.05.19
Python,module math [수학]  (0) 2016.05.17
Python,module datetime [날짜시간]  (0) 2016.05.17
Python,module time [시간]  (0) 2016.05.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함