Лутц М. - Изучаем Python (1077325), страница 43
Текст из файла (страница 43)
° Если границы не указаны, по умолчанию они принимаются равными О и длине последовательности. ° Выражение 8[1: 3] извлекает элементы со смещениями от 1 до 3 (не включая элемент со смещением 3). 194 Глава 7. Строки ° Выражение 8[1; ] извлекает элементы, начиная со смещения 1 и до конца (длина последовательности). ° Выражение 8[: 3] извлекает элементы, начиная со смещения О и до 3 (не включая его).
° Выражение 8[: -1] извлекает элементы, начиная со смещения О и до последнего (не включая его). ° Выражение 8[: ] извлекает элементы, начиная со смещения О и до конца — это эффективный способ создать поверхностную копию последовательности 8. Последний пункт списка — это самый обычный трюк: с его помощью создается полная поверхностная копия объекта последовательности, то есть объект с тем же значением, но расположенный в другой области памяти (подробнее о копировании объектов рассказывается в главе 9). Этот прием не очень полезен при работе с неизменяемыми объектами, такими как строки, но его ценность возрастает при работе с объектами, которые могут изменяться, — такими как списки.
В следующей главе вы узнаете, что синтаксис операции доступа к элементам последовательности по смещениям (квадратные скобки) также применим для доступа к элементам словарей по ключам — операции выглядят одинаково, но имеют разную интерпретацию. Расширенная операция извлечения подстроки: третий предел В версии Рус)топ 2.3 в операцию извлечения подстроки была добавлена поддержка необязательного третьего индекса, используемого как шаг (иногда называется как шаг по индексу). Величина шага добавляется к индексу каждого извлекаемого элемента. Полная форма записи операции извлечения подстроки теперь выглядит так: Х[1:,): К]. Она означает: «Извлечь все элементы последовательности Х, начиная со смещения 1, вплоть до смещения З-1, с шагом К».
Третий предел, К, по умолчанию имеет значение 1, именно по этой причине в обычной ситуации извлекаются все элементы среза, слева направо. Однако, если явно указать значение третьего предела, его можно использовать, чтобы пропустить некоторые элементы или полностью изменить их порядок. Например, выражение Х[1: 1сп 2] вернет каждый второй элемент последовательности Х в диапазоне смещений от 1 до 9 — то есть будут выбраны элементы со смещениями 1, 3, 5, 7 и 9. Как правило, по умолчанию первый и второй пределы принимают значения О и длину последовательности соответственно, поэтому выражение Х[::2] вернет каждый второй элемент от начала и до конца последовательности: »> 8 = 'еЬссетзЬЦК1еооР' »> З[1.'10; 2) 'ость!' »> 3[.':2) 'асе0[кео' Строки в действии Можно также использовать отрицательное значение шага. Например, выражение "Пе11о" (::-1) вернет новую строку "о!1ео".
Здесь первые две границы получают значения по умолчанию — О и длина последовательности, а величина шага, равная -1, указывает, что срез должен быть выбран в обратном порядке — справа налево, а не слева направо. В результате получается переверн утал последовательность: »> 8 = нпе11о' >» 8(;.-11 'о1!ео' При использовании отрицательного шага порядок применения первых двух границ меняется на противоположный. Ч'о есть выражение 5(5: 1: -1] извлечет элемент со 2 по б в обратном порядке (результат будет содержать элементы последовательности со смещениями б, 4, 3 и 2): »> 8 = 'аэробус' »> 8(8:1:-11 'тоес Пропуск элементов и изменение порядка их следования — это наиболее типичные случаи использования операции получения среза с тремя пределами.
За более подробной информацией вам следует обратиться к руководству по стандартной библиотеке языка РусЬоп или поэкспериментировать в интерактивной оболочке — это расширит ваши представления о срезах по сравнению с объемом, который мы можем охватить здесь. Мы еще вернемся к операции получения среза с тремя пределами далее в этой книге, когда будем рассматривать ее в соединении с оператором цикла То г.
Инструменты преобразования строк Один из девизов языка РуФЬоп — не поддаватьея искушению предполагать, что имелось в виду. Например, Ру1Ьоп не позволит сложить строку и число, даже если строка выглядит как число (то есть содержит только цифры): »> "42" ь 1 турееггог саппот сопсатепате 'зтг' апо 'тпт' оо1еств (Туребггог, невозможно обьеднннть обьекты 'зтг' н ьпт') В соответствии с архитектурой языка оператор ь может означать и операцию сложения, и операцию конкатенации, вследствие чего выбор типа преобразования становится неочевидным. Поэтому интерпретатор воспринимает такую инструкцию как ошибочную. Вообще в языке Ру(Ьоп отвергается любая магия, которая может осложнить жизнь программиста.
Как же быть, если сценарий получает число в виде текстовой строки из файла или от пользовательского интерфейса2 В этом случае следует использовать инструменты преобразования, чтобы можно было интерпретировать строку как число или наоборот. Например: 196 Глава 7 Строки а Преобразование в/из строки »> 1пт("42"), втг(42) (42, '42') »> гврг(42), '42' ('42', '42') а Преобразование в строку, как если бы она била а программнмм кодом >» 8 = "42" »> 1 = 1 »> 8 + 1 турееггог: саппот сопсатепатв 'втг' апс '1пт' сь)естз »> 1пт(8) + 1 а Операция словения 43 »> 8 + втг(1) а Операция конкатенации '421 ' Придется держать в уме: срезы Повсюду в этой книге я буду включать аналогичные врезки с описанием наиболее типичных случаев использования рассматриваемых особенностей языка на практике.
Поскольку у вас нет возможности осознать реальный потенциал языка, пока вы не увидите большую часть картины, эти врезки будут содержать множество упоминаний тем, незнакомых для вас. Поэтому вам следует воспринимать эти сведения как предварительное знакомство со способами, которые связывают абстрактные концепции языка срешением наиболее распространенных задач программирования. Например, далее вы увидите, что аргументы командной строки, переданные сценарию на языке Ру1)топ при запуске, доступны в виде атрибута а гг)у встроенного модуля вую Функция (пт преобразует строку в число, а функция атг преобразует число в строковое представление (по сути — в то, что выводится на экран). Функция герт и прежний ее эквивалент, обратные апострофы, также преобразуют объект в строковое представление, но они возвращают объект в виде строки программного кода, который можно выполнить, чтобы воссоздать объект (если объект — строка, то результат, выведенный инструкцией рг(пт, будет включать кавычки, окружающие строку).
Подробнее о различиях между функциями в(г и герт можно прочитать во врезке «Форматы представления герг и в(г«, в главе 5. Кроме того, функции 1пт и в( г изначально предназначены для выполнения преобразований. Вьт не сможете смешивать строковые и числовые типы в таких операторах, как «, но вы можете вручную выполнить необходимые преобразования операндов перед выполнением операции: Строки в действии 197 4 Е11е еспо.су 1арогт вув ргтпт вув.агрч % рутпоп вспо.ру -а -Ь -с ['ессо.ру', '-а', '-Ь', '-с'] Обычно вас будут интересовать только параметры, которые следуют за именем программы. Это приводит нас к типичному использованию операции получения среза (или, что то же самое, извлечения подстроки): мы можем с помощью единственной инструкции получить все элементы списка, за исключением первого.
В данном случае выражение вув, агру[1: ] вернет требуемый список ['-а', '-Ь', '-с']. После этого список можно обрабатывать по своему усмотрению, не заботясь о присутствии имени программы в начале. Кроме того, операция получения среза часто используетея для удаления лишних символов из строк, считываемых из файлов. Ксли известно, что строки всегда завершаются символом новой строки (символ тп), его можно удалить одним-единственным выражением — 11пе[: -1], которое возвращает все символы строки, кроме последнего (нижняя граница по умолчанию принимаетея равной 0). В обоих случаях операция извлечения подстроки обеспечивает логику выполнения, которую в низкоуровневых языках программирования пришлось бы реализовывать явно.
Обратите внимание: для удаления символа новой строки часто предпочтительнее использовать функцию 11пе гвтгтр, потому что она не повреждает строки, в которых отсутствует символ новой строки в конце, — типичный случай при создании текстовых файлов некоторыми текстовыми редакторами. Операция извлечения подстроки применима, только если вы полностью уверены, что строки завершаются корректным образом.
Существуют похожие встроенные функции для преобразования чисел с плавающей точкой в/из строки: »> втг(3.1415), (1оат("1.5") ('3.1415', 1.5) »> тахт "- "1.2345-10" »> т)оат(техт) 1. 2340000000000001в-010 Позднее мы познакомимся со встроенной функцией еча1 — она выполняет строку, содержащую программный код на языке Ру()топ, и потому может выполнять преобразование строки в объект любого вида.