Пример 2.1 — это простая программа на языке Python, но в ней представлены три важные темы, заслуживающие краткого упоминания: она использует строковые методы, осуществляет чтение из файла и предусматривает возможность импортирования или выполнения как самостоятельного сценария. Строковые методы в языке Python как таковые не являются системными инструментами, но их можно встретить в большинстве программ на языке Python. В действительности они будут постоянно встречаться на протяжении этой и последующих глав, поэтому коротко рассмотрим наиболее полезные инструменты, имеющиеся в наборе. В число строковых методов входят вызовы для поиска и замены:
>>> mystr = ‘xxxSPAMxxx’
>>> mystr.find(‘SPAM’) # вернет индекс первого вхождения
3
>>> mystr = ‘xxaaxxaa’
>>> mystr.replace(‘aa’, ‘SPAM’) # замена всех вхождений ‘xxSPAMxxSPAM’
Вызов метода find возвращает смещение первого вхождения подстроки, а метод replace осуществляет глобальный поиск и замену. Как и все строковые операции, метод replace возвращает новую строку, оставляя исходную строку неизменной (напомню, что строки являются неизменяемыми объектами). Для всех этих методов подстроки являются просто строками; в главе 19 будет представлен модуль re, который позволяет использовать шаблоны регулярных выражений при поиске и замене.
В самых последних версиях Python имеется возможность использовать оператор in определения принадлежности, как альтернативу методу find, когда необходимо всего лишь получить ответ «да» или «нет» (он проверяет присутствие подстроки в строке). Существует также несколько методов, удаляющих пробельные символы из концов строки, что особенно полезно при работе с текстовыми строками, извлекаемыми из файла:
>>> mystr = ‘xxxSPAMxxx’
>>> ‘SPAM’ in mystr # проверка присутствия подстроки в строке
True
>>> ‘Ni’ in mystr # если подстрока отсутствует
False
>>> mystr.find(‘Ni’)
> 1
> >> mystr = ‘\t Ni\n’
> >> mystr.strip() # удалит пробельные символы
‘Ni’
>>> mystr.rstrip() # то же самое, но только с правого конца
‘\t Ni’
Среди строковых методов имеются также функции, которые могут быть полезны, например, как инструменты преобразования регистра символов, а кроме того, в стандартной библиотеке имеется модуль string, определяющий некоторые полезные константы:
>>> mystr = ‘SHRUBBERY’
>>> mystr.lower()
‘shrubbery’
>>> mystr.isalpha()
True
>>> mystr.isdigit()
False
>>> import string # константы, например, для использования в ‘in’
>>> string.ascii_lowercase
‘abcdefghijklmnopqrstuvwxyz’
>>> string.whitespace # пробельные символы
‘ \t\n\r\x0b\x0c’
Существуют также методы, позволяющие разбивать строки по подстрокам-разделителям и объединять их вместе, вставляя между ними подстроку. Эти средства будут изучены далее в этой книге, но в качестве знакомства покажем, как они работают:
>>> mystr = ‘a b\nc\nd’
>>> mystr.split() # разделитель по умолчанию: пробельные символы
[‘a’, ‘b’, ‘c’, ‘d’]
>>> delim = ‘NI’
>>> delim.join([‘aaa’, ‘bbb’, ‘ccc’]) # объединить подстроки из списка ‘aaaNIbbbNIccc’
>>> ‘ ‘.join([‘A’, ‘dead’, ‘parrot’]) # добавить пробел между подстроками
‘A dead parrot’
>>> chars = list(‘Lorreta’) # преобразовать в список символов
>>> chars
[‘L’, ‘o’, ‘r’, ‘r’, ‘e’, ‘t’, ‘a’]
>>> chars.append(‘!’)
>>> ‘’.join(chars) # преобразовать в строку: с пустым разделителем
‘Lorreta!’
Эти вызовы оказываются удивительно мощными. Например, строку с колонками данных, разделенными символами табуляции, можно разобрать по колонкам единственным вызовом метода split; сценарий more.py, представленный выше, использует разновидность splitlines этого метода, чтобы разбить строку в список строк. На практике вызов метода replace можно эмулировать с помощью комбинации split/join:
>>> mystr = ‘xxaaxxaa’
>>> ‘SPAM’.join(mystr.split(‘aa’)) # усложненная версия str.replace!
‘xxSPAMxxSPAM’
Запомните на будущее, что язык Python не предусматривает автоматического преобразования строк в числа и обратно, поэтому если в этом возникнет необходимость, такие преобразования необходимо выполнять явно:
>>> int(“42”), eval(“42”) # преобразование строки в целое число
(42, 42)
>>> str(42), repr(42) # преобразование целого числа в строку
(‘42’, ‘42’)
>>> (“%d” % 42), ‘{:d}’.format(42) # с помощью оператора и метода форматиров. (‘42’, ‘42’)
>>> “42” + str(1), int(“42”) + 1 # в операциях конкатенации и сложения
(‘421’, 43)
В последней приведенной инструкции первое выражение выполняет конкатенацию строк (так как оба операнда являются строками), а второе выполняет сложение целых чисел (поскольку оба объекта являются числами). Python не делает предположений о том, какое преобразование вы могли иметь в виду, и не выполняет преобразования автоматически. Одно из главных правил интерпретатора Python — где только возможно, избегать закулисных магических действий и попыток что-то угадывать. Более подробно о средствах для работы со строками будет рассказано далее (им посвящена целая глава в пятой части), но, кроме того, стоит посмотреть описание дополнительных строковых инструментов в руководстве по библиотеке.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011