Учебник серии Python 65

Python

Друзья, если вам нужно перепечатать, пожалуйста, указывайте источник: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 называется «Обмен знаниями об искусственном интеллекте».

在这里插入图片描述