М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 33
Текст из файла (страница 33)
Числа в 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 ожидает получить значение, можно использовать литералы,переменные или любые выражения.
Весь синтаксис языка Python следует этому общему принципу.В дополнение к простой возможности индексирования по номеру позиции, последовательности поддерживают более общую форму индексирования, известную как получение среза (slicing), которая обеспечивает возможность извлечения за одну операцию целого сегмента (среза).
Например:>>> S‘Spam’>>> S[1:3]‘pa’# Строка из 4 символов# Срез строки S начиная со смещения 1 и до 2 (не 3)Проще всего можно представить себе срез как способ извлечения целого столбца из строки за один шаг. В общем виде синтаксис операции получения срезавыглядит как: X[I:J], и означает: «извлечь из X все, начиная со смещения I и досмещения J, но не включая его». В качестве результата возвращается новыйобъект. Например, последняя операция из примера выше вернет все символыстроки S со смещениями с 1 по 2 (то есть 3 – 1 символов) в виде новой строки.В результате получается срез, или «выборка» двух символов из середины.128Глава 4. Введение в типы объектов языка PythonПри выполнении операции получения среза левая граница по умолчанию принимается равной нулю, а правая – длине последовательности, к которой применяется операция. В результате мы получаем следующие наиболее распространенные варианты использования:>>> S[1:]‘pam’>>> S‘Spam’>>> S[0:3]‘Spa’>>> S[:3]‘Spa’>>> S[:-1]‘Spa’>>> S[:]‘Spam’# Все, кроме первого элемента (1:len(S))# Сама строка S без изменений# Все, кроме последнего элемента# То же, что и S[0:3]# Еще раз все, кроме последнего элемента, но проще (0:-1)# Все содержимое S, как обычная копия (0:len(S))Обратите внимание, что в качестве границ срезов можно использовать отрицательные индексы и что последняя операция фактически создает копию всейстроки.
Как мы узнаем позднее, нет смысла копировать строки таким способом, но такая форма копирования очень удобна при работе с другими последовательностями, такими как списки.Наконец, будучи последовательностями, строки поддерживают операцию конкатенации, которая записывается в виде знака плюс (объединение двух строкв одну строку), и операцию повторения (новая строка создается за счет многократного повторения другой строки):>>> S‘Spam’>>> S + ‘xyz’# Конкатенация‘Spamxyz’>>> S# S остается без изменений‘Spam’>>> S * 8# Повторение‘SpamSpamSpamSpamSpamSpamSpamSpam’Обратите внимание, что знак плюс (+) имеет различное значение для разныхобъектов: для чисел – сложение, а для строк – конкатенация. Это универсальное свойство языка Python, которое далее в книге будет называться полиморфизмом, означает, что фактически выполняемая операция зависит от объектов, которые принимают в ней участие.
Как будет показано, когда мы приступим к изучению динамической типизации, такой полиморфизм в значительной степени обеспечивает выразительность и гибкость программного кода наязыке Python. Поскольку отсутствуют ограничения, связанные с типами, операции в языке Python обычно в состоянии автоматически обрабатывать объекты самых разных типов, при условии, что они поддерживают совместимый интерфейс (как в данном случае операция +). В языке Python идея полиморфизмаявляется ключевой концепцией, которую мы будем рассматривать далее в этойкниге.НеизменяемостьОбратите внимание: в предыдущих примерах ни одна из использованных операций не изменяла оригинальную строку. Все операции над строками в ре-129Строкизультате создают новую строку, потому что строки в языке Python являютсянеизменяемыми – после того, как строка будет создана, ее нельзя изменить.Например, вы не сможете изменить строку присвоением значения одной из еепозиций, но вы всегда можете создать новую строку и присвоить ей то же самоеимя.
Поскольку Python очищает память, занятую ненужными больше объектами (как будет показано позднее), такой подход не так уж неэффективен, какмогло бы показаться на первый взгляд:>>> S‘Spam’>>> S[0] = ‘z’# Неизменяемые объекты нельзя изменить...текст сообщения об ошибке опущен...TypeError: ‘str’ object does not support item assignment>>> S = ‘z’ + S[1:] # Но с помощью выражений мы можем создавать новые объекты>>> S‘zpam’Все объекты в языке Python либо относятся к классу неизменяемых, либо нет.Если говорить о базовых типах, то числа, строки и кортежи являются неизменяемыми, а списки и словари – нет (они легко могут изменяться в любой своейчасти).
Помимо всего неизменяемость может рассматриваться как гарантия,что некоторый объект будет оставаться постоянным на протяжении работыпрограммы.Методы, специфичные для типаВсе строковые операции, которые мы до сих пор рассматривали, в действительности являются операциями над последовательностями, то есть эти операции могут использоваться для работы с любыми последовательностями языкаPython, включая списки и кортежи.