Модуль Fraction в Python: примеры создания дробей
Модуль Fraction в Python используется для работы с арифметикой рациональных чисел. Этот модуль позволяет нам создавать дробные экземпляры целых чисел, чисел с плавающей запятой, десятичных чисел и строк.
Что такое дробный экземпляр?
Дробные экземпляры могут быть созданы с использованием пары целых чисел, строки или другого рационального числа. Они являются хешируемыми и должны рассматриваться как изменяемые.
Как создать дробь?
Модуль Fraction в Python предоставляет следующие встроенные функции, которые используются для создания дроби. Давайте разберемся в следующих способах создания дроби.
- class fractions.Function(numerator = 0, denominator = 1): – Этот метод по умолчанию присваивает числителю значение 0 и знаменателю 1. Если знаменатель равен 0, это вызовет ошибку Zerodivision. Давайте разберемся в следующем примере.
from fractions import Fraction print(Fraction(10, 37)) # returns Fraction(11, 35) print(Fraction(11, 18)) # returns Fraction(5, 9) print(Fraction()) # returns Fraction(0, 1)
- class fractions.Fraction(other_fraction): этот метод принимает экземпляр other_fraction числа. Он возвращает рациональные и дробные экземпляры с одинаковым значением.
- class fractions.Fraction(float): – этот метод принимает значение с плавающей запятой и возвращает тот же экземпляр значения дроби.
from fractions import Fraction print(Fraction(1/12))
6004799503160661/72057594037927936
- class fractions.Fraction(decimal): этот метод принимает десятичный экземпляр и возвращает экземпляр с тем же значением. Давайте разберемся в следующем примере.
from fractions import Fraction print(Fraction('2.26'))
- class fractions.Fraction(string): этот метод принимает строку или Unicode в качестве аргумента и возвращает экземпляр с тем же значением.
from fractions import Fraction print(Fraction('7/25')) print(Fraction('1.23')) print(Fraction('3/5')) print(Fraction('1.414213 \t\n'))
7/25 123/100 3/5 1414213/1000000
- limit_denominator(max_denominator = 1000000) – используется для нахождения приближения к заданному числу с плавающей запятой. Возвращает заданную дробь self, знаменатель которой равен max_denominator. Разберем в следующих примерах.
from fractions import Fraction print(Fraction('3.14159265358979323846')) print(Fraction('3.14159265358979323846').limit_denominator(10000)) print(Fraction('3.14159265358979323846').limit_denominator(100)) print(Fraction('3.14159265358979323846').limit_denominator(10)) print(Fraction(125, 50).numerator) print(Fraction(125, 50).denominator)
157079632679489661923/50000000000000000000 355/113 311/99 22/7 5 2
Пример – 2: Выполнение математической операции с дробным числом.
from fractions import Fraction print(Fraction(56, 12) + Fraction(18, 25)) print(Fraction(5, 2) / Fraction(12, 10)) print(Fraction(16, 15) * Fraction(26, 39)) print(Fraction(18, 5) * Fraction(15, 36)) print(Fraction(22, 5) ** Fraction(6, 10))
404/75 25/12 32/45 3/2 2.4326050606703427
Заключение
В этом руководстве мы обсудили модуль Fraction и несколько его важных методов. Эти методы можно использовать в проектах сложных математических вычислений и машинного обучения.
fractions — Rational numbers¶
The fractions module provides support for rational number arithmetic.
A Fraction instance can be constructed from a pair of integers, from another rational number, or from a string.
class fractions. Fraction ( numerator = 0 , denominator = 1 ) ¶ class fractions. Fraction ( other_fraction ) class fractions. Fraction ( float ) class fractions. Fraction ( decimal ) class fractions. Fraction ( string )
The first version requires that numerator and denominator are instances of numbers.Rational and returns a new Fraction instance with value numerator/denominator . If denominator is 0 , it raises a ZeroDivisionError . The second version requires that other_fraction is an instance of numbers.Rational and returns a Fraction instance with the same value. The next two versions accept either a float or a decimal.Decimal instance, and return a Fraction instance with exactly the same value. Note that due to the usual issues with binary floating-point (see Floating Point Arithmetic: Issues and Limitations ), the argument to Fraction(1.1) is not exactly equal to 11/10, and so Fraction(1.1) does not return Fraction(11, 10) as one might expect. (But see the documentation for the limit_denominator() method below.) The last version of the constructor expects a string or unicode instance. The usual form for this instance is:
[sign] numerator ['/' denominator]
where the optional sign may be either ‘+’ or ‘-’ and numerator and denominator (if present) are strings of decimal digits (underscores may be used to delimit digits as with integral literals in code). In addition, any string that represents a finite value and is accepted by the float constructor is also accepted by the Fraction constructor. In either form the input string may also have leading and/or trailing whitespace. Here are some examples:
>>> from fractions import Fraction >>> Fraction(16, -10) Fraction(-8, 5) >>> Fraction(123) Fraction(123, 1) >>> Fraction() Fraction(0, 1) >>> Fraction('3/7') Fraction(3, 7) >>> Fraction(' -3/7 ') Fraction(-3, 7) >>> Fraction('1.414213 \t\n') Fraction(1414213, 1000000) >>> Fraction('-.125') Fraction(-1, 8) >>> Fraction('7e-6') Fraction(7, 1000000) >>> Fraction(2.25) Fraction(9, 4) >>> Fraction(1.1) Fraction(2476979795053773, 2251799813685248) >>> from decimal import Decimal >>> Fraction(Decimal('1.1')) Fraction(11, 10)
The Fraction class inherits from the abstract base class numbers.Rational , and implements all of the methods and operations from that class. Fraction instances are hashable , and should be treated as immutable. In addition, Fraction has the following properties and methods:
Changed in version 3.2: The Fraction constructor now accepts float and decimal.Decimal instances.
Changed in version 3.9: The math.gcd() function is now used to normalize the numerator and denominator. math.gcd() always return a int type. Previously, the GCD type depended on numerator and denominator.
Changed in version 3.11: Underscores are now permitted when creating a Fraction instance from a string, following PEP 515 rules.
Changed in version 3.11: Fraction implements __int__ now to satisfy typing.SupportsInt instance checks.
Numerator of the Fraction in lowest term.
Denominator of the Fraction in lowest term.
Return a tuple of two integers, whose ratio is equal to the Fraction and with a positive denominator.
Alternative constructor which only accepts instances of float or numbers.Integral . Beware that Fraction.from_float(0.3) is not the same value as Fraction(3, 10) .
From Python 3.2 onwards, you can also construct a Fraction instance directly from a float .
Alternative constructor which only accepts instances of decimal.Decimal or numbers.Integral .
From Python 3.2 onwards, you can also construct a Fraction instance directly from a decimal.Decimal instance.
Finds and returns the closest Fraction to self that has denominator at most max_denominator. This method is useful for finding rational approximations to a given floating-point number:
>>> from fractions import Fraction >>> Fraction('3.1415926535897932').limit_denominator(1000) Fraction(355, 113)
or for recovering a rational number that’s represented as a float:
>>> from math import pi, cos >>> Fraction(cos(pi/3)) Fraction(4503599627370497, 9007199254740992) >>> Fraction(cos(pi/3)).limit_denominator() Fraction(1, 2) >>> Fraction(1.1).limit_denominator() Fraction(11, 10)
>>> from math import floor >>> floor(Fraction(355, 113)) 3
Returns the least int >= self . This method can also be accessed through the math.ceil() function.
__round__ ( ) ¶ __round__ ( ndigits )
The first version returns the nearest int to self , rounding half to even. The second version rounds self to the nearest multiple of Fraction(1, 10**ndigits) (logically, if ndigits is negative), again rounding half toward even. This method can also be accessed through the round() function.
The abstract base classes making up the numeric tower.
fractions — Рациональные числа¶
Модуль fractions реализует поддержку арифметики рациональных чисел.
Экземпляр Fraction может создаваться из пары целых чисел, из другого рационального числа или из строки.
class fractions. Fraction ( numerator=0, denominator=1 ) ¶ class fractions. Fraction ( other_fraction ) class fractions. Fraction ( float ) class fractions. Fraction ( decimal ) class fractions. Fraction ( string )
Первая версия требует, чтобы numerator и denominator были экземплярами numbers.Rational , и возвращала новый экземпляр Fraction со значением numerator/denominator . Если denominator равен 0 , возникает ZeroDivisionError . Вторая версия требует, чтобы other_fraction был экземпляром numbers.Rational и возвращал экземпляр Fraction с тем же значением. Следующие две версии принимают экземпляр float или decimal.Decimal и возвращают экземпляр Fraction с точно таким же значением. Обратите внимание, что из-за обычных проблем с двоичными числами с плавающей запятой (см. Арифметика с плавающей запятой: проблемы и ограничения ) аргумент Fraction(1.1) не совсем равен 11/10, поэтому Fraction(1.1) не возвращает Fraction(11, 10) , как и можно было ожидать. (Но см. документацию для метода limit_denominator() ниже.) Последняя версия конструктора ожидает строку или Юникод экземпляр. Обычная форма для этого случая:
[sign] numerator ['/' denominator]
где необязательный sign может быть либо «+», либо «-», а numerator и denominator (если присутствуют) являются строками десятичных цифр. Кроме того, любая строка, представляющая конечное значение и принимаемая конструктором float , также принимается конструктором Fraction . В любой форме входная строка также может иметь начальные и/или конечные пробелы. Вот несколько примеров:
>>> from fractions import Fraction >>> Fraction(16, -10) Fraction(-8, 5) >>> Fraction(123) Fraction(123, 1) >>> Fraction() Fraction(0, 1) >>> Fraction('3/7') Fraction(3, 7) >>> Fraction(' -3/7 ') Fraction(-3, 7) >>> Fraction('1.414213 \t\n') Fraction(1414213, 1000000) >>> Fraction('-.125') Fraction(-1, 8) >>> Fraction('7e-6') Fraction(7, 1000000) >>> Fraction(2.25) Fraction(9, 4) >>> Fraction(1.1) Fraction(2476979795053773, 2251799813685248) >>> from decimal import Decimal >>> Fraction(Decimal('1.1')) Fraction(11, 10)
Класс Fraction наследуется от абстрактного базового класса numbers.Rational и реализует все методы и операции данного класса. Экземпляры Fraction можно хэшировать, и их следует рассматривать как неизменяемые. Кроме того, Fraction обладает следующими свойствами и методами:
Изменено в версии 3.2: Конструктор Fraction теперь принимает экземпляры float и decimal.Decimal .
Знаменатель дроби в наименьшем члене.
Возвращает кортеж из двух целых чисел, отношение которых равно дроби и имеет положительный знаменатель.
Данный метод класса создаёт Fraction , представляющий точное значение flt, которое должно быть float . Имейте в виду, что Fraction.from_float(0.3) не совпадает со значением Fraction(3, 10) .
Начиная с Python 3.2, вы также можете создать экземпляр Fraction непосредственно из float .
Данный метод класса создаёт Fraction , представляющий точное значение dec, которое должно быть экземпляром decimal.Decimal .
Начиная с Python 3.2, вы также можете создать экземпляр Fraction непосредственно из экземпляра decimal.Decimal .
Находит и возвращает ближайший Fraction к self , знаменатель которого не превышает max_denominator. Данный метод полезен для поиска рациональных приближений к заданному числу с плавающей запятой:
>>> from fractions import Fraction >>> Fraction('3.1415926535897932').limit_denominator(1000) Fraction(355, 113)
или для восстановления рационального числа, представленного в виде числа с плавающей запятой:
>>> from math import pi, cos >>> Fraction(cos(pi/3)) Fraction(4503599627370497, 9007199254740992) >>> Fraction(cos(pi/3)).limit_denominator() Fraction(1, 2) >>> Fraction(1.1).limit_denominator() Fraction(11, 10)
>>> from math import floor >>> floor(Fraction(355, 113)) 3
Возвращает наименьшее значение int >= self . К этому методу также можно получить доступ через функцию math.ceil() .
__round__ ( ) ¶ __round__ ( ndigits )
Первая версия возвращает ближайший int к self , округляя половину до четного. Вторая версия округляет self до ближайшего кратного Fraction(1, 10**ndigits) (логично, если ndigits отрицательно), снова округляя половину до четного. К этому методу также можно получить доступ через функцию round() .
Возвращает наибольший общий делитель целых чисел a и b. Если a или b отличны от нуля, то абсолютное значение gcd(a, b) является наибольшим целым числом, которое делится на a и b. gcd(a,b) имеет тот же знак, что и b, если b не равен нулю; в противном случае он принимает знак a. gcd(0, 0) возвращает 0 .
Не рекомендуется, начиная с версии 3.5: Вместо нее используйте math.gcd() .
Модуль numbers Абстрактные базовые классы, составляющие числовую башню.