Друзья, если вам нужно перепечатать, пожалуйста, указывайте источник:blog.CSDN.net/Генерал сказал, о...
Отказ от ответственности: во время обучения технологии искусственного интеллекта многие студенты задавали мне некоторые вопросы, связанные с Python, поэтому, чтобы дать студентам более обширные знания и лучшее понимание технологии искусственного интеллекта, я попросил своего помощника поделиться этой серией. учебников по python Надеюсь, поможет всем! Поскольку этот учебник по Python написан не мной, он не такой забавный и юмористический, как мое обучение технологии ИИ, и его более скучно изучать; но его знания все еще на месте, и его также стоит прочитать! PS: Для студентов, которые не понимают эту статью, пожалуйста, сначала прочитайте предыдущую статью, и вам не составит труда учиться понемногу каждый день шаг за шагом!
Python 2.6 и Python 3.0 представили новый числовой тип — дробь, который реализует объект рационального числа. Он явно сохраняет числитель и знаменатель, что позволяет избежать некоторых неточностей и ограничений математики с плавающей запятой.
Дроби являются «близкими родственниками» существующих десятичных типов с фиксированной точностью, представленных в предыдущей статье, и все они могут контролировать числовую точность, фиксируя количество десятичных разрядов и определяя стратегию округления или усечения. Дроби используются аналогично десятичным числам, которые также существуют в модуле; импорт его конструктора и передача числителя и знаменателя дает дробь. В следующем интерактивном примере показано, как это сделать:
>>> from fractions import Fraction
>>> x = Fraction(1,3) # Numerator,denominator
>>> y = Fraction(4,6) # Simplified to 2,3 by gcd
>>> x
Fraction(1,3)
>>> y
Fraction(2,3)
>>> print(y)
2/3
Как только дробь создана, ее можно использовать в математических выражениях, как обычно:
>>> x + y
Fraction(1,1)
>>> x - y # Results are exact: numerator,denominator
Fraction(-1,3)
>>> x * y
Fraction(2,9)
Объекты дробей также могут быть созданы из строк с плавающей запятой, очень похожих на десятичные дроби:
>>> Fraction('.25')
Fraction(1,4)
>>> Fraction('1.25')
Fraction(5,4)
>>>
>>> Fraction('.25') + Fraction('1.25')
Fraction(3,2)
Ограничения чисел с плавающей запятой особенно ярко выражены для значений, которые не могут быть точно представлены с заданным конечным числом битов в памяти. И дроби, и десятичные числа предлагают способы получения точных результатов, хотя и за счет скорости. Например, в приведенном ниже примере число с плавающей запятой не совсем дает ожидаемый ответ 0, но два других типа дают:
>>> 0.1 + 0.1 + 0.1 - 0.3 # This should be zero (close,but not exact)
5.5511151231257827e-17
>>> from fractions import Fraction
>>> Fraction(1,10) + Fraction(1,10) + Fraction(1,10) - Fraction(3,10)
Fraction(0,1)
>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')
Кроме того, и дроби, и десятичные числа могут обеспечить более интуитивно понятные и точные результаты, чем числа с плавающей запятой, и они делают это по-разному (используя рациональное представление и ограничивая точность):
>>> 1 / 3 # Use 3.0 in Python 2.6 for true "/"
0.33333333333333331
>>> Fraction(1,3) # Numeric accuracy
Fraction(1,3)
>>> import decimal
>>> decimal.getcontext().prec = 2
>>> decimal.Decimal(1) / decimal.Decimal(3)
Decimal('0.33')
На самом деле дробь остается точной, а результат автоматически упрощается. Продолжая предыдущий интерактивный пример:
>>> (1 / 3) + (6 / 12) # Use ".0" in Python 2.6 for true "/"
0.83333333333333326
>>> Fraction(6,12) # Automatically simplified
Fraction(1,2)
>>> Fraction(1,3) + Fraction(6,12)
Fraction(5,6)
>>> decimal.Decimal(str(1/3)) + decimal.Decimal(str(6/12))
Decimal('0.83')
>>> 1000.0 / 1234567890
8.1000000737100011e-07
>>> Fraction(1000,1234567890)
Fraction(100,123456789)
Дроби и числа с плавающей запятой могут быть преобразованы друг в друга:
>>> (2.5).as_integer_ratio() # float object method
(5,2)
>>> f = 2.5
>>> z = Fraction(*f.as_integer_ratio()) # Convert float -> fraction: two args
>>> z # Same as Fraction(5,2)
Fraction(5,2)
>>> x # x from prior interaction
Fraction(1,3)
>>> x + z
Fraction(17,6) # 5/2 + 1/3 = 15/6 + 2/6
>>> float(x) # Convert fraction -> float
0.33333333333333331
>>> float(z)
2.5
>>> float(x + z)
2.8333333333333335
>>> 17 / 6
2.8333333333333335
>>> Fraction.from_float(1.75) # Convert float -> fraction: other way
Fraction(7,4)
>>> Fraction(*(1.75).as_integer_ratio())
Fraction(7,4)
В выражениях также допускается смешивание определенных типов, хотя Fraction иногда необходимо передавать вручную для обеспечения точности:
>>> x
Fraction(1,3)
>>> x + 2 # Fraction + int -> Fraction
Fraction(7,3)
>>> x + 2.0 # Fraction + float -> float
2.3333333333333335
>>> x + (1./3) # Fraction + float -> float
0.66666666666666663
>>> x + (4./3)
1.6666666666666665
>>> x + Fraction(4,3) # Fraction + Fraction -> Fraction
Fraction(5,3)
Предупреждение. Хотя можно преобразовать число с плавающей запятой в дробь, в некоторых случаях при этом происходит неизбежная потеря точности, поскольку число в форме с плавающей запятой является неточным.
Моя общедоступная учетная запись WeChat называется «Обмен знаниями об искусственном интеллекте».