English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Python

Управление потоком в Python

Функции Python

Типы данных Python

Операции с файлами в Python

Объекты и классы в Python

Даты и время в Python

Продвинутые знания Python

Референтное руководство Python

Числа, типы преобразований и математика в Python

В этой статье вы узнаете о различных числах, используемых в Python, как преобразовать один тип данных в другой, а также о поддерживаемых Python математических операциях.

Типы данных чисел в Python

Python поддерживает целые числа, плавающие числа и комплексные числа. Они определены как int, float и complex в типах данных Python.

Целые и плавающие числа разделены или не разделены точкой с запятой. 5 является целым числом, а 5.0 — плавающей точкой.

Комpleksные числа пишутся в виде x + yj, гдеxЭто действительная часть,yЭто мнимая часть.

Мы можем использовать функцию type() для определения типа переменной или значения, и функцию isinstance() для проверки, принадлежит ли оно к определенному типу.

a = 5
# Вывод: <class 'int'>
print(type(a))
# Вывод: <class 'float'>
print(type(5.0))
# Вывод: (8+3j)
c = 5 + 3j
print(c + 3)
# Вывод: True
print(isinstance(c, complex))

Хотя целые числа могут быть любого размера, но плавающие числа могут быть точными только до 15 знаков после запятой (16-й знак不准确).

Мы обрабатываем числа каждый день в десятичной системе счисления (с основанием 10). Но программисты компьютеров (обычно嵌入式 программисты) должны использовать системы счисления двоичной (основание 2), шестнадцатеричной (основание 16) и восьмеричной (основание 8).

В Python мы можем указать эти числа, добавляя префикс перед ними. В таблице ниже приведены эти префиксы.

Префиксы системы счисления чисел в Python
Система счисленияПрефикс
Бинарная'0b' или '0B'
Октальная'0o' или '0O'
Шестнадцатеричная'0x' или '0X'

Здесь есть несколько примеров

# Вывод: 107
print(0b1101011)
# Вывод: 253 (251 + 2)
print(0xFB + 0b10)
# Вывод: 13
print(0o15)

При выполнении программы вывод будет следующим:

107
253
13

Преобразование данных

Мы можем преобразовать одно числовое значение в другое. Это также называется принудительным преобразованием.

Если одним из операндов является плавающая точка, то операции, такие как сложение, вычитание и т.д., будут принудительно выполнять явное (автоматическое) преобразование целого в плавающую точку.

>>> 1 + 2.0
3.0

Мы можем преобразовать одно числовое значение в другое. Это также называется принудительным преобразованием.

Мы также можем использовать内置енные функции int(), float() и complex() для явного преобразования типов. Эти функции могут даже преобразовывать изСтрокаПреобразование.

>>> int(2.3)
2
>>> int(-2.8)
-2
>>> float(5)
5.0
>>> complex('3+5j')
(3+5j)

При преобразовании из float в integer число будет отрезано (близкое к нулю целое).

Десятичные числа Python

Внутренний класс float Python выполняет некоторые вычисления, которые могут нас удивить. Мы все знаем, что 1.1 и 2.2 составляют 3.3, но Python似乎 не согласен.

>>> (1.1 + 2.2) == 3.3
False

Что же происходит?

Фактически, плавающая точка реализуется в компьютерной аппаратуре в виде двоичной дроби, так как компьютеры понимают только двоичное (0 и 1). Из-за этой причины большинство десятичных дробей, которые мы знаем, не могут быть точно храниться в наших компьютерах.

Давайте приведем пример. Мы не можем представить дробь 1/3 в виде десятичной дроби. Это даст 0.33333333 ... бесконечно длинное, и мы можем только приближать его.

Оригинальная десятичная дробь 0.1 приводит к бесконечно длинному двоичному числу 0.000110011001100110011 ...而我们计算机只存储了有限数量的 двоичных чисел.

Это будет приближаться к 0.1, но никогда не будет равным. Поэтому это ограниченность нашей компьютерной аппаратуры, а не ошибка в Python.

