Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 58
Текст из файла (страница 58)
Однакоесли явно указать значение третьего предела, его можно использовать, чтобыпропустить некоторые элементы или полностью изменить их порядок.Например, выражение X[1:10:2] вернет каждый второй элемент последовательности X в диапазоне смещений от 1 до 9 – то есть будут выбраны элементы сосмещениями 1, 3, 5, 7 и 9. Как правило, по умолчанию первый и второй пределы принимают значения 0 и длину последовательности соответственно, поэтому выражение X[::2] вернет каждый второй элемент от начала и до конца последовательности:>>> S = ‘abcdefghijklmnop’>>> S[1:10:2]‘bdfhj’>>> S[::2]‘acegikmo’Можно также использовать отрицательное значение шага. Например, выражение “hello”[::-1] вернет новую строку “olleh”.
Здесь первые две границы получают значения по умолчанию – 0 и длина последовательности, а величинашага, равная -1, указывает, что срез должен быть выбран в обратном порядке – справа налево, а не слева направо. В результате получается перевернутаяпоследовательность:>>> S = ‘hello’>>> S[::-1]‘olleh’При использовании отрицательного шага порядок применения первых двухграниц меняется на противоположный. То есть выражение S[5:1:-1] извлечетэлемент со 2 по 5 в обратном порядке (результат будет содержать элементы последовательности со смещениями 5, 4, 3 и 2):>>> S = ‘abcedfg’>>> S[5:1:-1]‘fdec’222Глава 7. СтрокиПропуск элементов и изменение порядка их следования – это наиболее типичные случаи использования операции получения среза с тремя пределами.
Заболее подробной информацией вам следует обратиться к руководству по стандартной библиотеке языка Python (или поэкспериментировать в интерактивной оболочке). Мы еще вернемся к операции получения среза с тремя пределами далее в этой книге, когда будем рассматривать ее в соединении с операторомцикла for.Далее в этой книге мы также узнаем, что операция извлечения среза эквивалентна операции индексирования, в которой в качестве индекса используетсяспециальный объект среза, что очень важно для разработчиков классов, которым требуется реализовать поддержку обеих операций:>>> ‘spam’[1:3]# Синтаксис извлечения среза‘pa’>>> ‘spam’[slice(1, 3)] # используется объект среза‘pa’>>> ‘spam’[::-1]‘maps’>>> ‘spam’[slice(None, None, -1)]‘maps’Придется держать в уме: срезыПовсюду в этой книге я буду включать аналогичные врезки с описаниемнаиболее типичных случаев использования рассматриваемых особенностей языка на практике.
Поскольку у вас нет возможности осознатьреальные возможности языка, пока вы не увидите большую часть картины, эти врезки будут содержать множество упоминаний тем, незнакомых для вас. Поэтому вам следует воспринимать эти сведения как предварительное знакомство со способами, которые связывают абстрактныеконцепции языка с решением наиболее распространенных задач программирования.Например, далее вы увидите, что аргументы командной строки, переданные сценарию на языке Python при запуске, доступны в виде атрибута argv встроенного модуля sys:# File echo.pyimport sysprint sys.argv% python echo.py -a -b -c[‘echo.py’, ‘-a’, ‘-b’, ‘-c’]Обычно вас будут интересовать только параметры, которые следуют заименем программы. Это приводит нас к типичному использованию операции получения среза: мы можем с помощью единственной инструкции получить все элементы списка, за исключением первого.
В данномслучае выражение sys.argv[1:] вернет требуемый список [‘-a’, ‘-b’, ‘-c’].После этого список можно обрабатывать по своему усмотрению, не заботясь о присутствии имени программы в начале.Строки в действии223Кроме того, операция получения среза часто используется для удалениялишних символов из строк, считываемых из файлов. Если известно,что строки всегда завершаются символом новой строки (символ \n), егоможно удалить одним-единственным выражением – line[:-1], котороевозвращает все символы строки, кроме последнего (нижняя граница поумолчанию принимается равной 0).
В обоих случаях операция извлечения подстроки обеспечивает логику выполнения, которую в низкоуровневых языках программирования пришлось бы реализовывать явно.Обратите внимание, что для удаления символа новой строки часто предпочтительнее использовать метод line.rstrip, потому что он не повреждает строки, в которых отсутствует символ новой строки в конце, – типичный случай при создании текстовых файлов некоторыми текстовымиредакторами. Операция извлечения подстроки применима, только есливы полностью уверены, что строки завершаются корректным образом.Инструменты преобразования строкОдин из девизов языка Python – не поддаваться искушению делать предположения о том, что имелось в виду. Например, Python не позволит сложитьстроку и число, даже если строка выглядит как число (то есть содержит толькоцифры):>>> “42” + 1TypeError: cannot concatenate ‘str’ and ‘int’ objectsВ соответствии с архитектурой языка оператор + может означать и операциюсложения, и операцию конкатенации, вследствие чего выбор типа преобразования становится неочевидным.
Поэтому интерпретатор воспринимает такуюинструкцию как ошибочную. Вообще в языке Python отвергается любая магия, которая может осложнить жизнь программиста.Как же быть, если сценарий получает число в виде текстовой строки из файлаили от пользовательского интерфейса? В этом случае следует использовать инструменты преобразования, чтобы можно было интерпретировать строку какчисло или наоборот. Например:>>> int(“42”), str(42) # Преобразование из/в строки(42, ‘42’)>>> repr(42),# Преобразование в строку, как если бы она была‘42’# литералом в программном кодеФункция int преобразует строку в число, а функция str преобразует числов строковое представление (по сути – в то, что выводится на экран). Функцияrepr (и прежний ее эквивалент, обратные апострофы, который был удаленв Python 3.0) также преобразует объект в строковое представление, но возвращает объект в виде строки программного кода, который можно выполнить,чтобы воссоздать объект.
Если объект – строка, то инструкция print выведеткавычки, окружающие строку:>>> print(str(‘spam’), repr(‘spam’))(‘spam’, “’spam’”)224Глава 7. СтрокиПодробнее о различиях между функциями str и repr можно прочитать во врезке «Форматы представления repr и str», в главе 5. Кроме того, функции intи str изначально предназначены для выполнения преобразований.Вы не сможете смешивать строковые и числовые типы в таких операторах, как+, но вы можете вручную выполнить необходимые преобразования операндовперед выполнением операции:>>> S = “42”>>> I = 1>>> S + ITypeError: cannot concatenate ‘str’ and ‘int’ objects>>> int(S) + I43# Операция сложения>>> S + str(I)‘421’# Операция конкатенацииСуществуют похожие встроенные функции для преобразования вещественныхчисел в/из строки:>>> str(3.1415), float(“1.5”)(‘3.1415’, 1.5)>>> text = “1.234E-10”>>> float(text)1.2340000000000001e-010Позднее мы познакомимся со встроенной функцией eval – она выполняет строку, содержащую программный код на языке Python, и потому может выполнять преобразование строки в объект любого вида.
Функции int и float преобразуют только числа, но это ограничение означает, что они обычно выполняютэту работу быстрее (и безопаснее, потому что они не принимают программныйкод произвольного выражения). Как было показано в главе 5, выражение форматирования строки также обеспечивает возможность преобразования чиселв строки. Форматирование будет обсуждаться ниже, в этой же главе.Преобразование кодов символовИмеется также возможность выполнить преобразование одиночного символав его целочисленный код ASCII, для чего нужно передать этот символ функции ord – она возвращает фактическое числовое значение соответствующегобайта в памяти. Обратное преобразование выполняется с помощью функцииchr, она получает целочисленный код ASCII и преобразует его в соответствующий символ:>>> ord(‘s’)115>>> chr(115)‘s’Эти функции можно применить ко всем символам строки в цикле.
Они могуттакже использоваться для реализации своего рода строковой математики. Например, чтобы получить следующий по алфавиту символ, его можно преобразовать в число и выполнить математическое действие над ним:Строки в действии>>>>>>>>>‘6’>>>>>>‘7’225S = ‘5’S = chr(ord(S) + 1)SS = chr(ord(S) + 1)SСледующий пример преобразования представляет собой альтернативу встроенной функции int, по крайней мере для односимвольных строк, для преобразования строки в целое число:>>> int(‘5’)5>>> ord(‘5’) - ord(‘0’)5Такие преобразования могут использоваться в сочетании с операторами цикла,представленными в главе 4 и подробно рассматриваемыми в следующей частикниги, для получения целочисленных значений из строковых представленийдвоичных чисел.
В каждой итерации текущее значение умножается на 2 и затем к нему прибавляется числовое значение следующей цифры:>>>>>>>>>.........>>>13B = ‘1101’# Двоичные цифры преобразуются в числа с помощью функции ordI = 0while B != ‘’:I = I * 2 + (ord(B[0]) - ord(‘0’))B = B[1:]IОперация побитового сдвига влево (I << 1) могла бы дать тот же эффект, чтои операция умножения на 2. Но так как мы еще не познакомились с цикламии уже видели встроенные функции int и bin в главе 5, которые могут использоваться в задачах преобразования двоичных чисел в Python 2.6 и 3.0, то жесамое можно реализовать, как показано ниже:>>> int(‘1101’, 2) # Преобразовать двоичное представление в целое число13>>> bin(13)# Преобразовать целое число в двоичное представление‘0b1101’С течением времени язык Python��������������������������������������������������������������������������������������стремится автоматизировать решение наиболее типичных задач!Изменение строкПомните термин «неизменяемая последовательность»? Слово «неизменяемая»означает, что вы не можете изменить содержимое самой строки в памяти (то естьневозможно изменить элемент строки, выполнив присваивание по индексу):>>> S = ‘spam’>>> S[0] = “x”Возникает ошибка!226Глава 7.