Лутц М. - Изучаем Python (1077325), страница 34
Текст из файла (страница 34)
и что кроме применения инструкции рг)пт и автоматического вывода результатов существуют и другие способы отображения чисел: »> пцэ = 1 / 3.0 »> пцэ № Автоматический вывод 0.33333333333333331 »> рггпт пца № Инструкция ргтлт выполняет округление 0.333333333333 »> "Хе" Х пца '3.333333е-001' »> "Х2.2Г' Х пцэ № Вывод с использованием строки форматирования '0.33' № Вывод с использованием строки форматирования В последних двух случаях была использована стирана формаптирова- нин результата выражения, которая позволяет гибко определять фор- мат представления, но об этом мы поговорим в главе 7, когда займемся исследованием строк. Теперь, когда вы увидели, как работает операция деления, вы должны знать, что она претерпит небольшие изменения в будущей версии РуХЬоп (версия З.О, которая должна появиться после выпуска этого издания книги).
В Ру(Ьоп 2,5 она работает так, как только что было описано, но фактически существуют два оператора деления (один из которых претерпит изменения): Деление: классическое, с округлением вниз и истинное Глава 5. Числа Х/У Классическое деление. В Ру1Ьоп 2.5 и в более ранних версиях результат усекается при делении целых чисел и сохраняется дробная часть для чисел с плавающей точкой.
Этот оператор станет оператором истинного деления — в будущей версии Ру1Ьоп З.О он будет всегда сохранять дробную часть, независимо от типов операндов. Х // У Деление с округлением вниз. Этот оператор впервые появился в Ру1Ьоп 2.2. Он всегда отсекает дробную часть, округляя результат до ближайшего наименьшего целого, независимо от типов операндов. Деление с округлением вниз было добавлено по той причине, что в текущей модели классического деления тип результата зависит от типов операндов, который трудно предсказать заранее в языках программирования с динамической типизацией, таких как Ру1Ьоп.
Из-за возможных проблем с обратной совместимостью операция деления в языке Ру1Ьоп в настоящее время находится в состоянии постоянного изменения. Подытоживая вышесказанное: в версии 2.5 оператор деления / по умолчанию работает, как было описано выше, а оператор деления с округлением вниз // может использоваться для округления результата деления до ближайшего наименьшего целого, независимо от типов операндов: »> (5 / 2), (5 / 2.0), (5 / -2.0), (5 / -2) (2, 2.5, -2.5, -3) >» (5 // 2), (5 // 2.0), (5 // -2,0), (5 // -2) (2, 2.0, -3.0, -3) »> (9 / 3), (9.0 / 3), (9 // 3), (9 // 3.0) (3, 3 О, 3, 3.0) В будущей версии Ру1Ьоп оператор / изменится так, что будет возвращать истинный результат деления, который всегда будет содержать дробную часть, даже в случае деления целых чисел, например, результатом выражения 1 / 2 будет значение 0. 5, а не 0, в то время как результатом выражения 1// 2 будет значение 0.
А сейчас, пока эти изменения еще не включены полностью, ознакомиться с будущим принципом действия оператора / можно при использовании специальной формы импорта: Ггоз (01сге (арогс 01ч131оп. В этом случае оператор / превращается в оператор истинного деления (с сохранением дробной части в результате), а принцип действия оператора // остается неизменным. Ниже показано, как эти операторы будут действовать в будущем: »> Ггоэ Го1ого 1зрогс 01ч1В1ОП »> (5 / 2), (5 / 2.0), (5 / -2.0), (5 / -2) (2.5, 2 5, -2.5, -2.5) Числа в действии »> (5 // 2), (9 // 2.0), (9 // -2.0), (5 // -2) (2, 2.0, -3.0, -3) »> (9 / 3), (9.0 / 3), (9 // 3), (9 // 3.0) (3.0, 3.0, 3, 3.0) Рассмотрите простой пример цикла иЛ11е в главе 13 и соответствующее упражнение в конце четвертой части книги, которые иллюстрируют программный код, на котором может сказаться это изменение в поведении оператора /.
Вообще, воздействию этого изменения может быть подвержен любой программный код, который подразумевает усечение дробной части в целочисленном результате (в этих случаях вместо него следует использовать оператор //). К моменту написания этих строк данное изменение планируется включить в версию Русаков 3.0, но вам обязательно следует опробовать эти выражения в своей версии интерпретатора, чтобы увидеть, как этот оператор действует. Кроме того, запомните специальную команду т гсз, использованную здесь, — она еще будет обсуждаться в главе 21. Битовые операции Помимо обычных числовых операций (сложение, вычитание и т. д,) язык Ру()топ поддерживает большую часть видов числовых выражений, доступных в языке С. Например, ниже приводится пример выполнения операций поразрядного сдвига и логических операций: »> х 1 № 0001 »> х « 2 № Сдвиг влево на 2 бита: 0100 4 »>х)2 № Побитовое ИПИ: 0011 3 >» х $1 № Побитовое И Оббт 1 В первом выражении двоичное значение 1 (по основанию 2, 0001) сдвигается влево на две позиции, в результате получается число 4 (0100).
В последних двух выражениях выполняются двоичная операция ИЛИ (0001 ~ 0010 = 0011) и двоичная операция И (000160001 = 0001). Такого рода операции позволяют хранить сразу несколько Флагов и других значений в единственном целом числе. Мы не будем здесь слишком углубляться в»жонглирование битами». Вам пока достаточно знать, что битовые операции поддерживаются языком, и они могут пригодиться, когда вы будете иметь дело, например, с сетевыми пакетами или упакованными двоичными данными, которые производятся программами на языке С.
Тем не менее вы должны понимать, что в языках высокого уровня, таких как Ру1)топ, битовые операции не имеют такого большого значения, как в низкоуровневых языках, подобных языку С. Как правило, если у вас возникает желание использовать битовые операции в программах на языке Ру()топ, вам необходимо вспомнить, на каком языке вы программируете. В Ру9Ьоп 156 Глава 5. Числа имеются гораздо лучшие способы представления информации, чем последовательности битов. Длинные целые Теперь добавим немного экзотики и посмотрим на длинные целые в действии. Когда целочиеленный литерал завершается символом 6 (или!), интерпретатор создает длинное целое число. В Ру$йоп длинные целые могут иметь произвольную величину.
То есть такое число может содержать такое число цифр, на которое хватит памяти в компьютере: »> 99999999999999999999999999999999999996 + 1 10000000000000000000000000000000000000С Символ Г в конце литерала предписывает интерпретатору Ру(Ьоп создать объект длинного целого числа, способный представлять число с произвольной точностью. В действительности, начиная с версии Ру- $)>оп 2.2, даже символ С в конце литерала можно не указывать. Интерпретатор автоматически преобразует обычное целое число в длинное целое, если его значение превысит величину, которая может быть представлена обычным целым числом (с технической точки зрения— когда число превысит величину, которую способно вместить 32-битовое целое число), То есть вам не требуется указывать символ 1., так как Ру$)>оп автоматически выполнит необходимые преобразования, когда в этом возникнет потребность: >» 9999999999999999999999999999999999999 + 1 10000000000000000000000000000000000000С Длинные целые — это достаточно удобный инструмент.
Например, с их помощью можно представить национальный бюджет в копейках (если вам это интересно и в вашем компьютере имеетея достаточный объем памяти). Именно по этой причине нам удалось в примерах из главы 3 вычислить такую большую степень числа 2: »> 26 ° ° 200 1606938044258990275541962092341162602522202993782792835301376С »> »> 2 * ° 200 1806938044258990275541962092341162602522202993782792835301376С Так как интерпретатору приходится производить дополнительные действия, чтобы обеспечить поддержку высокой точности, математические операции с участием длинных целых чисел обычно выполняются существенно медленнее, чем операции с обычными целыми числами (которые, как правило, выполняются непосредственно аппаратными средствами).
Однако, если важна высокая точность, то фактор низкой производительности уходит на задний план. Числа в действии Комплексные числа Комплексные числа — это особый базовый тип данных в РуФ)топ. Если вы знаете о существовании комплексных чисел, вы должны знать, когда они используются. В противном случае этот раздел можно пропустить. Комплексные числа состоят из двух чисел с плавающей точкой, представляющих вещественную и мнимую части, и в тексте программы отличаются наличием суффикса 3, нли ), после мнимой части.
Если вещественная часть не равна нулю, комплексное число записывается как сумма двух частей, с помощью символа +. Например, комплексное число, вещественная часть которого равна 2, а мнимая часть -3, записывается как 2 е -3) .Ниже приводятся примеры некоторых действий над комплексными числами: »> 1) ~ 13 (-1>0) ) »>2+1) *3 (2>3)) »> (2+1)) * 3 (6+3)) Кроме того, комплексные числа позволяют обращаться к своим частям, как к атрибутам, поддерживают все обычные математические операции и могут обрабатываться с помощью стандартного модуля сзатл (версия модуля затл, предназначенная для работы с комплексными числами). Комплексные числа обычно используются в инженерных программах.
Поскольку зто инструмент повышенной сложности, ищите подробности в справочном руководстве к языку РуФ)топ. Шестнадцатеричная и восьмеричная формы записи чисел Как уже говорилось ранее, целые числа в языке РуФ)топ могут записываться в шестнадцатеричной (по основанию 16) и восьмеричной (по основанию 8) форме: ° Восьмеричные литералы должны начинаться с символа О, вслед за которым следует последовательность восьмеричных цифр 0-7, каждая из которых представляет трн бита. ° Шестнадцатеричные литералы должны начинаться с комбинации символов Ох или ОХ, вслед за которой следует последовательность шестнадцатеричных цифр 0-9 и А-Г (в верхнем или в нижнем регистре), каждая из которых представляет четыре бита.
Имейте в виду, что это всего лишь альтернативный синтаксис задания значений целочисленных объектов. Например, следующие восьмеричные и шестнадцатеричные литералы создают обычные целые числа с заданными значениями: »> 01, 010, 0100 е Вееенериннее литерале (1, 8, 64) 158 Глава 5. Числа »> Ох01, Ох10, Охаб а Шестнадцатеричаае литерала (1, 16, 255) Здесь восьмеричное значение 0100 соответствует десятичному значению 64, а шестнадцатеричное Охрр — десятичному 255. По умолчанию интерпретатор РуХЬоп выводит числа в десятичной системе счисления (по основанию 10), но предоставляет встроенные функции, которые позволяют преобразовывать целые числа в последовательности восьмеричных и шестнадцатеричных цифр: »> оос(64), Лех(64), ЛЕХ(255) ('0100'.
Ох40', Ох(1') Функция сс( выводит целое число в восьмеричном представлении, а функция Лех — в шестнадцатеричном. Кроме того, существует возможность обратного преобразования — встроенная функция тл(, которая преобразует строку цифр в целое число. Во втором необязательном аргументе она может принимать основание системы счисления: »> Хл1('0100'), 1лт('0100', 8), 1лт('Ох40', 16) (100, 64, 64) Функция еча), с которой мы встретимся далее в этой книге, интерпретирует строку во входном аргументе, как программный код на языке РуХ)хоп. Поэтому она имеет похожий эффект (хотя обычно она работает заметно медленнее, потому что ей приходится компилировать и выполнять строку как часть программы, а это предполагает, что вы должны иметь безграничное доверие к источнику запускаемой строки — достаточно грамотный пользователь мог бы подсунуть вашей программе строку, которая при выполнении в функции еча! удалит все файлы на вашем компьютере!): »> ечеЦ '100'), ече)('0100'), ече)('Ох40') (100, 54, 64) Наконец, целые числа могут быть преобразованы в восьмеричное и шестнадцатеричное представления с помощью строки выражения форматирования: »> "Хо Хх ХХ" Х (64, 64, 255) '100 40 ГЕ' Строки форматирования будут рассматриваться в главе 7.