Числа в Python
Python поддерживает комплексные (complex), целые числа (integer) и числа с плавающей точкой (float).
Целые числа и числа с плавающей точкой отличаются наличием или отсутствием десятичного разделителя. Например, 5 — целое число, а 5.0 — число с плавающей точкой.
Целые числа могут быть любой длины. Точность чисел с плавающей точкой обеспечивается только до 15 знака, на 16 могут возникать неточности.
Комплексные числа записываются следующим образом: x + yj . Здесь x — действительная часть, а y — мнимая.
Чтобы узнать, к какому типу относится переменная, используйте функцию type() . Если вы хотите узнать, принадлежит ли переменная определенному классу, используйте isinstance() .
a = 5 print(type(a)) print(type(5.0)) c = 5 + 3j print(c + 3) print(isinstance(c, complex))
Системы счисления
Числа, с которыми мы ежедневно сталкиваемся, представлены в десятичной системе счисления. Но программисты чащего всего работают с двоичной (основанием 2), шестнадцатеричной (основание 16) и восьмеричной (основание 8) системами счисления.
Эти числа в Python могут быть представлены с помощью соответствующего префикса. Они записаны в таблице ниже.
Система счисления
# выведет 107 print(0b1101011) # выведет 253, т. к. 251 + 2) = 253 print(0xFB + 0b10) # выведет 13 print(0o15)
Приведение типов
В Python один тип числа можно конвертировать в другой. Это называется приведением типов.
Операции вроде сложения или вычитания неявно, то есть автоматически, приводят целочисленный тип к числу с плавающей точкой, если один из операндов является числом с плавающей точкой.
Как видите, при сложении 1 (это целое число) приводится к 1.0 (это число с плавающей точкой). Результат тоже будет числом с плавающей точкой.
Чтобы выполнить явное преобразование, вы можете использовать встроенные функции int() , float() , complex() . С помощью них к численным типам можно приводить даже строки.
>>> int(2.3) 2 >>> int(-2.8) -2 >>> float(5) 5.0 >>> complex('3+5j') (3+5j)
При приведении числа с плавающей точкой к целому десятичная часть удаляется. Говорят, что она «обрезается».
Модуль decimal
Встроенный класс float порой может выдавать удивительные результаты. Все мы знаем, что 1.1 + 2.2 = 3.3, но Python, кажется, так не думает.
Введите в IDLE на своем компьютере такую строку:
Оказывается, что числа с плавающей точкой в памяти компьютера реализованы с помощью двоичных дробей — компьютер понимает только их (0 и 1). Именно поэтому большинство десятичных дробей невозможно со всей точностью хранить в памяти компьютера.
Приведем пример. Мы не можем представить дробь ⅓ в виде десятичного числа. ⅓ = 0.33333333… период — бесконечный. Поэтому хранить можно лишь приблизительное значение этого числа.
То есть десятичная дробь 0.1 — это бесконечная двоичная дробь 0.000110011001100110011… и компьютер может хранить в памяти только конечное число цифр после точки. Это лишь приближенное к 0.1 значение, но не равное ему. Следовательно, это аппаратные ограничения, а не ошибка Python.
Для решения этой проблемы мы можем использовать модуль decimal, встроенный в Python. Тип float имеет точность до 15 знаков, а decimal — настраиваемую пользователем.
import decimal print(0.1) print(decimal.Decimal(0.1))
0.1
0.1000000000000000055511151231257827021181583404541015625
Этот модуль полезен, когда нам нужно вычислять десятичные дроби так же, как в школе.
Положение точки тоже сохраняется. Мы знаем, что 25.50 кг точнее, чем 25.5 кг, так как у этой дроби два числа после точки.
from decimal import Decimal as D print(D('1.1') + D('2.2')) print(D('1.2') * D('2.50'))
Обратите внимание на нули в вышеприведенном примере.
Вы можете подумать: почему бы тогда не использовать модуль decimal вместо float постоянно? Справедливый вопрос.
Дело в эффективности. Операции с float происходят гораздо быстрее, чем с decimal.
Когда стоит использовать decimal вместо float?
- При создании приложения для работы с финансами. Здесь нужна точность.
- Когда нужно держать уровень точности на определенном уровне.
- Когда нужно реализовать дробь с определенным числом цифр после точки.
Модуль fractions
В Python есть модуль fractions, он производить операции с дробными числами.
У дробей есть числитель и знаменатель — это целые числа. Также этот модуль позволяет производить операции с рациональными числами.
Создать fraction-объект можно разными способами. Давайте их разберем:
import fractions print(fractions.Fraction(1.5)) print(fractions.Fraction(5)) print(fractions.Fraction(1,3))
При создании fraction-объекта из float могут возникнуть неожиданные результаты. Происходит это, как говорилось выше, из-за несовершенного двоичного представления чисел с плавающей точкой.
К счастью, fraction позволяет создать экземпляр из строки. Настоятельно рекомендуем использовать именно этот способ, когда аргументом является десятичное число.
import fractions # Число с плавающей точкой # Вывод: 2476979795053773/2251799813685248 print(fractions.Fraction(1.1)) # Строка # Вывод: 11/10 print(fractions.Fraction('1.1'))
2476979795053773/2251799813685248
11/10
Этот тип данных поддерживает все базовые математические операции.
from fractions import Fraction as F # со всеми работает print(F(1, 3) + F(1, 3)) print(1 / F(5, 6)) print(F(-3, 10) > 0) print(F(-3, 10) < 0)
Модуль math и random
Для решения тригонометрических, логарифмических, вероятностных и статистических задач Python располагает встроенными модулями math и random.
import math print(math.pi) print(math.cos(math.pi)) print(math.exp(10)) print(math.log10(1000)) print(math.sinh(1)) print(math.factorial(6))
3.141592653589793
-1.0
22026.465794806718
3.0
1.1752011936438014
720
import random print(random.randrange(10, 20)) x = ['а', 'б', 'в', 'г', 'д'] # Получаем случайный набор из х print(random.choice(x)) # Перемешиваем x random.shuffle(x) # Выводим в консоль перемешанный список x print(x) # Выводим в консоль случайный элемент print(random.random())
Примечание. Ваш вывод может отличать, поскольку функции модуля random выбирают элементы случайно.
13
а
['г', 'б', 'д', 'а', 'в']
0.038881285348306704