Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 54
Текст из файла (страница 54)
Однако не менее важно и то, чтодинамическая типизация составляет основу полиморфизма – концепции, ко-В заключение205торая была введена в главе 4 и к которой мы еще вернемся далее в этой книге, – в языке Python. Поскольку мы не ограничены применением типов в программном коде на языке Python, он обладает очень высокой гибкостью. Какбудет показано далее, при правильном использовании динамической типизации и полиморфизма можно создавать такой программный код, который автоматически будет адаптироваться под новые требования в ходе развития вашейсистемы.В заключениеВ этой главе мы подробно рассмотрели модель динамической типизации в языке Python, то есть способ, который используется интерпретатором для автоматического хранения информации о типах объектов и избавляет нас от необходимости вставлять код объявлений в наши сценарии.
Попутно мы узнали, какреализована связь между переменными и объектами. Кроме того, мы исследовали понятие сборки мусора, узнали, как разделяемые ссылки на объекты могут оказывать воздействие на несколько переменных и как ссылки влияют напонятие равенства в языке Python.Поскольку в языке Python имеется всего одна модель присваивания, и она используется повсюду в этом языке, очень важно, чтобы вы разобрались в ней,прежде чем двигаться дальше. Контрольные вопросы к этой главе должны помочь вам повторить некоторые идеи этой главы. После этого в следующей главемы возобновим наш обзор объектов, приступив к изучению строк.Закрепление пройденногоКонтрольные вопросы1.
Взгляните на следующие три инструкции. Изменится ли значение переменной A?A = “spam”B = AB = “shrubbery”2. Взгляните на следующие три инструкции. Изменится ли значение переменной A?A = [“spam”]B = AB[0] = “shrubbery”3. А что можно сказать об этом случае? Изменится ли значение переменной A?A = [“spam”]B = A[:]B[0] = “shrubbery”Ответы1. Нет, значением переменной A по-прежнему будет строка ‘spam’. Когда переменной B присваивается строка ‘shrubbery’, она просто начинает указыватьна другой строковый объект. Первоначально переменные A и B разделяют206Глава 6. Интерлюдия о динамической типизации(то есть ссылаются, или указывают) один и тот же строковый объект со значением ‘spam’, но в языке Python два имени никак не связаны между собой.Таким образом, назначение переменной B ссылки на другой объект не оказывает влияние на переменную A.
То же самое было бы справедливо, еслибы последняя инструкция имела вид B = B + ‘shrubbery’, так как операцияконкатенации создает в результате новый объект, ссылка на который затемзаписывается в переменную B. Мы не можем изменять сами строковые объекты (или числа, или кортежи), потому что они относятся к категории неизменяемых объектов.2.
Да, теперь значением переменной A будет [“shrubbery”]. Формально мы неизменили ни одну из переменных, ни A, ни B, но мы изменили часть самогообъекта, на который они ссылаются (указывают), посредством переменнойB. Поскольку A ссылается на тот же самый объект, что и B, изменения можнообнаружить и с помощью переменной A.3. Нет, значением переменной A по-прежнему будет список [‘spam’].
Изменениесамого объекта с помощью ссылки B не оказывает влияния на переменнуюA по той причине, что выражение получения среза создает копию объектасписка, прежде чем присвоить ссылку переменной B. После второго оператора присваивания в программе будет существовать два разных объекта списков с одинаковыми значениями (в языке Python мы говорим: «равны, ноне эквивалентны»). Третья инструкция изменяет значение объекта списка,на который ссылается переменная B, а объект, на который ссылается переменная A, остается неизменным.Глава 7.СтрокиСледующий основной тип на пути нашего иcследования встроенных объектовязыка Python – это строки, упорядоченные последовательности символов, используемые для хранения и представления текстовой информации.
Мы коротко познакомились со строками в главе 4. Здесь мы займемся более глубокимих исследованием и восполним некоторые подробности, которые ранее былиопущены.С функциональной точки зрения строки могут использоваться для представления всего, что только может быть выражено в текстовой форме: символыи слова (например, ваше имя), содержимое текстовых файлов, загруженныхв память, адреса в Интернете, программы на языке Python и так далее. Онимогут также использоваться для хранения двоичных значений байтов и символов Юникода.Возможно, вам уже приходилось использовать строки в других языках программирования. Строки в языке Python играют ту же роль, что и массивысимволов в языке C, но они являются инструментом более высокого уровня,нежели простой массив символов.
В отличие от C, строки в языке Python обладают мощным набором средств для их обработки. Кроме того, в отличие оттаких языков, как C, в языке Python отсутствует специальный тип для представления единственного символа, поэтому в случае необходимости используются односимвольные строки.Строго говоря, строки в языке Python относятся к категории неизменяемыхпоследовательностей, в том смысле, что символы, которые они содержат, имеют определенный порядок следования слева направо и сами строки невозможно изменить. Фактически строки – это первый представитель большого классаобъектов, называемых последовательностями, которые мы будем здесь изучать. Обратите особое внимание на операции над последовательностями, представленные в этой главе, так как они похожим образом работают и с другимитипами последовательностей, такими как списки и кортежи, которые мы будем рассматривать позже.В табл. 7.1 приводятся наиболее типичные литералы строк и операций, которые обсуждаются в этой главе.
Пустые строки записываются как пара ка-208Глава 7. Строкивычек (или апострофов), между которыми ничего нет; и существуют различные способы записи строк в программном коде. Для работы со строками поддерживаются операции выражений, такие как конкатенация (объединениестрок), выделение подстроки, выборка символов по индексам (по смещению отначала строки) и так далее.
Помимо выражений язык Python предоставляетряд строковых методов, которые реализуют обычные задачи работы со строками, а также модули для решения более сложных задач обработки текста,таких как поиск по шаблону. Все эти инструменты будут рассматриваться далее в этой же главе.Таблица 7.1. Наиболее типичные литералы строк и операцииОперацияИнтерпретацияS = ‘’Пустая строкаS = “spam’s”Строка в кавычкахS = ‘s\np\ta\x00m’Экранированные последовательностиblock = “””...”””Блоки в тройных кавычкахS = r’\temp\spam’Неформатированные строкиS = b’spam’Строки байтов в версии 3.0 (глава 36)S = u’spam’Строки с символами Юникода.Только в версии 2.6 (глава 36)S1 + S2Конкатенация, повторениеS * 3S[i]S[i:j]Обращение к символу по индексу, извлечениеподстроки (среза), длинаlen(S)“a %s parrot” % kindВыражение форматирования строки“a {0} parrot”.format(kind)Строковый метод форматирования в 2.6 и 3.0S.find(‘pa’)Вызов строкового метода: поискS.rstrip()Удаление ведущих и конечных пробельныхсимволовS.replace(‘pa’, ‘xx’)ЗаменаS.split(‘,’)Разбиение по символу-разделитлюS.isdigit()Проверка содержимогоS.lower()Преобразование регистра символовS.endswith(‘spam’)Проверка окончания строки‘spam’.join(strlist)Сборка строки из спискаS.encode(‘latin-1’)Кодирование строк Юникода209ОтветыОперацияИнтерпретацияfor x in S: print(x)Обход в цикле, проверка на вхождение‘spam’ in S[c * 2 for c in S]map(ord, S)Помимо базового набора инструментов для работы со строками Python такжеподдерживает более сложные приемы обработки строк, основанные на применении шаблонов, с помощью библиотечного модуля re (regular expression –регулярные выражения), о котором говорилось в главе 4, а кроме того, такиевысокоуровневые инструменты обработки текста, как парсеры XML, которыебудут коротко представлены в главе 36.
Однако основное внимание в этой книге будет уделено базовым операциям над строками, перечисленным в табл. 7.1.Данная глава начинается с краткого обзора форм строковых литералов и базовых строковых выражений, затем мы перейдем к более сложным инструментам, таким как методы строк и форматирование. В состав Python входитмножество инструментов для работы со строками, но здесь мы не будем рассматривать все, что доступно, – полное описание приводится в справочном руководстве по стандартной библиотеке Python������������������������������������������������������������������. Наша цель – исследовать наиболее часто используемые инструменты, чтобы получить достаточно полноепредставление об имеющихся возможностях. Методы, которые мы не будемрассматривать здесь, по своему использованию очень напоминают те, что рассматриваются.Примечание по существу: Строго говоря, в этой главе рассматривается лишь часть возможностей Python для работы со строками – тот набор, знание которого необходимо большинствупрограммистов.