Числа в Python
- Типы чисел в Python
- Целые числа
- Вещественные числа
- Комплексные числа
- Математические операции в Python
- Модуль math
- Модуль decimal
- Модуль fractions
- Краткие итоги параграфа
- Вопросы и задания для самоконтроля
Типы чисел в Python
Когда мы хотим представить информацию о количестве деревьев в саду, остатке на банковской карте или же провести какие-либо математические расчеты, мы используем числа. В Python числа представлены сразу несколькими родственными категориями типов. Сюда относятся целые (int), вещественные (float) и комплексные (complex) числа. Если возможностей базовых типов не хватает, всегда можно воспользоваться числовыми расширениями в виде модулей decimal или fractions. Все перечисленные числовые типы довольно легко преобразуются между собой, а математические операции с ними интуитивно понятны и производятся по общепринятым правилам математики.
Целые числа в Python
По умолчанию для записи литералов целых чисел в Python используется десятичная система счисления, однако разрешается записывать их в двоичной, восьмеричной и шестнадцатеричной системах счисления. При этом следует помнить, что вне зависимости от используемого формата представления, результат все равно будет отображаться в десятичном виде (см. пример №1).
# Присвоили целое положительное число.
int_1 = 5
# Выведет 5.
print(int_1)
# Присвоили целое отрицательное число в двоичной СС (-25 в 10-й СС).
int_2 = -0b11001
# Выведет -25.
print(int_2)
# Присвоили целое отрицательное число в 8-ной СС (-29 в 10-й СС).
int_3 = -0o35
# Выведет -29.
print(int_3)
# Присвоили целое положительное число в 16-ной СС (254 в 10-й СС).
int_4 = 0xFE
# Выведет 254.
print(int_4)
# Результат все равно отобразится в 10-й СС.
res = int_1 + int_2 + int_3 + int_4
# Выведет 205.
print(res)
5
-25
-29
254
205
Пример №1. Литералы целых чисел в Python.
Как видно из примера №1, синтаксис записи целых чисел в разрешенных системах счисления должен иметь следующий вид.
- В десятичной системе счисления целые числа записываются в виде привычной нам последовательности цифр от нуля до десяти, например, 0, -33, +127.
- В двоичной системе счисления запись целого числа должна начинаться с нуля и латинской буквы B в верхнем или нижнем регистре (т.е. 0b или 0B), после чего должна идти последовательность нулей и единиц. Например, 0b01101, 0B1011, -0b1001. Если будут использованы другие цифры, интерпретатор сгенерирует сообщение об ошибке.
- В восьмеричной системе счисления целое число должно начинаться с нуля и латинской буквы O в верхнем или нижнем регистре (т.е. 0o или 0O), после чего должна идти последовательность цифр от нуля до семи (01234567). Например, 0o77, 0O35, -0O174. Если будут использованы цифры не входящие в данный диапазон, интерпретатор сгенерирует сообщение об ошибке.
- В шестнадцатеричной системе счисления запись целого числа должна начинаться с нуля и латинской буквы X в верхнем или нижнем регистре (т.е. 0x или 0X), после чего должны идти символы последовательности 0123456789ABCDEF, представляющих данную систему счисления. При этом буквы также разрешается использовать в любом регистре. Например, 0x7F, 0XDD5A, -0xfF9. Если будут использованы символы не входящие в данный диапазон, интерпретатор сгенерирует сообщение об ошибке.
Кроме того, во всех случаях разрешается использовать перед числом знаки плюса (+) и минуса (-). Также можно переводить целые числа из одной системы счисления в другую. Для этого следует использовать следующие встроенные функции.
- bin(int_num) – преобразует целое число в двоичную систему счисления, возвращая строку с представлением литерала числа в этой системе.
- oct(int_num) – преобразует целое число в восьмеричную систему счисления, возвращая строку с представлением литерала числа в этой системе.
- hex(int_num) – преобразует целое число в шестнадцатеричную систему счисления, возвращая строку с представлением литерала числа в этой системе.
- int(obj) – конструктор типа int может использоваться как с одним, так и с двумя аргументами. Когда указан только один аргумент, функция пытается преобразовать объект в целое число в десятичной системе счисления, а в случае невозможности такого преобразования возбуждает соответствующее исключение. При этом, если объект obj является вещественным числом, оно преобразуется в целое путем усечения дробной части, например, int(21.302) вернет 21.
- int(num_str, base=10) – если указано два аргумента, то первый аргумент должен быть строковым представлением целого числа в системе счисления с указанным основанием base. Разрешается использовать системы счисления с основаниями от 2 до 36. При этом префикс 0b, 0o или 0x у строкового представления числа можно опускать. Если же точно известно, что в строковом представлении числа присутствует соответствующий префикс, второму аргументу разрешается передавать ноль, т.к. интерпретатор сможет определить систему счисления переводимого числа по указанному префиксу. В случае невозможности преобразования строки в целое число функция возбуждает соответствующее исключение (см. пример №2).
# Присвоили переменной целое положительное число.
int_dec = 45
# Преобразовали 45 в двоичную СС (строковое представление с префиксом).
int_bin_str = bin(int_dec)
# Выведет 0b101101.
print('45 в 2-ной СС:', int_bin_str)
# Преобразовали 45 в 8-ную СС (строковое представление с префиксом).
int_oct_str = oct(int_dec)
# Выведет 0o55.
print('45 в 8-ной СС:', int_oct_str)
# Преобразовали 45 в 16-ную СС (строковое представление) с префиксом.
int_hex_str = hex(int_dec)
# Выведет 0x2d.
print('45 в 16-ной СС:', int_hex_str)
# Преобразуем 0x2d обратно в 10-ю СС (числовое представление).
int_dec = int(int_hex_str, base=16)
# Выведет 45.
print('0x2d в 10-ной СС:', int_dec)
# Т.к. литерал 0x2d содержит префикс, то можно и так.
int_dec = int(int_hex_str, base=0)
# Опять же выведет 45.
print('0x2d в 10-ной СС:', int_dec)
45 в 2-ной СС: 0b101101
45 в 8-ной СС: 0o55
45 в 16-ной СС: 0x2d
0x2d в 2-ной СС: 0b101101
0x2d в 10-ной СС: 45
0x2d в 10-ной СС: 45
Пример №2. Перевод целых чисел между СС.
Итак, функции bin(int_num), oct(int_num) и hex(int_num) принимают целые числа и возвращают строковые представления этих чисел в соответствующих системах счисления. Если же требуется обратное преобразование в десятичную систему, то следует передавать числа функции int(num) или, для их строковых представлений, функции int(num_str, base=10), предварительно указав основание системы счисления base переводимого числа.
Подробнее о переводе чисел из одной системы счисления в другую можно почитать на нашей страничке здесь. Там же представлен калькулятор для перевода чисел из одной системы счисления в другую, а также ряд задач на закрепление теории.
Далее. Целые числа в Питоне отличаются тем, что их размер в принципе ограничивается лишь доступной памятью. Т.е. они поддерживают длинную арифметику и могут быть сколь угодно большими (см. пример №3). При этом следует помнить, что при обработке очень больших чисел приходится жертвовать скоростью их обработки.
# Возводим число в степень 99.
num = 257849**99
# Выведем результат на экран.
print(num, end='\n\n')
# Узнаем длину числа (сначала преобразовав к строке).
digits = len(str(num))
# Выведем количество разрядов числа на экран.
print('Количество разрядов в числе:', digits)
53110414805516436628782613106463688464079613392
90447528079607511823736565350014611025443154896
27726813291692085262103437221067464647506417416
07778199506769145842776821168682784291830600062
86303063083619862322533843849251477935592078479
30305203144960374852804267532735290335532384187
05881391054962063739410884715991946981994179461
21320508944648974559217660898526107319208466368
91703990849387344330955755287354442030313290102
11894758515138083425792270523021017010636394801
14389695020775150902061702144736277123301356708
2485335161339404649
Количество разрядов в числе: 536
Пример №3. Пример очень большого целого числа.
Также следует отметить, что в отличие от других типов чисел над целыми числами в Python можно производить битовые операции, перечень которых представлен для ознакомления в порядке возрастания их приоритета в таблице №4. Подробнее данный вопрос мы рассмотрим позже, когда будем рассматривать битовые операции.
Операция | Описание |
---|---|
x | y | Битовое or (ИЛИ). Отрицательные числа представляются как двоичное дополнение. |
x ^ y | Битовое xor (исключающее ИЛИ). |
x & y | Битовое and (И). |
x << n | Побитовый сдвиг влево (сдвигает значение x влево на n битов аналогично операции x*(2* *n) без проверки на переполнение). |
x >> y | Побитовый сдвиг вправо (сдвигает значение x вправо на n битов аналогично операции x//(2**n) без проверки на переполнение ). |
~x | Инверсия битов числа. |
Таблица №4. Список битовых операций, применимых к целым числам.
Также у типа int имеется несколько дополнительных методов:
- int.bit_length() – метод возвращает количество бит, которое необходимо для представления числа в памяти в двоичном виде, без учета знака и незначащих (лидирующих) нулей;
- int.to_bytes(length, byteorder, *, signed=False) – метод возвращает массив байтов, который соответствует данному числу;
- int.from_bytes(bytes, byteorder, *, signed=False) – метод класса, который возвращает целое число, соответствующее указанному массиву байтов.
Как видим, все дополнительные методы тоже касаются битов и байтов, поэтому мы их сейчас рассматривать не будем.
Вещественные числа в Python
Что касается записи литералов вещественных чисел (по-другому чисел с плавающей точкой), то в Python для них используется привычный нам математический синтаксис: сперва записывается знак числа (плюс можно не указывать), затем последовательность цифр целой части, разделительная точка и последовательность цифр дробной части. Например, 0.33, .33, 0.0, .0, -123.45, -.123. Также допустима запись вещественных чисел в экспоненциальной форме. При этом для представления степени 10n используется латинская буква E в верхнем или нижнем регистре (т.е. e или E), следующий за ней необязательный знак плюс или обязательный знак минус, а также сам показатель степени в виде положительного целого числа или нуля (см. пример №5).
# Положительное вещественное число.
float_num_1 = 123.45
# Выведет 123.45.
print(float_num_1)
# Отрицательное вещественное число.
float_num_2 = -123.45
# Выведет -123.45.
print(float_num_2)
# Тоже самое, что и -0.45, т.к.
# ноль разрешается опускать.
float_num_3 = -.45
# Выведет -0.45.
print(float_num_3)
# Тоже самое, что и 123.45.
float_num_4 = 1.2345e2
# Выведет 123.45.
print(float_num_4)
# Тоже самое, что и 0.0012345.
float_num_5 = 1.2345E-3
# Выведет 0.0012345.
print(float_num_5)
123.45
-123.45
-0.45
123.45
0.0012345
Пример №5. Литералы вещественных чисел в Python.
В отличие от целых чисел вещественные не поддерживают длинную арифметику. В обычных условиях их точность ограничивается максимум 17 значащими цифрами. Поэтому для очень маленьких и очень больших вещественных чисел получаются весьма неточные результаты (см. пример №6). Если же в расчетах необходима высокая точность представления вещественных чисел, следует использовать, например, модуль decimal, позволяющий задавать требуемую точность результата (опять же, за счет снижения скорости обработки таких чисел).
# Импортируем модуль чисел с фиксированной точностью.
import decimal
# Возведем вещественное число в 15 степень.
# Результат будет грубо округлен до 17 значащих цифр.
res = 52.93**15
# Выведет 7.170152784187784e+25.
print(res)
# Проблема решается при помощи модуля decimal.
res = decimal.Decimal('52.93')**15
# Выведет 71701527841877847666492396.31.
print(res)
# Тоже самое касается и очень маленьких чисел.
res = 0.0002777775793/993
# Выведет 2.7973572940584086e-07.
print(res)
# Установим точность в 35 значащих цифр.
decimal.getcontext().prec = 35
# Разделим при помощи модуля decimal.
res = decimal.Decimal('0.0002777775793')/993
# Выведет 2.7973572940584088620342396777442095E-7.
print(res)
7.170152784187784e+25
71701527841877847666492396.31
2.7973572940584086e-07
2.7973572940584088620342396777442095E-7
Пример №6. Точность представления вещественных чисел в Python.
Неточное представление вещественных чисел в Python, впрочем как и в других языках программирования, может иногда приводить к неожиданным результатам (см. пример №7). Это связано с тем, что мы в основном привыкли вести расчеты в десятичной системе счисления, а компьютер перед вычислениями преобразует все числа в двоичную систему. Но не все вещественные числа могут быть точно преобразованы из десятичной системы счисления в двоичную, что и приводит к некоторой потере точности при хранении десятичных чисел в памяти компьютера.
# Сравним сумму 0.1 + 0.7 с числом 0.8.
res = 0.1 + 0.7
# Если результат больше 0.8.
if res > 0.8:
print('0.1 + 0.7 > 0.8')
# Если результат меньше 0.8.
elif res < 0.8:
print('0.1 + 0.7 < 0.8')
# Если результат равен 0.8.
else:
print('0.1 + 0.7 = 0.8')
0.1 + 0.7 < 0.8
Пример №7. Побочные эффекты сложения вещественных чисел в Python.
Как видим, на первый взгляд результат действительно получился неожиданным (не забываем про кнопку «Результат»). Однако все верно. Ведь в данном случае при переводе десятичных чисел в двоичную систему компьютер не смог перевести их точно, округлив результат так, чтобы получившееся двоичное число поместилось в пределах выделяемого для хранения вещественного числа объема памяти. В результате у нас получилось число несколько меньшее, чем 0.8. Но, повторимся, это не проблема Python, это проблема математики и невозможности во всех случаях осуществить точный перевод чисел из одной системы счисления в другую.
Не стоит сравнивать вещественные числа, доверяя их точности до последнего знака.
В заключение данного пункта перечислим дополнительные методы типа float.
- float.as_integer_ratio() – метод возвращает кортеж из пары целых чисел, которые представляют собой числитель и знаменатель наименьшей дроби, равной данному вещественному числу. Если вещественное число отрицательное, то первое число в возвращаемом кортеже будет со знаком минус. При этом второе число всегда положительное (см. пример №8).
- float.is_integer() – метод возвращает True, если дробная часть вещественного числа равна нулю.
- float.hex() – метод возвращает строковое представление числа с плавающей точкой в шестнадцатеричной системе счисления. При этом следует иметь в виду, что экспонента в таком представлении обозначается буквой p, т.к. буква e представляет собой допустимый символ в 16-ной системе счисления.
- float.fromhex(float_num_str) – этот метод класса осуществляет преобразование строкового представления вещественного числа float_num_str в шестнадцатеричной системе счисления обратно в вещественное число в десятичной системе счисления.
# Получим соответствующий кортеж.
fract = float.as_integer_ratio(15.63)
# Выведет (8798907771975107, 562949953421312).
print('Числ. и знамен. дроби для 15.63:', fract, end='\n\n')
# Проверим, равна ли нулю дробная часть.
is_int = float.is_integer(15.63)
# Выведет 2-й вариант.
if is_int == True:
print('Дробная часть равна нулю.', end='\n\n')
else:
print('Дробная часть не равна нулю.', end='\n\n')
# Переведем наше число в 16-ю систему счисления.
float_hex = (15.63).hex()
# Выведет 0x1.f428f5c28f5c3p+3.
print('15.63 в 16-й СС:', float_hex)
# Можно и так.
float_hex = float.hex(15.63)
# Выведет тот же результат.
print('15.63 в 16-й СС:', float_hex, end='\n\n')
# Переведем обратно в 10-ю СС (получим числовое представление).
float_dec = float.fromhex(float_hex)
# Выведет 15.63.
print('0x1.f428f5c28f5c3p+3 в 10-й СС:', float_dec)
Числ. и знамен. дроби для 15.63: (8798907771975107, 562949953421312)
Дробная часть не равна нулю.
15.63 в 16-й СС: 0x1.f428f5c28f5c3p+3
15.63 в 16-й СС: 0x1.f428f5c28f5c3p+3
0x1.f428f5c28f5c3p+3 в 10-й СС: 15.63
Пример №8. Дополнительные методы типа float.
Комплексные числа в Python
Комплексные числа в Python представлены типом complex, который хранит два вещественных числа: первое представляет собой действительную часть комплексного числа, а второе – мнимую. Как и принято в математике, действительная и мнимая части литерала комплексного числа объединяются знаком плюс или минус (см. пример №9). Однако за мнимой частью в Python следует символ j, как это принято в инженерии (в математике мнимая единица обозначается через i).
# Присвоим переменной комплексное число.
compl_1 = 2.4+3j
print('Комплексное число', compl_1)
# Атрибут real представляет действительную часть, т.е. 2.4.
print('Действительная часть числа 2.4+3j:', compl_1.real)
# Атрибут imag представляет мнимую часть числа, т.е. 3.0.
print('Мнимая часть числа 2.4+3j:', compl_1.imag)
# Изменим знак мнимой части числа.
compl_2 = compl_1.conjugate()
# Выведем полученное сопряженное комплексное число, т.е. 2.4-3j.
print('Сопряженное к 2.4+3j - это', compl_2)
# Комплексное число с нулевой действительной частью.
compl_3 = 0-4.7j
# Нулевую действительную часть можно опускать.
compl_4 = -4.7j
# Сравним их (получим равенство).
if compl_3 == compl_4:
print('0-4.7j = -4.7j')
Комплексное число (2.4+3j)
Действительная часть числа 2.4+3j: 2.4
Мнимая часть числа 2.4+3j: 3.0
Сопряженное к 2.4+3j - это (2.4-3j)
0-4.7j = -4.7j
Пример №9. Литералы комплексных чисел в Python.
Как видно из примера, если действительная часть комплексного числа равна 0, ее можно опустить. Кроме того, отдельные части комплексного числа доступны в виде атрибутов real и imag, а получить сопряженное данному комплексное число можно изменив знак мнимой части при помощи метода complex.conjugate().
Вполне возможно, что сталкиваться с комплексными числами вам придется довольно редко, однако иметь представление о наличии такого типа все-таки не помешает.
Математические операции в Python
Все известные нам со школы математические операции полностью поддерживаются в Python. Перечислим их и рассмотрим примеры.
- x + y – сложение двух чисел.
- x - y – вычитание двух чисел.
- x * y – умножение двух чисел.
- x / y – деление двух чисел. При делении вещественных и целых чисел (даже без остатка) результат всегда является вещественным числом. Если же в делении присутствуют комплексные числа, интерпретатор возвращает комплексный результат (см. пример №10).
- x // y – деление с округлением вниз. Например, 1//2 = 0, -1//2 = -1, 1//-2 = -1, -1//-2 = 0.
- x % y – операция возвращает остаток от деления целых и вещественных чисел. Если оба числа целые, то возвращается целочисленный остаток (тип int). Например, 5%3 = 2, -5%3 = 1 (т.к. -5 = 3*(-2) + 1), 6%3 = 0. Если хотя бы одно число вещественное, остаток от деления также возвращается в вещественном виде (тип float), при чем из-за неточности представления вещественных чисел результат может оказаться неточным. Например, 5.2%3 = 2.2 (все в порядке), -5.2%3 = 0.7999999999999998 (получили неточный результат, хотя ожидали 0.8, т.к. -5.2 = 3*(-2) + 0.8). Что касается комплексных чисел, то для них операция неприменима.
- +x – операция используется в основном для повышения удобочитаемости кода, т.к. по факту она ничего не делает.
- -x – инверсия знака числа отличного от нуля, т.е. изменение плюса на минус или наоборот. Для нуля ничего не происходит.
- x ** y – возведение в степень. Отметим, что 0**0 = 1.
# Сложение вещественных чисел.
res_1 = 3.46 + 1.22
# Получим 4.68.
print('3.46 + 1.22 =', res_1, end='\n\n')
# Вычитание комплексных чисел.
res_2 = 2.7+2.1j - 1.3+3.5j
# Получим 1.4+5.6j.
print('2.7+2.1j - 1.3+3.5j =', res_2, end='\n\n')
# Деление вещественных чисел.
res_3 = 3.4/1.7
# Получим 2.0.
print('3.4/1.7 =', res_3, end='\n\n')
# Деление целых чисел.
res_4 = 12/3
# Получим вещественный результат 4.0.
print('12/3 =', res_4, end='\n\n')
# Возведение в степень.
res_5 = 0.5**3
# Получим 0.125.
print('0.5**3 =', res_5, end='\n\n')
3.46 + 1.22 = 4.68
2.7+2.1j - 1.3+3.5j = (1.4000000000000001+5.6j)
3.4/1.7 = 2.0
12/3 = 4.0
0.5**3 = 0.125
Пример №10. Базовые математические операции в Python.
Что касается математических выражений, в которых используются сразу несколько операций, то для их группировки предназначены круглые скобки (см. пример №11). При этом внутри скобок приоритет отдается сперва возведению в степень (x**y), затем равносильно умножению (x*y), делению (x/y), делению с округлением вниз (x//y) и получению остатка от деления (x%y); в конце равнозначно выполняются сложение (x + y) и вычитание (x - y). Более подробно о приоритете операторов в Python (и не только математических) мы поговорим позже.
Если в выражении встречаются подряд идущие операторы с одинаковым приоритетом, то по умолчанию интерпретатор обрабатывает их слева направо. Однако, во избежание ошибок, старайтесь всегда использовать скобки, непосредственно определяя порядок группировки и не полагаясь на приоритет или ассоциативность операторов.
# Используем для суммы круглые скобки.
res_1 = (3.46 + 1.22)*3 - 0.4
# Получим 13.639999999999999.
print('(3.46 + 1.22)*3 + 0.4 =', res_1, end='\n\n')
# Используем вложенные скобки.
res_2 = ((5/3.2 + 8*2)*3 - 0.4)/(4 - 2**3)
# Получим -13.071875.
print('((5/3.2 + 8*2)*3 - 0.4)/(4 - 2**3) =', res_2)
(3.46 + 1.22)*3 + 0.4 = 13.639999999999999
((5/3.2 + 8*2)*3 - 0.4)/(4 - 2**3) = -13.071875
Пример №11. Математические выражения в Python.
Обратите внимание, что при наличии в одном выражении целых и вещественных чисел, интерпретатор при необходимости осуществляет приведение целых чисел к типу float, т.е. к более объемлющему типу (в математике целые числа являются подмножеством вещественных, а те в свою очередь принадлежат множеству комплексных чисел).
В дополнение к математическим операторам Python предоставляет и ряд полезных встроенных функций, позволяющих, например, найти модуль числа или округлить его (см. пример №12). Опять же, перечислим их и приведем краткое описание.
- divmod(x, y) – возвращает кортеж (x//y, x%y). При этом для комплексных чисел она не предназначена.
- pow(x, y) – возвращает x в степени y (аналог x ** y).
- abs(x) – возвращает абсолютное значение (модуль) числа x.
- round(x, n) – округляет число до n-го разряда после запятой. Если аргумент n не указан, то число округляется до ближайшего целого.
- max(num_1, num_2, ..., num_n) – возвращает максимальное из двух и более чисел.
- min(num_1, num_2, ..., num_n) – возвращает минимальное из двух и более чисел.
- sum(num_1, num_2, ..., num_n) – возвращает сумму двух и более чисел.
- int(x) – приведение числа к типу int.
- float(x) – приведение числа к типу float.
- complex(re, im=0) – приведение к типу complex. Аргумент im (мнимая часть будущего комплексного числа) можно не передавать, тогда он по умолчанию будет равен нулю.
# Возведение в степень.
res_1 = pow(16, 0.5)
# Получим 4.0.
print('pow(16, 0.5) ->', res_1, end='\n\n')
# Найдем модуль числа.
res_2 = abs(-0.33)
# Получим 0.33.
print('abs(-0.33) ->', res_2, end='\n\n')
# Получим кортеж частного и остатка.
res_3 = divmod(45, 7)
# Выведет кортеж (6, 3).
print('divmod(45, 7) ->', res_3, end='\n\n')
# Найдем максимальное из трех чисел.
res_4 = max(45, 7.5, 23.8)
# Получим 45.
print('max(45, 7.5, 23.8) ->', res_4, end='\n\n')
# Найдем минимальное среди этих чисел.
res_5 = min(45, 7.5, 23.8)
# Получим 7.5.
print('min(45, 7.5, 23.8) ->', res_5, end='\n\n')
# Округлим число до трех знаков после запятой.
res_6 = round(45.532917, 3)
# Получим 45.533.
print('round(45.532917, 3) ->', res_6, end='\n\n')
# Используем встроенные функции в выражении.
res_7 = abs(pow(-2, 3) + round(27.321, 1))
# Получим 19.3.
print('abs(pow(-2, 3) + round(27.321, 1)) = ', res_7)
pow(16, 0.5) -> 4.0
abs(-0.33) -> 0.33
divmod(45, 7) -> (6, 3)
max(45, 7.5, 23.8) -> 45
min(45, 7.5, 23.8) -> 7.5
round(45.532917, 3) -> 45.533
abs(pow(-2, 3) + round(27.321, 1)) = 19.3
Пример №12. Встроенные математические функции в Python.
Конечно же данный перечень встроенных функций довольно мал, но не стоит забывать про математические расширения и даже целые библиотеки, которые вполне смогут удовлетворить даже самых привередливых математиков. В частности, в следующем пункте мы познакомимся с модулем math стандартной библиотеки Python. Но сперва давайте закончим рассмотрение оставшейся части операторов, использующихся с числами.
Как вы наверняка помните, помимо основных операций вроде сложения и умножения, использующихся в обычных выражениях или уравнениях, в математике широко используются и операции сравнения чисел (например, в неравенствах). Перечислим их.
- x < y – выражение вернет True, если x строго меньше y.
- x > y – выражение вернет True, если x строго больше y.
- x <= y – выражение вернет True, если x меньше или равно y.
- x >= y – выражение вернет True, если x больше или равно y.
- x == y – выражение вернет True, если x равно y (в программировании один знак равно означает присвоить, поэтому для обозначения равенства используются два знака равно).
- x != y – выражение вернет True, если x не равно y.
Использование операторов сравнения показано в примере №13.
# Проверим равенство чисел.
if 5 == 5.0:
print('5 равно 5.0', end='\n\n')
else:
print('5 не равно 5.0', end='\n\n')
# Проверим какой из результатов больше.
if 5**7 > 4**8:
print('5**7 > 4**8', end='\n\n')
elif 5**7 < 4**8:
print('5**7 < 4**8', end='\n\n')
else:
print('5**7 равно 4**8', end='\n\n')
5 равно 5.0
5**7 > 4**8
Пример №13. Операторы сравнения чисел в Python.
В дополнение к базовому оператору присваивания = в Python применяется целый ряд комбинированных операторов присваивания, которые объединяют операцию присваивания с другой операцией. В общем случае выражение присваивания с комбинированным оператором x op= y можно считать сокращенной записью выражения x = x op y, где вместо op следует подставлять один из арифметических операторов. Например, x += y является сокращенной записью выражения x = x + y, в котором к значению переменной x прибавляется значение переменной y, после чего результат присваивается переменной x. Использование некоторых комбинированных операторов присваивания показано в примере №14.
# Присвоили начальное значение.
a = 3
print('Начальное значение:', a, end='\n\n')
# Равнозначно a = a + 6.
a += 6
# Теперь a == 9.
print('a += 6 <=> a = a + 6 -> a ==', a, end='\n\n')
# Равнозначно a = a*2.
a *= 2
# Теперь a == 18.
print('a *= 2 <=> a = a*2 -> a ==', a, end='\n\n')
# Равнозначно a = a/2.
a /= 2
a = int(a)
# Теперь a == 9.
print('a /= 2 <=> a = a/2 -> a ==', a, end='\n\n')
# Равнозначно a = a**2.
a **= 2
# Теперь a == 81.
print('a **= 2 <=> a = a**2 -> a ==', a, end='\n\n')
# Равнозначно a = a%2.
a %= 2
# Теперь a == 1.
print('a %= 2 <=> a = a%2 -> a ==', a, end='\n\n')
# Равнозначно a = a//2.
a //= 2
# Теперь a == 0.
print('a //= 2 <=> a = a//2 -> a ==', a, end='\n\n')
Начальное значение: 3
a += 6 <=> a = a + 6 -> a == 9
a *= 2 <=> a = a*2 -> a == 18
a /= 2 <=> a = a/2 -> a == 9
a **= 2 <=> a = a**2 -> a == 81
a %= 2 <=> a = a%2 -> a == 1
a //= 2 <=> a = a//2 -> a == 0
Пример №14. Комбинированные операторы присваивания в Python.
Конечно же мы перечислили не все комбинированные операторы присваивания, имеющиеся в Python. Весь перечень будет представлен в таблице в следующей главе, посвященной выражениям и операторам. Сейчас же мы рассмотрим ряд математических функций модуля math, поставляющегося в комплекте стандартной библиотеки Python.
Модуль math в Python
Модуль math обеспечивает доступ к широкому кругу математических функций и констант, которые определены стандартом языка C. При этом модуль не поддерживает операции с комплексными числами, хотя они и определены стандартом языка Python. Но это не является большой проблемой, т.к. для операций с ними нужно просто воспользоваться модулем сmath, в котором легко найти требуемые функции, но уже с поддержкой комплексных чисел. Также стоит помнить, что, если явно не указано иное, все возвращаемые функциями модуля значения являются числами с плавающей точкой.
Для начала давайте рассмотрим представленные в модуле math математические константы и функции проверки чисел на принадлежность к ним.
- math.pi – представляет значение числа π с точностью, которая зависит от конкретной платформы. Мы его помним, как число 3.14.
- math.tau (чит. тау) – представляет удвоенное значение числа π с точностью, которая зависит от конкретной платформы. Т. о. τ – это отношение радиуса окружности к ее длине. Приблизительно оно равно 6.28.
- math.e – представляет значение числа e с точностью, которая зависит от конкретной платформы. Мы его помним, как число 2.72.
- math.inf (от англ. infinity) – представляет положительную бесконечность. Отметим, что значение является типом float и может быть получено вызовом конструктора float('inf'). Для получения отрицательной бесконечности следует использовать унарный оператор - (см. пример №15). К значению inf в математике приводит, например, операция деления на 0.
- math.nan (от англ. not a number) – представляет значение не число, которое также является типом float и может быть получено вызовом конструктора float('nan'). К значению nan приводят недопустимые математические операции (например, извлечение корня четной степени из отрицательного числа на множестве вещественных чисел) или выход за допустимый диапазон значений для данной математической функции.
- math.isinf(x) – возвращает True, если x является отрицательной или положительной бесконечностью, или False в противном случае.
- math.isnan(x) – возвращает True, если x является значением nan, или False в противном случае.
- math.isfinite(x) – возвращает False, только если x является nan, inf или -inf. Во всех остальных случаях функция возвращает True.
# Не забываем импортировать модуль.
import math
# Выведем число pi.
print('Число pi =', math.pi, end='\n\n')
# Выведем число тау.
print('Число tau =', math.tau, end='\n\n')
# Выведем число e.
print('Число e =', math.e, end='\n\n')
# Выведем inf.
print('Положит. бесконечность - это:', math.inf, end='\n\n')
# Можно и через float('inf').
print('Положит. бесконечность - это:', float('inf'), end='\n\n')
# Выведем nan.
print('Не число - это', math.nan, end='\n\n')
# Можно и через float('nan').
print('Не число - это', float('nan'), end='\n\n')
# Получим бесконечность?
if math.isinf(math.inf/100) == True:
print('math.inf/100 =', math.inf, end='\n\n')
# Разделим, а затем проверим результат.
num = 1/345000
# Получим число или бесконечность?
if math.isfinite(num) == True:
print('1/345000 =', num)
else:
print('Получили бесконечность.')
Число pi = 3.141592653589793
Число tau = 6.283185307179586
Число e = 2.718281828459045
Положит. бесконечность - это: inf
Положит. бесконечность - это: inf
Не число - это nan
Не число - это nan
math.inf/100 = inf
1/345000 = 2.898550724637681e-06
Пример №15. Математические константы модуля math.
Что касается конкретно функций модуля math, то в нем представлены различные функции теории чисел, степенные, логарифмические, тригонометрические, гиперболические и ряд других функций. Все мы их здесь рассматривать не будем, однако краткое описание некоторых из них приведем в списке ниже. Остальные в случае необходимости всегда можно с легкостью найти в разделе «Numeric and Mathematical Modules» справочника стандартной библиотеки в описании модуля math (или cmath для комплексных чисел). Итак.
- math.ceil(x) – возвращает x, округленное вверх до ближайшего целого (см. пример №16).
- math.floor(x) – возвращает x, округленное вниз до ближайшего целого.
- math.trunc(x) – возвращает целую часть x, полностью отсекая дробную.
# Не забываем импортировать модуль.
import math
# В обоих случаях получим 2.
print('math.ceil(1.03) ->', math.ceil(1.03))
print('math.ceil(1.93) ->', math.ceil(1.93), end='\n\n')
# В обоих случаях получим -1.
print('math.ceil(-1.03) ->', math.ceil(-1.03))
print('math.ceil(-1.93) ->', math.ceil(-1.93), end='\n\n')
# В обоих случаях получим 1.
print('math.floor(1.03) ->', math.floor(1.03))
print('math.floor(1.93) ->', math.floor(1.93), end='\n\n')
# В обоих случаях получим -2.
print('math.floor(-1.03) ->', math.floor(-1.03))
print('math.floor(-1.93) ->', math.floor(-1.93), end='\n\n')
# Получим 1.
print('math.trunc(1.03) ->', math.trunc(1.03))
# Получим -1.
print('math.trunc(-1.03) ->', math.trunc(-1.03), end='\n\n')
math.ceil(1.03) -> 2
math.ceil(1.93) -> 2
math.ceil(-1.03) -> -1
math.ceil(-1.93) -> -1
math.floor(1.03) -> 1
math.floor(1.93) -> 1
math.floor(-1.03) -> -2
math.floor(-1.93) -> -2
math.trunc(1.03) -> 1
math.trunc(-1.03) -> -1
Пример №16. Функции модуля math (часть 1).
- math.factorial(x) – возвращает факториал неотрицательного целого числа x. Отметим, что факториалы чисел 0 и 1 принимаются равными 1.
- math.sqrt(x) – возвращает квадратный корень из неотрицательного числа x (см. пример №17).
- math.log(x[, base]) – возвращает логарифм числа x по основанию base. Аргумент base можно опустить, тогда функция вернет натуральный логарифм числа x.
# Не забываем импортировать модуль.
import math
# Получим 5040.
print('math.factorial(7) ->', math.factorial(7), end='\n\n')
# Получим 7.0.
print('math.sqrt(49) ->', math.sqrt(49), end='\n\n')
# Возьмем логарифм числа 16 по основанию 2 (получим 4.0).
print('math.log(16, 2) ->', math.log(16, 2))
# Возьмем натуральный логарифм числа 16 (т.е. по основанию e).
# Получим 2.772588722239781.
print('math.log(16) ->', math.log(16), end='\n\n')
math.factorial(7) -> 5040
math.sqrt(49) -> 7.0
math.log(16, 2) -> 4.0
math.log(16) -> 2.772588722239781
Пример №17. Функции модуля math (часть 2).
- math.sin(x) – возвращает синус угла x, значение которого задано в радианах. Отметим, что для косинуса угла функция имеет вид math.cos(x) (см. пример №18).
- math.tan(x) – возвращает тангенс угла x, значение которого задано в радианах.
- math.asin(x) – возвращает арксинус числа x. Для аркосинуса нужно использовать функцию math.acos(x), а для арктангенса – math.atan(x).
- math.degrees(x) – преобразует угол x из радиан в градусы.
- math.radians(x) – преобразует угол x из градусов в радианы.
# Не забываем импортировать модуль.
import math
# Вспомним синусы углов.
# Получим 1.0.
print('math.sin(math.pi/2) ->', math.sin(math.pi/2))
# Получим 0.0.
print('math.sin(0) ->', math.sin(0), end='\n\n')
# Найдем значения косинусов углов.
# Получим 6.123233995736766e-17.
print('math.cos(math.pi/2) ->', math.cos(math.pi/2))
# Получим 1.0.
print('math.cos(0) ->', math.cos(0), end='\n\n')
# Найдем значения тангенсов углов.
# Получим 1.633123935319537e+16.
print('math.tan(math.pi/2) ->', math.tan(math.pi/2))
# Получим 0.0.
print('math.tan(0) ->', math.tan(0), end='\n\n')
# Найдем арксинус и аркосинус числа.
# Получим 0.5235987755982989.
print('math.asin(0.5) ->', math.asin(0.5))
# Получим 1.0471975511965979.
print('math.acos(0.5) ->', math.acos(0.5), end='\n\n')
'''
Как видим, при значениях углов, в которых функции должны
принимать ±inf, интерпретатор выдает либо очень большие,
либо очень маленькие значения типа float, но не бесконечности.
'''
# Перевод из радиан в градусы и обратно.
# Получим 90.0.
print('math.degrees(math.pi/2) ->', math.degrees(math.pi/2))
# Получим 1.5707963267948966.
print('math.radians(90) ->', math.radians(90), end='\n\n')
math.sin(math.pi/2) -> 1.0
math.sin(0) -> 0.0
math.cos(math.pi/2) -> 6.123233995736766e-17
math.cos(0) -> 1.0
math.tan(math.pi/2) -> 1.633123935319537e+16
math.tan(0) -> 0.0
math.asin(0.5) -> 0.5235987755982989
math.acos(0.5) -> 1.0471975511965979
math.degrees(math.pi/2) -> 90.0
math.radians(90) -> 1.5707963267948966
Пример №18. Функции модуля math (часть 3).
Обязательно откройте модуль math в справочнике стандартной библиотеки и хотя бы бегло просмотрите весь список доступных функций. Кстати, не забываем, что получить его можно и программно через dir(math).
Модуль decimal в Python
Как мы уже знаем, числа типа float имеют весьма ограниченную точность. И хотя во многих случаях это не существенно, бывают ситуации, когда требуется повышенная точность вычислений, пусть даже и в ущерб производительности. В таких случаях нам на помощь приходит модуль decimal, который реализует неизменяемый числовой тип Decimal, представляющий числа с фиксированной точностью (см. пример №19).
# Импортируем числа типа Decimal.
from decimal import Decimal
# Вычисляем выражение с числами типа Decimal.
res = Decimal('0.1')*Decimal('5') - Decimal(str(1.33))
# Выведет -0.83.
print(res)
-0.83
Пример №19. Создание чисел фиксированной точности.
Как видим, для создания числа фиксированной точности Decimal необходимо передать конструктору Decimal строку с представлением требуемого числа или использовать функцию str для приведения числа к строке. Если в выражении используются числа с различной точностью представления, то для результата интерпретатор выберет наилучшую точность представления.
В принципе, конструктору Decimal можно передавать не только строковые представления чисел, но и сами целые и вещественные числа, а также их кортежи. Однако преобразование вещественных чисел в числа фиксированной точности иногда может порождать большое число десятичных знаков.
Числа типа Decimal обычно используются в определенном контексте, который подразумевает использование установленной точности представления, методики округления (вверх, вниз и т.д.) и некоторых других настроек (см. пример №20).
# Импортируем модуль decimal.
import decimal
# Разделим числа типа Decimal.
res_1 = decimal.Decimal(1)/decimal.Decimal(52)
# Выведет 0.01923076923076923076923076923.
print(res_1)
# Сохраним текущую глобальную точность в переменной.
p = decimal.getcontext().prec
# Установим глобальную точность в 5 значащих цифр.
decimal.getcontext().prec = 5
# Разделим числа повторно.
res_2 = decimal.Decimal(1)/decimal.Decimal(52)
# Выведет округленный результат 0.019231.
print(res_2)
# Восстановим исходную глобальную точность.
decimal.getcontext().prec = p
# Повторяем деление.
res_3 = decimal.Decimal(1)/decimal.Decimal(52)
# Выведет 0.01923076923076923076923076923.
print(res_3)
0.01923076923076923076923076923
0.019231
0.01923076923076923076923076923
Пример №20. Изменение точности представления чисел Decimal.
Все настройки среды для арифметических операций получаемые при помощи метода decimal.getcontext() доступны для изменения. Кроме того, для установки нового контекста можно использовать метод decimal.setcontext(). С этим и некоторыми другими методами для работы с контекстами вы можете ознакомиться в модуле decimal стандартной библиотеки (см. раздел «Numeric and Mathematical Modules»).
Отметим, что все арифметические операции, включая комбинированные, применимы и к числам Decimal. Однако модуль math для них неприменим. В тоже время некоторые функции, присутствующие в модуле math, реализованы как методы типа Decimal (см. пример №21).
# Импортируем класс Decimal модуля decimal.
from decimal import Decimal as dcl
# Импортируем метод getcontext() модуля decimal.
from decimal import getcontext
# Установим глобальную точность в 3 значащие цифры.
getcontext().prec = 3
# Возведение в степень.
res_1 = pow(dcl(16), dcl(0.5))
# Получим 4.00.
print('pow(dcl(16), dcl(0.5)) ->', res_1, end='\n\n')
# Найдем модуль числа.
res_2 = abs(dcl(-0.33))
# Получим 0.330.
print('abs(dcl(-0.33)) ->', res_2, end='\n\n')
# Получим кортеж частного и остатка.
res_3 = divmod(dcl(45), dcl(7))
# Выведет кортеж (Decimal('6'), Decimal('3')).
print('divmod(dcl(45), dcl(7) ->', res_3, end='\n\n')
# Найдем максимальное из трех чисел.
res_4 = max(dcl(45), dcl(7.5), dcl(23.8))
# Получим 45.
print('max(dcl(45), dcl(7.5), dcl(23.8) ->', res_4, end='\n\n')
# Метод класса Decimal.
res_5 = dcl.sqrt(dcl(49))
# Получим 7.
print('dcl.sqrt(dcl(49)) ->', res_5, end='\n\n')
pow(dcl(16), dcl(0.5)) -> 4.00
abs(dcl(-0.33)) -> 0.330
divmod(dcl(45), dcl(7) -> (Decimal('6'), Decimal('3'))
max(dcl(45), dcl(7.5), dcl(23.8) -> 45
dcl.sqrt(dcl(49)) -> 7
Пример №21. Операции с числами Decimal.
Модуль fractions в Python
Еще одним числовым типом в Python является тип Fraction. Он реализует объекты рациональных чисел, которые явным образом хранят числитель и знаменатель рациональной дроби (см. пример №22), что опять же при необходимости помогает избежать недостатков вещественных чисел.
# Импортируем числа типа Fraction.
from fractions import Fraction
# Вычисляем выражение с числами типа Fraction.
res_1 = Fraction(1, 5) + Fraction(2, 5)
# Выведет 3/5.
print(res_1, end='\n\n')
# Выведем тип (<class 'fractions.Fraction'>).
print('Тип res_1:', type(res_1), end='\n\n')
# Создаем Fraction из типа float.
res_2 = Fraction(0.3) - Fraction('2.5')
# Выведет 50440315826549555/18014398509481984.
print(res_2)
3/5
Тип res_1: <class 'fractions.Fraction'>
-39631676720860365/18014398509481984
Пример №22. Создание рациональных чисел.
В примере мы создали объекты рациональных чисел, указав в конструкторе Fraction в первом выражении числитель и знаменатель, а во втором передав ему вещественное число и строковое представление вещественного числа. Кроме того, рациональную дробь можно создать и конвертацией типа Decimal. В любом случае после создания объекты рациональных чисел могут участвовать в арифметических операциях, как обычные числа (см. пример №23).
# Импортируем числа типа Fraction.
from fractions import Fraction as frn
# 1/3 в 4 степени.
res_1 = pow(frn(1, 3), 4)
# Получим 1/81.
print('pow(frn(1, 3), 4) ->', res_1, end='\n\n')
# Найдем модуль дроби.
res_2 = abs(frn(-1, 3))
# Получим 1/3.
print('abs(frn(-1, 3)) ->', res_2, end='\n\n')
# Найдем максимальное из двух чисел.
res_4 = max(frn(2, 3), frn(4, 5))
# Получим 4/5.
print('max(frn(2, 3), frn(4, 5)) ->', res_4, end='\n\n')
# Вычислим.
res_5 = frn(2, 3)*2 - frn(7.8)
# Получим -21842458192746905/3377699720527872.
print('frn(2, 3)*2 - 7.8 =', res_5, end='\n\n')
pow(frn(1, 3), 4) -> 1/81
abs(frn(-1, 3)) -> 1/3
max(frn(2, 3), frn(4, 5)) -> 4/5
frn(2, 3)*2 - 7.8 = -21842458192746905/3377699720527872
Пример №23. Операции с рациональными числами.
Познакомиться с рациональными числами и их методами более подробно вы можете в модуле fractions стандартной библиотеки Python (см. раздел «Numeric and Mathematical Modules»).
Краткие итоги параграфа
- Числа в Python представлены тремя базовыми типами: целые числа int, числа с плавающей точкой float и комплексные числа complex. Также посредством стандартной библиотеки доступны два расширения в виде чисел с фиксированной точностью Decimal и рациональных чисел Fraction.
- Для записи литералов целых чисел используется десятичная система счисления, однако разрешается записывать их в двоичной (например, 0b101), восьмеричной (например, -0o175) и шестнадцатеричной (например, 0xF5A) системах счисления. Для перевода целых чисел из одной системы счисления в другую предназначены встроенные функции bin(int_num), oct(int_num), hex(int_num), int(num_str, base=10).
- Целые числа поддерживают длинную арифметику и могут быть сколь угодно большими. При этом следует помнить, что при обработке очень больших чисел приходится жертвовать скоростью их обработки.
- Для записи литералов вещественных чисел используется привычный нам математический синтаксис, например, -2.57, 0.0, .28 (ноль перед точкой можно опускать). Также допустима запись вещественных чисел в экспоненциальной форме, например, 1.2345e2 (т.е. 1.2345*102) или -1.2345E-3 (т.е. -1.2345*10-3).
- В обычных условиях точность вещественных чисел ограничивается максимум 17 значащими цифрами. Поэтому не стоит сравнивать их, доверяя точности до последнего знака.
- Комплексные числа в Python хранят два вещественных числа: первое представляет собой действительную часть комплексного числа, а второе – мнимую. Например, -0.4+7j, 2-1.45j или 3.1j (нулевую действительную часть можно опускать).
- В Python поддерживаются все известные нам со школы математические операции: сложение x + y, вычитание x - y, умножение x*y, деление x/y, деление с округлением вниз x//y, получение остатка от деления x%y, возведение в степень x**y. Стоит помнить, что некоторые операции не применимы к комплексным числам.
- В дополнение к базовому оператору присваивания = в Python применяется целый ряд комбинированных операторов присваивания, которые объединяют операцию присваивания с другой операцией. Например, +=, -=, *=, /=, //=, %=, **=. Как видим, в общем случае выражение присваивания с комбинированным оператором x op= y можно считать сокращенной записью выражения x = x op y, где вместо op следует подставлять один из арифметических операторов.
- Для сравнения чисел используются операторы <, >, <=, >=, == (равно), != (не равно).
- Помимо стандартных арифметических операций имеется и ряд полезных встроенных функций для работы с числами: divmod(x, y) – возвращает кортеж (x//y, x%y), pow(x, y) – возвращает x в степени y, abs(x) – возвращает модуль числа x, round(x, n) – округляет число до n-го разряда после запятой, max(num_1, num_2, ..., num_n), min(num_1, num_2, ..., num_n) и sum(num_1, num_2, ..., num_n) – соответственно возвращают максимальное, минимальное и сумму из двух и более чисел.
- Если встроенных функций недостаточно, можно воспользоваться расширением math стандартной библиотеки, которое обеспечивает доступ к широкому кругу математических функций и констант, которые определены стандартом языка C. Для комплексных чисел следует использовать модуль cmath.
- Для случаев, когда требуется повышенная точность вычислений, в Python предусмотрены дополнительные типы числовых объектов: числа с фиксированной точностью Decimal, которые позволяют устанавливать требуемую точность вычислений, способ округления и некоторые другие параметры, а также рациональные числа Fraction, которые явным образом хранят числитель и знаменатель рациональной дроби. Оба модуля доступны в стандартной библиотеке Python в разделе «Numeric and Mathematical Modules».
Вопросы и задания для самоконтроля
1. Какие из представленых литералов чисел относятся к типу int, а какие к типу float: 3.4, 0, 5.0, 0.0, 123+4.1j, 795? Проверьте типы программно. Показать решение.
Ответ. Тип int: 0 и 795. Тип float: 3.4, 5.0, 0.0.
# Выводим типы представленных литералов.
print('Тип 3.4:', type(3.4))
print('Тип 0:', type(0))
print('Тип 5.0:', type(5.0))
print('Тип 0.0:', type(0.0))
print('Тип 123+4.1j:', type(123+4.1j))
print('Тип 795:', type(795))
Тип 3.4: <class 'float'> Тип 0: <class 'int'> Тип 5.0: <class 'float'> Тип 0.0: <class 'float'> Тип 123+4.1j: <class 'complex'> Тип 795: <class 'int'>
2. Определите системы счисления целых чисел 0x1101, 0b1101, 0o755, 0X755 и 755, записанные в исходном коде программы. Показать решение.
Ответ. Двоичная СС: 0b1101; восьмеричная СС: 0o755; десятичная СС: 755, шестнадцатеричная СС: 0x1101 и 0X755.
3. Какая операция над целыми числами никогда не дает в результате целое число? Показать решение.
Ответ. Результат деления целых чисел всегда имеет тип float, даже при делении без остатка. Например, 15/5 вернет 3.0, а не 3.
4. Как можно получить действительную и мнимую части комплексного числа? А как получить число, сопряженное к данному комплексному числу? Показать решение.
Ответ. Отдельные части комплексного числа доступны в виде атрибутов real и imag, а получить сопряженное данному комплексное число можно изменив знак мнимой части при помощи метода complex.conjugate().
5. Вычислите устно и программно значения выражений 2*(3 + 4) и 2*3 + 4. Объясните результаты. Показать решение.
Ответ. В Python как и в математике первыми выполняются действия в скобках, поэтому 2*(3 + 4) = 14. Если скобки отсутствуют, то первыми выполняются операции с более высоким приоритетом. А так как приоритет умножения выше приоритета сложения, то 2*3 + 4 = 10.
# Выводим результаты вычислений.
print('2*(3 + 4) =', 2*(3 + 4))
print('2*3 + 4 =', 2*3 + 4)
2*(3 + 4) = 14 2*3 + 4 = 10
6. Каким будет тип результата вычисления выражения 7 - 3 + 2.0 и почему? Проверьте свой ответ программно. Показать решение.
Ответ. Результатом будет вещественное число, т.к. интерпретатор всегда преобразует числа к более сложному числовому типу, который встречается в выражении.
# Найдем результат.
res = 7 - 3 + 2.0
# Проверим тип.
print('Тип результата:', type(res))
Тип результата: <class 'float'>
7. Каким будет остаток от деления числа 63 на число 5? Проверьте свой ответ программно. Показать решение.
print('Остаток от деления 63 на 5:', 63%5)
Остаток от деления 63 на 5: 3
8. Как получить доступ к функциям модуля math? Показать решение.
Ответ. Нужно импортировать его при помощи инструкции import math.
9. Исправьте в коде пять ошибок (по одной в каждом блоке). Показать решение.
Импортируем модуль math.
import math
# Присвоим переменной вещественное число.
num_float = 375,44
# Округлим его до целых.
num_float = math.round(num_float)
# Извлекаем корень из числа.
num_sqrt = sqrt(num_float)
# Выводим результат на экран.
input(num_sqrt)
Импортируем модуль math.
import math
# Присвоим переменной вещественное число.
num_float = 375,44
# Округлим его до целых.
num_float = math.round(num_float)
# Извлекаем корень из числа.
num_sqrt = sqrt(num_float)
# Выводим результат на экран.
input(num_sqrt)
# Оформляем комментарий правильно.
# Импортируем модуль math.
import math
# Исправляем на десятичную точку.
# Присвоим переменной вещественное число.
num_float = 375.44
# round - это встроенная функция.
# Округлим его до целых.
num_float = round(375.44)
# sqrt расположена в math.
# Извлекаем корень из числа.
num_sqrt = math.sqrt(num_float)
# input - ввод, print - вывод.
# Выводим результат на экран.
print(num_sqrt)
10. Дополнительные тесты по теме расположены в разделе «Числа и математические выражения» нашего сборника тестов.
11. Дополнительные упражнения и задачи по теме расположены в разделе «Числа и математические выражения» нашего сборника задач и упражнений.
Быстрый переход к другим страницам
- Типы данных в Python
- Числа в Python
- Строки в Python
- К содержанию учебника