Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 34
Текст из файла (страница 34)
Кроме того,в языке Python имеется множество типов, имеющих отношение к реализации,таких как объекты с компилированным программным кодом, – они представляют интерес скорее для разработчиков инструментов, чем для прикладныхпрограммистов. Все эти типы также будут рассматриваться в последующихчастях книги.Типы объектов, перечисленные в табл. 4.1, обычно называют базовыми, потому что они встроены непосредственно в язык Python, то есть для созданиябольшинства из них используется вполне определенный синтаксис. Например,когда выполняется следующий программный код:>>> ‘spam’то, говоря техническим языком, выполняется выражение-литерал, которое генерирует и возвращает новый строковый объект.
Такова специфика синтаксиса Python создания этого объекта. Похожим образом выражение, заключенноев квадратные скобки, создает список, заключенное в фигурные скобки – словарь и так далее. Хотя, как вы сможете убедиться, в языке Python отсутствуетконструкция объявления типа, сам синтаксис выполняемых выражений задает типы создаваемых и используемых объектов. Фактически выражения, создающие объекты, подобные тем, что представлены в табл. 4.1, в языке Pythonявляются источниками типов.Не менее важно отметить, что как только будет создан объект, он будет ассоциирован со своим собственным набором операций на протяжении всего времени существования – над строками можно будет выполнять только строковыеоперации, над списками – только операции, применимые к спискам.
Как выузнаете далее, в языке Python используется динамическая типизация (типыданных определяются автоматически и их не требуется объявлять в программном коде), но при этом он является языком со строгой типизацией (вы сможетевыполнять над объектом только те операции, которые применимы к его типу).Функционально типы объектов, представленные в табл. 4.1, являются болееуниверсальными и более эффективными, чем может показаться.
Например,вы узнаете, что списки и словари являются достаточно мощными средствамипредставления данных, обеспечивающими поддержку коллекций и функцийпоиска, которые в низкоуровневых языках программирования приходится реализовывать вручную. Говоря коротко, списки обеспечивают поддержку упорядоченных коллекций других объектов, а словари реализуют возможностьхранения объектов по ключам. И списки, и словари могут быть вложенными,по мере необходимости увеличиваться и уменьшаться в размерах и содержатьобъекты любых типов.В последующих главах мы подробно изучим каждый из типов объектов, перечисленных в табл. 4.1.
Но прежде чем углубляться в детали, давайте познакомимся с базовыми типами объектов Python в действии. Оставшаяся частьглавы представляет собой обзор операций, которые мы более подробно будемисследовать в последующих главах. Не следует надеяться, что в этой главебудут даны исчерпывающие объяснения, поскольку основная ее цель состоит125Числав том, чтобы разжечь ваш аппетит и представить некоторые базовые идеи. Однако лучший способ что-то начать – это просто начать, поэтому перейдем сразук программному коду.ЧислаЕсли в прошлом вам приходилось заниматься программированием, некоторыетипы объектов из табл. 4.1 скорее всего покажутся вам знакомыми.
Но дажеесли это не так, числа являются чрезвычайно простым понятием. Базовый набор объектов языка Python включает в себя вполне ожидаемые типы: целыечисла (числа без дробной части), вещественные числа (грубо говоря, числа с десятичной точкой) и более экзотические типы (комплексные числа с мнимойчастью, числа с фиксированной точностью, рациональные числа, представленные парой целых чисел, – числитель и знаменатель дроби, и множества).Несмотря на наличие некоторых необычных типов, базовые числовые типыв языке Python действительно являются базовыми. Числа в Python поддерживают набор самых обычных математических операций. Например, символ«плюс» (+) означает сложение, символ «звездочка» (*) – умножение, а два символа «звездочка» (**) – возведение в степень:>>> 123 + 222# Целочисленное сложение345>>> 1.5 * 4# Умножение вещественных чисел6.0>>> 2 ** 100# 2 в степени 1001267650600228229401496703205376Обратите внимание на результат последней операции: в ���������������������Python��������������� 3.0 целые числа автоматически обеспечивают неограниченную точность для представлениябольших значений (в Python 2.6 для представления больших целых чисел имеется отдельный тип длинных целых чисел).
Например, вы можете попробоватьвычислить 2 в степени 1 000 000 (но едва ли стоит это делать, так как на экранбудет выведено число длиной более 300 000 знаков, что может занять продолжительное время!).>>> len(str(2 ** 1000000)) # Сколько цифр в действительно БОЛЬШОМ числе?301030Начав экспериментировать с вещественными числами, вы наверняка обратитевнимание на то, что на первый взгляд может показаться странным:>>> 3.1415 * 2# repr: как программный код6.2830000000000004>>> print(3.1415 * 2) # str: более дружественный формат6.283Первый результат – это не ошибка, проблема здесь связана с отображением.Оказывается, вывести содержимое любого объекта можно двумя способами:с полной точностью (как в первом результате), и в форме, более удобной для восприятия человеком (как во втором результате).
Формально первая форма называется repr (объект в виде программного кода), а вторая, более дружественнаяк пользователю, – str. Различия между ними станут более понятны, когда мыприступим к изучению классов, а пока, если что-то выглядит непонятным, попробуйте вывести тот же результат с помощью инструкции print.126Глава 4. Введение в типы объектов языка PythonПомимо выражений для выполнения операций с числами в составе Python естьнесколько полезных модулей:>>> import math>>> math.pi3.1415926535897931>>> math.sqrt(85)9.2195444572928871Модуль math содержит более сложные математические функции, а модуль randomреализует генератор случайных чисел и функцию случайного выбора (в данномслучае из списка, о котором будет рассказываться ниже, в этой же главе):>>> import random>>> random.random()0.59268735266273953>>> random.choice([1, 2, 3, 4])1Кроме того, Python включает в себя более экзотические числовые объекты, такие как комплексные числа, числа с фиксированной десятичной точкой и рациональные числа, множества и логические значения, а среди свободно распространяемых расширений можно найти и другие числовые типы (например,матрицы и векторы).
Обсуждение этих типов будет приводиться далее в этойкниге.Пока что мы использовали Python как простой калькулятор, но чтобы иметьбольшую возможность судить о встроенных типах, перейдем к строкам.СтрокиСтроки используются для записи текстовой информации, а также произвольных последовательностей байтов. Это наш первый пример последовательностей, или упорядоченных коллекций других объектов, в языке Python. Последовательности поддерживают порядок размещения элементов, которые онисодержат, слева направо: элементы сохраняются и извлекаются исходя из ихпозиций в последовательностях.
Строго говоря, строки являются последовательностями односимвольных строк. Другими типами последовательностейявляются списки и кортежи (будут описаны ниже).Операции над последовательностямиБудучи последовательностями, строки поддерживают операции, предполагающие определенный порядок позиционирования элементов. Например, еслиимеется четырехсимвольная строка, то с помощью встроенной функции lenможно определить ее длину, а отдельные элементы строки извлечь с помощьювыражений индексирования:>>>>>>4>>>‘S’>>>‘p’S = ‘Spam’len(S)# ДлинаS[0]# Первый элемент в S, счет начинается с позиции 0S[1]# Второй элемент слева127СтрокиВ языке Python индексы реализованы в виде смещений от начала и потомуиндексация начинается с 0: первый элемент имеет индекс 0, второй – 1 и такдалее.Обратите внимание, как в этом примере выполняется присваивание строкипеременной с именем S.
Подробнее сам процесс присваивания мы будем рассматривать позднее (в частности, в главе 6), а пока хочу отметить, что в языке Python не требуется объявлять переменные заранее. Переменная создаетсяв тот момент, когда ей присваивается значение, при этом переменной можноприсвоить значение любого типа, а при использовании внутри выражения имяпеременой замещается ее фактическим значением.
Кроме того, прежде чемпоявится возможность обратиться к переменной, ей должно быть присвоенокакое-либо значение. Но пока вам достаточно помнить – чтобы сохранить объект для последующего использования, его нужно присвоить переменной.В языке Python предусмотрена возможность индексации в обратном порядке,от конца к началу – положительные индексы откладываются от левого концапоследовательности, а отрицательные – от правого:>>> S[-1]‘m’>>> S[-2]‘a’# Последний элемент в конце S# Второй элемент с концаФормально отрицательные индексы просто складываются с длиной строки,поэтому следующие две операции эквивалентны (хотя первая форма записивыглядит проще и понятнее):>>> S[-1]‘m’>>> S[len(S)-1]‘m’# Последний элемент в S# Отрицательная индексация, более сложный способПримечательно, что внутри квадратных скобок допускается использовать нетолько жестко заданные числовые литералы, но и любые другие выражения –везде, где Python ожидает получить значение, можно использовать литералы,переменные или любые выражения.