>>> 1.1 + 2.2
3.3000000000000003

Чтобы преодолеть эту проблему, мы можем использовать модуль десятичных чисел, который прилагается к Python. Точность плавающей точки может достигать 15 знаков после запятой, а модуль десятичных чисел имеет пользовательскую настройку точности.

import decimal
# Вывод: 0.1
print(0.1)
# Вывод: Decimal('0.1000000000000000055511151231257827021181583404541015625')
print(decimal.Decimal(0.1))

Когда мы хотим выполнять десятичные вычисления, как в школе, мы используем этот модуль.

Он также сохраняет значение. Мы знаем, что 25.50 кг точнее, чем 25.5 кг, потому что у него два знака после запятой, а не один.

from decimal import Decimal as D
# Вывод: Decimal('3.3')
print(D('1.1') + D('2.2'))
# Вывод: Decimal('3.000')
print(D('1.2') * D('2.50'))

Обратите внимание на trailing zeros в предыдущем примере.

Мы можем спросить, почему не использовать Decimal вместо float каждый раз? Основная причина - это эффективность. Выполнение операций с плавающей запятой должно быть быстрее, чем операции с десятичными.

Когда использовать Decimal вместо float?

В следующих случаях мы обычно используем десятичные.

  • Когда мы выполняем финансовые приложения, требующие точного десятичного представления

  • Когда мы хотим определить уровень точности

  • Когда мы хотим реализовать концепцию значащего числа

  • Когда мы хотим выполнять операции, как в школе

Дроби Python

Python предоставляет операции с десятичными дробями через модуль fractions.

Десятичные дроби имеют числитель и знаменатель, которые оба являются целыми числами. Этот модуль поддерживает алгоритмы рациональных чисел.

Мы можем создавать объекты Fraction несколькими способами.

import fractions
# Вывод: 3/2
print(fractions.Fraction(1.5))
# Вывод: 5
print(fractions.Fraction(5))
# Вывод: 1/3
print(fractions.Fraction(1,3))

При создании дробей из float мы можем получить некоторые необычные результаты. Это связано с несовершенной репрезентацией двоичных чисел с плавающей запятой, обсужденной в предыдущем разделе.

К счастью, десятичные дроби также позволяют использовать строковые примеры. Это предпочтительный вариант при использовании десятичных чисел.

import fractions
# В качестве числа с плавающей запятой
# Вывод: 2476979795053773/2251799813685248
print(fractions.Fraction(1.1))
# В качестве строки
# Вывод: 11/10
print(fractions.Fraction('1.1'))

Этот тип данных поддерживает все основные операции. Вот несколько примеров.

from fractions import Fraction as F
# Вывод: 2/3
print(F(1, 3) + F(1, 3))
# Вывод: 6/5
print(1 / F(5, 6))
# Вывод: False
print(F(-3, 10) > 0)
# Вывод: True
print(F(-3, 10) < 0)

Python математика

Python предоставляет аналогичные модули, такие как math и random, которые могут выполнять различные математические операции, такие как тригонометрические функции, логарифмы, вероятность и статистика и т.д.

import math
# Вывод: 3.141592653589793
print(math.pi)
# Вывод: -1.0
print(math.cos(math.pi))
# Вывод: 22026.465794806718
print(math.exp(10))
# Вывод: 3.0
print(math.log10(1000))
# Вывод: 1.1752011936438014
print(math.sinh(1))
# Вывод: 720
print(math.factorial(6))

ЭтоВ модуле math PythonПолный список функций и свойств, доступных.

import random
# Вывод: 16
print(random.randrange(10, 20))
x = ['a', 'b', 'c', 'd', 'e']
# Получить случайный элемент
print(random.choice(x))
# Перемешать порядок элементов в списке x
random.shuffle(x)
# Вывод измененного порядка x
print(x)
# Вывод случайного элемента
print(random.random())

Результат вывода (случайный результат):

19
c
['e', 'a', 'd', 'c', 'b']
0.707947055817621

ЭтоВ модуле random PythonПолный список функций и свойств, доступных.