Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 46
Текст из файла (страница 46)
При этом вам не требуется использовать какой-либо специальный синтаксис, чтобы определить длинное целоечисло, а единственным признаком в версии 2.6, свидетельствующим, что используется длинное целое число, является завершающий символ L, которыйпоявляется при выводе таких чисел:>>> 999999999999999999999999999999 + 11000000000000000000000000000000LЦелые числа с неограниченной точностью – это достаточно удобный инструмент.
Например, с их помощью можно представить национальный бюджетв копейках (если вам это интересно и в вашем компьютере имеется достаточный объем памяти). Именно по этой причине нам удалось в примерах из главы 3 вычислить такую большую степень числа 2. Ниже приводятся примерыдля версий 3.0 и 2.6:>>> 2 ** 2001606938044258990275541962092341162602522202993782792835301376>>> 2 ** 2001606938044258990275541962092341162602522202993782792835301376LТак как интерпретатору приходится производить дополнительные действия,чтобы обеспечить поддержку высокой точности, с ростом значений целочисленные операции могут ощутимо замедляться.
Однако если высокая точностьважна, то фактор низкой производительности отходит на задний план.Комплексные числаКомплексные числа используются не так часто, как другие числовые типы,тем не менее, они также относятся к базовым типам данных в Python. Если вызнаете о существовании комплексных чисел, вы должны знать, когда они используются. В противном случае этот раздел можно пропустить.Комплексные числа состоят из двух вещественных чисел, представляющихдействительную и мнимую части, и в тексте программы отличаются наличиемсуффикса j, или J после мнимой части.
Если действительная часть не равнанулю, комплексное число записывается как сумма двух частей с помощью символа +. Например, комплексное число, действительная часть которого равна 2,а мнимая часть – -3, записывается как 2 + -3j.Ниже приводятся примеры некоторых действий над комплексными числами:>>> 1j * 1J(-1+0j)>>> 2 + 1j * 3(2+3j)>>> (2 + 1j) * 3(6+3j)Кроме того, комплексные числа позволяют обращаться к своим частям какк атрибутам, поддерживают все обычные математические операции и могутобрабатываться с помощью стандартного модуля cmath (версия модуля math,172Глава 5.
Числапредназначенная для работы с комплексными числами). Комплексные числаобычно используются в инженерных программах. Поскольку это инструментповышенной сложности, ищите подробности в справочном руководстве к языку Python.Шестнадцатеричная, восьмеричная и двоичнаяформы записи чиселКак уже говорилось ранее, целые числа в языке Python могут записываться нетолько в десятичной, но еще и в шестнадцатеричной, восьмеричной и двоичнойформе.
Правила записи литералов целых чисел рассматривались в начале этойглавы. Теперь рассмотрим несколько практических примеров.Имейте в виду, что это всего лишь альтернативный синтаксис задания значений целочисленных объектов. Например, следующие литералы создают обычные целые числа с заданными значениями:>>>(1,>>>(1,>>>(1,0o1, 0o20, 0o377# Восьмеричные литералы16, 255)0x01, 0x10, 0xFF# Шестнадцатеричные литералы16, 255)0b1, 0b10000, 0b11111111 # Двоичные литералы16, 255)Здесь восьмеричное значение 0o377, шестнадцатеричное значение 0xFF и двоичное значение 0b11111111 соответствуют десятичному значению 255.
По умолчанию интерпретатор Python выводит числа в десятичной системе счисления(по основанию 10), но предоставляет встроенные функции, которые позволяютпреобразовывать целые числа в последовательности цифр в других системахсчисления:>>> oct(64), hex(64), bin(64)(‘0o100’, ‘0x40’, ‘0b1000000’)Функция oct преобразует десятичное число в восьмеричное представление,функция hex – в шестнадцатеричное, а функция bin – в двоичное. Кроме того,существует возможность обратного преобразования – встроенная функция intпреобразует строку цифр в целое число.
Во втором необязательном аргументеона может принимать основание системы счисления:>>> int(‘64’), int(‘100’, 8), int(‘40’, 16), int(‘1000000’, 2)(64, 64, 64, 64)>>> int(‘0x40’, 16), int(‘0b1000000’, 2) # Допускается использовать литералы(64, 64)Функция eval, с которой мы встретимся далее в книге, интерпретирует строку во входном аргументе как программный код на языке Python. Поэтому онаможет воспроизводить похожий эффект. Правда, обычно она работает заметномедленнее, потому что ей приходится компилировать и выполнять строку какчасть программы, а это предполагает, что вы должны иметь безграничное доверие к источнику запускаемой строки, – достаточно грамотный пользовательмог бы подсунуть вашей программе строку, которая при выполнении в функции eval удалит все файлы на вашем компьютере!:Числа в действии173>>> eval(‘64’), eval(‘0o100’), eval(‘0x40’), eval(‘0b1000000’)(64, 64, 64, 64)Наконец, целые числа могут быть преобразованы в восьмеричное и шестнадцатеричное представления с помощью строкового метода форматированияи оператора форматирования строк:>>> ‘{0:o}, {1:x}, {2:b}’.format(64, 64, 64)‘100, 40, 1000000’>>> ‘%o, %x, %X’ % (64, 255, 255)‘100, ff, FF’Форматирование строк будет подробно рассматриваться в главе 7.Прежде чем двинуться дальше, считаю своим долгом сделать два замечания.Во-первых, пользователи Python 2.6 должны помнить, что литералы восьмеричных чисел в этой версии начинаются с одного нуля – это первоначальныйформат представления восьмеричных чисел в языке Python:>>>(1,>>>(1,0o1, 0o20, 0o377 # Новый формат восьмеричных литералов в 2.6 (как в 3.0)16, 255)01, 020, 0377# Прежний формат восьмеричных литералов в 2.616, 255)# (и в более ранних версиях)В версии 3.0 попытка выполнить второй пример приведет к ошибке.
Хотя в версии 2.6 такой синтаксис считается допустимым, не начинайте строки цифрс нуля, если вы не предполагаете использовать их в качестве восьмеричныхлитералов. В версии Python 2.6 такие строки будут восприниматься как числав восьмеричной системе счисления, что может не соответствовать вашим ожиданиям – число 010 всегда соответствует десятичному числу 8, а не десятичному 10 (независимо от того, что вы имели в виду!). Чтобы обеспечить непротиворечивость по аналогии с шестнадцатеричной и двоичной формами, восьмеричный формат был изменен в версии 3.0 – в версии 3.0 вы должны использоватьформу записи 0o010, и желательно этот же формат использовать в версии 2.6.Во-вторых, обратите внимание, что с помощью литералов можно создаватьцелые числа произвольной величины.
Например, ниже с помощью шестнадцатеричного литерала создается целое число, а затем выводится его значение,сначала в десятичном, затем в восьмеричном и, наконец, в двоичном представлениях:>>> X = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF>>> X5192296858534827628530496329220095>>> oct(X)‘017777777777777777777777777777777777777’>>> bin(X)‘0b1111111111111111111111111111111111111111111111111111111111 ...и т.д.
...Раз уж разговор зашел о двоичных числах, рассмотрим теперь средства для работы с отдельными битами.Битовые операцииПомимо обычных числовых операций (сложение, вычитание и так далее) языкPython поддерживает большую часть видов числовых выражений, доступных174Глава 5. Числав языке C. Например, ниже приводится пример выполнения операций поразрядного сдвига и логических операций:>>>>>>4>>>3>>>1x = 1x << 2# 0001# Сдвиг влево на 2 бита: 0100x | 2# Побитовое ИЛИ: 0011x & 1# Побитовое И: 0001В первом выражении двоичное значение 1 (по основанию 2, 0001) сдвигаетсявлево на две позиции, в результате получается число 4 (0100).
В последних двухвыражениях выполняются двоичная операция ИЛИ (0001|0010 = 0011) и двоичная операция И (0001&0001 = 0001). Такого рода операции позволяют хранить сразу несколько флагов и других значений в одном целом числе.Это одна из областей, где поддержка двоичной и шестнадцатеричной форм записи чисел в Python 2.6 и 3.0 оказывается наиболее полезной, – она позволяетзаписывать и выводить числа в виде строк битов:>>> X = 0b0001>>> X << 24>>> bin(X << 2)‘0b100’# Двоичные литералы# Сдвиг влево>>> bin(X | 0b010)‘0b11’>>> bin(X & 0b1)‘0b1’# Битовая операция ИЛИ# Строка двоичных цифр# Битовая операция И >>> X = 0xFF# Шестнадцатеричные литералы>>> bin(X)‘0b11111111’>>> X ^ 0b10101010# Битовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)85>>> bin(X ^ 0b10101010)‘0b1010101’>>> int(‘1010101’, 2) # Преобразование изображения числа в число по основанию85>>> hex(85)# Вывод числа в шестнадцатеричном представлении‘0x55’Мы не будем здесь слишком углубляться в «жонглирование битами».
Вам покадостаточно знать, что битовые операции поддерживаются языком, и они могутпригодиться, когда вы будете иметь дело, например, с сетевыми пакетами илиупакованными двоичными данными, которые производятся программами наязыке C. Тем не менее вы должны понимать, что в языках высокого уровня,таких как Python, битовые операции не имеют такого большого значения, какв низкоуровневых языках, подобных языку C. Как правило, если у вас возникает желание использовать битовые операции в программах на языке Python,вам необходимо вспомнить, на каком языке вы программируете. В Python имеются гораздо лучшие способы представления информации, чем последовательности битов.175Числа в действииВ версии Python 3.1 у целых чисел появился новый метод bit_length, который возвращает количество битов, необходимых дляпредставления числа в двоичном виде.
Тот же результат можнополучить, уменьшив на 2 длину строки с двоичным представлением числа, воспользовавшись встроенной функцией len, с которой мы встречались в главе 4, однако этот способ работает менееэффективно:>>> X = 99>>> bin(X), X.bit_length()(‘0b1100011’, 7)>>> bin(256), (256).bit_length()(‘0b100000000’, 9)>>> len(bin(256)) - 29Другие встроенные средства для работы с числамиВ дополнение к этим базовым типам объектов Python предоставляет встроенные функции и модули для работы с числами.
Встроенные функции pow и abs,например, вычисляют степень и абсолютное значение числа соответственно.В следующем примере демонстрируется использование модуля math (которыйсодержит реализацию множества функций из библиотеки math языка C) и нескольких встроенных функций:>>> import math>>> math.pi, math.e(3.1415926535897931, 2.7182818284590451)# Распространенные константы>>> math.sin(2 * math.pi / 180)0.034899496702500969# Синус, тангенс, косинус>>> math.sqrt(144), math.sqrt(2)(12.0, 1.4142135623730951)# Квадратный корень>>> pow(2, 4), 2 ** 4(16, 16)# Возведение в степень>>> abs(-42.0), sum((1, 2, 3, 4))(42.0, 10)# Абсолютное значение, сумма>>> min(3, 1, 2, 4), max(3, 1, 2, 4)(1, 4)# Минимум, максимумФункция sum, которая демонстрируется здесь, принимает последовательностьчисел, а функции min и max могут принимать либо последовательность чисел,либо множество отдельных аргументов. Существует множество способов округления десятичных знаков в вещественных числах.