Закрепление пройденного
Контрольные вопросы
В следующих главах мы более подробно будем исследовать понятия,
введенные в этой главе, поэтому здесь мы охватим лишь самые общие направления:
1. Назовите четыре базовых типа данных в языке Python.
2. Почему они называются базовыми?
3. Что означает термин «неизменяемый», и какие три базовых типа языка Python являются неизменяемыми?
4. Что означает термин «последовательность», и какие три типа отно
сятся к этой категории?
5. Что означает термин «отображение», и какой базовый тип является отображением?
6. Что означает термин «полиморфизм», и почему он имеет такое важ
ное значение?
Закрепление пройденного
141Ответы1. К базовым типам объектов (данных) относятся числа, строки, спи
ски, словари, кортежи и файлы. Множества, сами типы, None и логи
ческие значения также иногда относят к базовым типам. Существу
ет несколько типов чисел (целые, длинные целые, с плавающей точ
кой и фиксированной точности) и два типа строк (обычные и в коди
ровке Юникод).
2. Базовыми они называются потому, что являются частью самого языка Python и могут быть использованы в любой момент. Чтобы создать объект какоголибо другого типа, обычно бывает необходи
мо обращаться к функции из импортированного модуля. Для боль
шинства базовых типов предусмотрен специальный синтаксис соз
дания объектов, например, 'spam' – это выражение, которое создает строку и определяет набор операций, которые могут применяться к ней. Вследствие этого базовые типы жестко вшиты в синтаксис языка Python. Единственное отличие – объектыфайлы, для созда
ния которых необходимо вызывать функцию open.
3. «Неизменяемый» объект – это объект, который невозможно изме
нить после того, как он будет создан. К этой категории объектов от
носятся числа, строки и кортежи. Но даже при том, что вы не може
те изменить «неизменяемый» объект на месте, вы всегда можете создать вместо него новый объект, выполнив выражение.
4. «Последовательность» – это упорядоченная по местоположению коллекция объектов. К последовательностям относятся строки, спи
ски и кортежи. Ко всем этим типам могут применяться операции,
общие для всех последовательностей, такие как обращение к эле
ментам по их индексам, конкатенация и получение срезов. Но поми
мо этого каждый из этих типов имеет ряд специфичных методов.
5. Под термином «отображение» подразумевается объект, который ото
бражает ключи на ассоциированные с ними значения. Единствен
ный базовый тип данных в языке Python, который является отобра
жением, – это словарь. Отображения не подразумевают упорядоче
ние элементов по их позиции, но они поддерживают возможность доступа к элементам по ключу, плюс ряд специфичных методов.
6. «Полиморфизм» означает, что фактически выполняемая операция
(такая как +)
зависит от объектов, которые принимают в ней уча
стие. В языке Python идея полиморфизма составляет ключевую кон
цепцию (пожалуй,
самую ключевую) – она не ограничивает приме
нимость программного кода какимто определенным типом дан
ных, благодаря чему этот код обычно в состоянии автоматически обрабатывать объекты самых разных типов.
5
Числа
С этой главы, мы начинаем погружаться в детали реализации языка
Python. Данные в этом языке имеют форму объектов – это либо встро
енные объекты, входящие в состав самого языка, либо объекты, созда
ваемые с помощью языковых конструкций. Фактически объекты яв
ляются основой любой программы на языке Python. Поскольку объек
ты представляют самое фундаментальное понятие для программиро
вания на языке Python, все наше внимание в первую очередь будет сосредоточено на объектах.
В предыдущей главе мы коротко познакомились с базовыми типами объектов языка Python. И хотя в этой главе основные понятия были да
ны, мы старались избегать слишком специфичных подробностей в це
лях экономии книжного пространства. В этой главе мы приступаем к бо
лее внимательному изучению концепции типов данных, чтобы воспол
нить детали, о которых раньше умалчивалось. Кроме того, здесь мы рас
смотрим некоторые типы, которые так или иначе связаны с числами,
такие как множества и логические значения (Boolean). Итак, приступим к изучению чисел – первой категории типов данных в языке Python.
Числовые типы в Python
Числовые типы в языке Python не выделяются ничем необычным и на
верняка покажутся вам знакомыми, если в прошлом вам уже прихо
дилось использовать какойлибо язык программирования. Числа мо
гут использоваться для представления информации о состоянии ваше
го банковского счета, о расстоянии до Марса, о числе посетителей ва
шего вебсайта и всего, что можно выразить в числовой форме.
Числа в языке Python представлены не единственным типом, а целой категорией родственных типов. Язык Python поддерживает обычные
Числовые типы в Python
143типы объектов чисел (целые и с плавающей точкой), а также литералы –
для их создания, и выражения – для их обработки. Кроме того, Python предоставляет дополнительное программное обеспечение поддержки чисел, включая тип комплексного числа, тип
чисел с неограниченной точностью представления, тип вещественных чисел с фиксированной точностью, множества, логические значения и целый ряд разнообраз
ных библиотек для работы с числами. В следующих нескольких разде
лах проводится обзор поддержки чисел в языке программирования
Python.
Числовые литералыПомимо базовых типов данных язык Python предоставляет самые обычные числовые типы: он поддерживает целые числа и числа с пла
вающей точкой (с дробной частью) и все синтаксические конструкции и операции, связанные с числами. Подобно языку C, Python позволяет записывать целые числа с помощью шестнадцатеричных и восьмерич
ных литералов. Но в отличие от C, язык Python дополнительно реали
зует тип комплексных чисел, а также длинные целые числа с неогра
ниченной точностью представления (они могут содержать столько зна
ков, сколько позволит хранить объем оперативной памяти). В табл. 5.1
показано, как выглядят числа различных типов в языке Python в тек
сте программы (то есть в виде литералов).
Таблица 5.1. Числовые литералыВообще в числовых типах языка Python нет ничего сложного, но мне хотелось бы сделать несколько замечаний о принципах использования литералов в программном коде:
Литералы целых чисел и чисел с плавающей точкойЦелые числа записываются как строки, состоящие из десятичных цифр. Числа с плавающей точкой могут содержать символ точки и/или необязательную экспоненту со знаком, которая начинается с символа e или E. Если в записи числа обнаруживается точка или экспонента, интерпретатор Python создает объект числа с плаваю
щей точкой и использует вещественную (не целочисленную) матема
тику, когда такой объект участвует в выражении. Правила записи
ЛитералИнтерпретация1234,
24, 0
Обычные целые числа (long в языке C)
9999999999999999999L
Длинные целые числа (с неограниченной точностью представления)
1.23,
3.14e10, 4E210, 4.0e+210
Числа с плавающей точкой (double в языке C)
0177,
0x9ff, 0XFF
Восьмеричные и шестнадцатеричные лите
ралы целых чисел
3+4j,
3.0+4.0j, 3J
Литералы комплексных чисел
144Глава 5. Числа вещественных чисел в языке Python ничем не отличаются от пра
вил, используемых в языке C.
Точность представления целых чисел и длинные целыеПростые целые числа в языке Python (первая строка в табл. 5.1)
реализованы как тип long в языке C (то есть имеют размер как ми
нимум 32 бита), а вещественные числа в языке Python реализованы как тип double в языке C. Таким образом, точность представления чисел
этих типов соответствует точности представления, которую обеспечивает компилятор языка C, использованный для сборки ин
терпретатора Python.
1
Литералы длинных целых чиселЕсли числовой литерал заканчивается символом l или L, он рас
сматривается интерпретатором Python как длинное целое число (не надо путать с типом long в языке C) и может использоваться для представления сколь угодно больших чисел. В Python 2.2 и более поздних версиях целые числа автоматически преобразуются в длин
ные целые, если их значения не умещаются в отведенные 32 бита,
поэтому вам не требуется вводить символ L – интерпретатор автома
тически выполнит необходимые преобразования, когда потребует
ся увеличить точность представления.
Шестнадцатеричные и восьмеричные литералыПравила записи шестнадцатеричных (по основанию 16) и восьме
ричных (по основанию 8) чисел в языке Python ничем не отличают
ся от правил, используемых в языке C. Литералы восьмеричных чисел начинаются с нуля (0), вслед за которым следуют восьмерич
ные цифры 07. Шестнадцатеричные литералы начинаются с ком
бинации символов 0x или 0X, вслед за которыми следуют шестна
дцатеричные цифры 09 и AF. Шестнадцатеричные цифры в шест
надцатеричных литералах могут вводиться как в нижнем, так и в верхнем регистре. И восьмеричные, и шестнадцатеричные лите
ралы создают объекты целых чисел – это всего лишь альтернатив
ный синтаксис определения значений этого типа.
Комплексные числаЛитералы комплексных чисел в языке Python записываются в фор
мате вещественная_часть+мнимая_часть, где вещественная_часть является необязательной и мнимая_часть может указываться без вещественной составляющей. Во внутреннем представлении комплексное число реализовано в виде двух чисел с плавающей точкой, но при обработ
ке чисел этого типа используется математика комплексных чисел.
1
Это замечание относится к стандартной реализации CPython. В Jython чи
словые типы Python в действительности соответствуют классам Java.
Операторы выражений
145Встроенные числовые операции и расширенияПомимо числовых литералов, которые приводятся в табл. 5.1, язык Py
thon предоставляет набор операций для работы с числовыми объектами:
Операторы выражений+
, *, >>, ** и другие.
Встроенные математические функцииpow
, abs и другие.
Вспомогательные модулиrandom
, math и другие.
По мере продвижения мы встретимся со всеми этими компонентами.
Наконец, если вам предстоит заниматься сложными математическими вычислениями, вы можете использовать специализированное расши
рение
NumPy (Numeric Python), которое обеспечивает расширенные возможности при программировании математических вычислений, та
кие как матричный тип, обработка векторов и библиотеки для выпол
нения сложнейших математических вычислений. Группы программи
рования
научных вычислений в таких организациях, как Lawrence
Livermore и NASA, используют Python с расширением NumPy для реализации разнообразных задач, которые раньше решались с помо
щью языков C++, FORTRAN или Matlab.
Изза высокой сложности NumPy мы больше не будем говорить об этом расширении в данной книге. Дополнительные средства поддержки ма
тематических вычислений в языке Python вы найдете на сайте Vaults of Parnassus или выполнив поиск в Сети. Следует также заметить, что в настоящее время расширение NumPy является дополнительным –
оно не входит в состав пакета Python и его необходимо устанавливать отдельно.
В Python 3.0 типы целых чисел и длинных целых будут унифици
рованы. Таким образом, интерпретатор будет поддерживать един
ственный целочисленный тип – тип int. Он будет поддерживать неограниченную точность представления, как это сейчас реализо
вано в длинных целых числах. В связи с этим большинство про
граммистов заметят лишь незначительные изменения или вооб
ще ничего не заметят. Дополнительную информацию вы найдете в примечаниях к выпуску Python 3.0.
Операторы выраженийПожалуй, самой фундаментальной возможностью обработки чисел яв
ляются выражения: комбинации чисел (или других объектов) и опера
торов, которые возвращают значения при выполнении интерпретатором
Python. Выражения в языке Python записываются с использованием обычной математической нотации и символов операторов. Например,
146Глава 5. Числа сложение двух чисел X и Y производится с помощью выражения X + Y,
которое предписывает интерпретатору Python применить оператор +
к значениям с именами X и Y. Результатом выражения X + Y будет дру
гой числовой объект.
В табл. 5.2 приводится перечень всех операторов, имеющихся в языке
Python. Многие из них достаточно понятны сами по себе, например обычные математические операторы (+, , *, / и т. д.). Некоторые будут знакомы тем, кто в прошлом использовал язык C: оператор % вычисля
ет остаток от деления, оператор << производит побитовый сдвиг влево,
оператор & выполняет побитовую операцию и т. д. Другие операторы более характерны для языка Python, и не все имеют математическую природу. Например, оператор is
проверяет идентичность объектов(это более строгая форма проверки на равенство), оператор lambda соз
дает неименованные функции и т. д. О большинстве из этих операто
ров мы еще будем говорить более подробно.
Таблица 5.2. Операторы выражений в языке Python и правила определения старшинстваОператорыОписаниеyield x
Генератор протокола передачи функции (по
явился в версии 2.5)
lambda args: expression
Создает анонимную функцию x if y else z
Трехместный оператор выбора (появился в вер
сии 2.5)
x or y
Логическая операция ИЛИ (значение y вычис
ляется, только если значение x ложно)
x and y
Логический оператор И (значение y вычисляет
ся, только если значение x истинно)
not x
Логическое отрицание x < y,
x <= y, x > y, x > = y,
x == y, x <> y, x != y,
x is y, x is not y, x in y,
x not in y
Операторы сравнения, операторы равенства a
,
операторы проверки идентичности объектов,
операторы проверки вхождения в последова
тельность a
В версии Python 2.5 неравенство значений можно проверить двумя способа
ми, как X != Y или как X <> Y. В Python 3.0 последний вариант будет убран, как избыточный – используйте выражение X != Y для проверки на неравенство.
x | y
Битовая операция ИЛИ
x ^ y
Битовая операция «исключающее ИЛИ» (XOR)
x & y
Битовая операция И
x << y, x >> y
Сдвиг значения x влево или вправо на y битов
x + y, x – y
Сложение/конкатенация, вычитание
Операторы выражений
147Смешанные операторы и определение старшинства операторовКак и в большинстве других языков программирования, в языке Py
thon можно создавать сложные выражения, объединяя несколько опе
раторов из табл. 5.2 в одной инструкции. Например, вычисление сум
мы двух произведений можно записать следующим образом:
A * B + C * D
Как в этом случае интерпретатор узнает, какие операторы должны вы
полняться в первую очередь? Ответ на этот вопрос заключается в
стар+шинстве операторов. Когда интерпретатор Python встречает выраже
ние, содержащее более одного оператора, он делит его на отдельные части в соответствии с
правилами старшинства и определяет поря
док вычисления этих частей выражения. В табл. 5.2 чем выше при
оритет оператора, тем ниже он находится в таблице и тем раньше он выполняется в смешанных выражениях.
Например, если вы запишете выражение X + Y * Z, интерпретатор Py
thon сначала выполнит умножение (Y * Z), а затем прибавит результат к значению X, потому что оператор * имеет более высокий приоритет
(в табл. 5.2 он находится ниже), чем оператор +. Точно так же в первом примере этого раздела сначала будут найдены произведения (A * B и C * D),
а затем будет выполнено сложение.
ОператорыОписаниеx * y, x % y, x / y, x // y
Умножение/повторение, остаток/формат, де
ление a
x, +x, x, x ** y
Унарный знак «минус», тождественность, би
товое дополнение, возведение в степень x[i], x[i:j], x.attr, x(...)
Индексация, извлечение среза, уточнение имени, вызов функции
(...), [...], {...}, `...`
Кортеж, список b
, словарь, преобразование в строку c
a
Операция деления с округлением вниз (X // Y), впервые появившаяся в Py
thon 2.2, всегда усекает дробную часть. Она будет описана в разделе «Деле
ние: классическое, с округлением вниз и истинное».
b
Начиная с версии Python 2.0, с помощью синтаксиса списка ([...])
можно определить либо литерал списка, либо генератор списков. Последняя фор
ма представления подразумевает выполнение цикла и сбор результатов в виде нового списка.
c
Преобразование объектов в соответствующие им строки для вывода на эк
ран также может быть выполнено с помощью более удобочитаемых функ
ций str и repr, которые будут описаны в разделе «Форматы отображения чисел» ниже, в этой же главе. Изза неочевидности выражение `X` плани
руется исключить из Python 3.0, используйте вместо него repr(X).
148Глава 5. Числа
Группировка подвыражений с помощью круглых скобокВы можете навсегда забыть о старшинстве операторов, если будете группировать части выражений с помощью круглых скобок. Когда часть выражения заключается в круглые скобки, они отменяют пра
вила старшинства операторов – Python всегда в первую очередь вычис
ляет подвыражения в круглых скобках, а затем использует их резуль
таты в объемлющем выражении.
Например, выражение X + Y * Z можно записать одним из следующих способов, чтобы вынудить Python произвести вычисления в требуемом порядке:
(X + Y) * Z
X + (Y * Z)
В первом случае сначала будет выполнено сложение значений X и Y, по
тому что это подвыражение заключено в круглые скобки. Во втором случае первой будет выполнена операция умножения (точно так же,
как если бы скобки вообще отсутствовали). Вообще говоря, использо
вание круглых скобок в сложных выражениях можно только привет
ствовать – они не только определяют порядок выполнения вычисле
ний, но и повышают удобочитаемость.