Книга: Как устроен Python. Гид для разработчиков, программистов и интересующихся
Назад: 10. dir, help и pdb
Дальше: 12. Комментарии, логические значения и None

11. Строки и методы

В главе 10 вы узнали о встроенной функции dir и некоторых методах, которые можно вызвать для строковых объектов. Так как строки являются неизменяемыми, эти методы не изменяют строку, а возвращают новую строку или новый результат. Операции со строками позволяют создать новую версию, преобразованную к верхнему регистру, вернуть отформатированную строку, создать строку в нижнем регистре и т.д. Для выполнения этих операций разработчик вызывает методы.

Методы представляют собой функции, вызываемые для экземпляра типа. Что это означает? Чтобы вызвать метод для строкового объекта, поставьте точку (.) и укажите имя объекта прямо за именем переменной, хранящей данные (или самими данными). За именем объекта должны следовать круглые скобки со списком аргументов.

ПРИМЕЧАНИЕ

В этой книге я ставлю точку перед именами методов. Это делается для того, чтобы напомнить вам о том, что перед методом должен быть указан объект. Скажем, вместо метода capitalize в тексте будет упоминаться метод .capitalize. Вызов его для объекта text выглядит так:

text.capitalize()

В этом отношении методы отличаются от функций (таких, как help), которые вызываются самостоятельно (без объекта или точки):

help()

 

517995.png 

Рис. 11.1. Вызов метода для строки. Метод не изменяет саму строку, потому что строки неизменяемы. Вместо этого метод возвращает новую строку

В следующем примере метод .capitalize вызывается для переменной, указывающей на строку, и для строкового литерала. Обратите внимание: объект, для которого вызывается метод, при этом не изменяется. Так как строки неизменяемы, результатом метода является новый объект со значением, записанным с прописной буквы:

>>> name = 'matt'

 

# вызывается для переменной

>>> correct = name.capitalize()

>>> print(correct)

Matt

Обратите внимание: name при этом не изменяется:

>>> print(name)

matt

Метод .capitalize не обязательно вызывать для переменной. Его также можно вызвать прямо для строкового литерала:

>>> print('fred'.capitalize())

Fred

В Python методы и функции являются полноправными объектами. Как упоминалось ранее, в Python вообще нет ничего, кроме объектов. Если опустить круглые скобки, Python не выдаст сообщения об ошибке, а выведет ссылку на метод, который является объектом:

>>> print('fred'.capitalize)

<built-in method capitalize of str object at

0x7ff648617508>

Существование методов и функций как полноправных объектов позволяет использовать такие нетривиальные возможности, как замыкания и декораторы (они рассматриваются в моем учебнике Python промежуточного уровня).

ПРИМЕЧАНИЕ

А у целых чисел и чисел с плавающей точкой тоже есть методы? Да, еще раз повторю: в Python нет ничего, кроме объектов, и у объектов есть методы. В этом легко убедиться, вызвав dir для целого числа (или переменной, в которой хранится целое число):

>>> dir(4)

['__abs__', '__add__', '__and__',

'__class__',

...

'__subclasshook__', '__truediv__',

'__trunc__', '__xor__', 'conjugate',

'denominator', 'imag', 'numerator',

'real']

Вызов метода для числа несколько усложняется использованием точки для обозначения вызова метода. Так как точка часто встречается в числах с плавающей точкой, ее использование для вызова методов для чисел может привести Python в замешательство.

Например, метод .conjugate возвращает комплексное сопряжение целого числа. Но при попытке вызвать его для целого числа вы получите ошибку:

>>> 5.conjugate()

Traceback (most recent call last):

...

5.conjugate()

^

SyntaxError: invalid syntax

Одно из возможных решений — заключить число в круглые скобки:

>>> (5).conjugate()

5

Также можно присвоить переменную 5 и вызвать метод для переменной:

>>> five = 5

>>> five.conjugate()

5

Впрочем, на практике вызов методов для чисел встречается довольно редко.

11.1. Основные строковые методы

Некоторые методы строк часто используются в программах и обнаруживаются в стороннем коде. Информацию о других можно найти при помощи dir и help (или электронной документации).

11.2. endswith

Допустим, у вас имеется переменная с именем файла и вы хотите проверить расширение. Задача легко решается методом .endswith:

>>> xl = 'Oct2000.xls'

>>> xl.endswith('.xls')

True

>>> xl.endswith('.xlsx')

False

ПРИМЕЧАНИЕ

Обратите внимание: при вызове метода вы должны были передать параметр (или аргумент) 'xls'. У методов имеется сигнатура — этот пугающий термин означает, что они должны вызываться с правильным количеством (и типами) параметров. Для метода .endswith вполне логично, что, если вы хотите узнать, кончается ли строка другой строкой, нужно сообщить Python, какое именно завершение нужно проверить. Для этого методу передается строка-завершитель.

СОВЕТ

И снова всю информацию такого рода можно легко найти при помощи help. В документации должно быть указано, какие параметры являются обязательными, а также должны быть перечислены все необязательные параметры. Справка для endswith выглядит так:

>>> help(xl.endswith)

Help on built-in function endswith:

 

endswith(...)

S.endswith(suffix[, start[, end]]) -> bool

 

Return True if S ends with the specified

suffix, False otherwise. With optional

start, test S beginning at that position.

With optional end, stop comparing S at

that position. suffix can also be a

tuple of strings to try.

Обратите внимание на строку

S.endswith(suffix[, start[, end]]) -> bool

S представляет строку (экземпляр), для которой вызывается метод; в нашем случае это переменная xl. Имя метода — .endswith. В круглые скобки ( ) заключены параметры. Обязательным параметром является suffix. Метод .endswith сообщит об ошибке, если этот параметр не будет передан при вызове:

>>> xl.endswith()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: endswith() takes at least 1 argument

(0 given)

Параметры в квадратных скобках [ ] являются необязательными. В данном случае параметры start и end позволяют проверить только часть строки. Например, если вы хотите убедиться в том, что часть строки с 0 и до 3 символов завершается символами «Oct», это можно сделать так:

>>> xl.endswith('Oct', 0, 3)

True

У строк также имеется парный метод .startswith, так что, если вы захотите узнать, начинается ли строка с 'Oct', это делается так:

>>> xl.startswith('Oct')

True

 

11.3. find

Метод .find предназначен для поиска подстрок в других строках. Он возвращает индекс (смещение, начинающееся с 0) совпадающей подстроки. Если подстрока не найдена, метод возвращает −1:

>>> word = 'grateful'

 

# 0 is g, 1 is r, 2 is a

>>> word.find('ate')

2

>>> word.find('great')

-1

11.4. format

Метод format позволяет легко создавать новые строки, объединяя существующие переменные. Этот метод рассматривался в главе 9:

>>> print('name: {}, age: {}'.\

... format('Matt', 10))

name: Matt, age: 10

ПРИМЕЧАНИЕ

В приведенном примере функция print занимает две строки. Последовательность символов .\ сообщает Python, что на следующей строке находится продолжение. Если открыта левая круглая скобка (, вы также можете размещать аргументы в нескольких строках без \:

>>> print("word".

... find('ord'))

1

>>> print("word".find(

... 'ord'))

1

Чтобы код лучше читался, строки продолжения снабжаются отступом. Отступ из четырех пробелов сообщает всем читателям кода, что вторая строка является продолжением предыдущей команды:

>>> print("word".\

... find('ord'))

1

>>> print("word".find(

... 'ord'))

1

Зачем разбивать код, который мог бы поместиться в одной строке, на несколько строк? Чаще всего это делается при использовании стандартов оформления кода, требующих, чтобы длина строки не превышала 80 символов. Если метод получает несколько аргументов, выдержать ограничение в 80 символов может быть непросто. (Для Python длина строки не важна, но читатели вашего кода — другое дело.) На практике каждый аргумент метода нередко размещается в отдельной строке:

>>> print('{} {} {} {} {}'.format(

... 'hello',

... 'to',

... 'you',

... 'and',

... 'you'

... ))

hello to you and you

 

11.5. join

Нередко имеется список (см. далее в книге), и вы хотите что-то вставить между существующими элементами. Метод .join создает новую строку из последовательности, вставляя строку между каждой парой элементов списка:

>>> ', '.join(['1','2','3'])

'1, 2, 3'

СОВЕТ

В большинстве интерпретаторов Python .join работает быстрее, чем многократная конкатенация с использованием оператора +. Приведенная идиома является стандартной.

11.6. lower

Метод .lower возвращает копию строки, преобразованную к нижнему регистру. Такое преобразование часто бывает полезно для проверки совпадения ввода с некоторой строкой. Например, одни программы записывают расширения файлов в верхнем регистре, другие — нет. Если вы хотите проверить, имеет ли файл расширение TXT или txt, это можно сделать так:

>>> fname = 'readme.txt'

>>> fname.endswith('txt') or fname.endswith('TXT')

True

Версия, более традиционная для Python, выглядит так:

>>> fname.lower().endswith('txt')

True

11.7. startswith

Метод .startswith аналогичен .endswith, но он проверяет, начинается ли строка с другой строки:

>>> 'Book'.startswith('B')

True

>>> 'Book'.startswith('b')

False

11.8. strip

Метод .strip возвращает новую строку, из которой удалены начальные и конечные пропуски (пробелы, табуляции, символы новой строки). Например, это может быть полезно для нормализации или разбора данных, введенных пользователем (или загруженных из интернета).

>>> ' hello there '.strip()

'hello there'

Обратите внимание: из строки были удалены три начальных пробела и два пробела в конце. При этом два пробела между словами остались на своих местах. Если вам нужно удалить только начальные или конечные пропуски, эти задачи решаются методами lstrip и rstrip соответственно.

11.9. upper

Метод .upper аналогичен .lower. Он возвращает копию строки, в которой все буквы преобразованы к верхнему регистру:

>>> 'yell'.upper()

'YELL'

11.10. Другие методы

У строк есть и другие методы, но они используются реже. Познакомьтесь с ними самостоятельно — прочитайте документацию и опробуйте на практике. В приложении приведен полный список этих методов.

ПРИМЕЧАНИЕ

Часть STRINGMETHODS в разделе справки из REPL содержит документацию по всем строковым методам, а также ряд примеров.

11.11. Итоги

Эта глава была посвящена методам. Методы всегда вызываются с указанием объекта и точки перед именем метода. Также были рассмотрены наиболее типичные методы для строк. Следует помнить, что строки являются неизменяемыми. Если вы захотите изменить значение строки, для этого необходимо создать новую строку.

11.12. Упражнения

1. Создайте строку school с названием вашего учебного заведения. Просмотрите методы, доступные для этой строки. Воспользуйтесь функцией help для просмотра документации.

2. Создайте строку country со значением 'usa'. Создайте новую строку correct_country со значением, преобразованным к верхнему регистру, с использованием строкового метода.

3. Создайте строку filename со значением 'hello.py'. Проверьте, завершается ли имя файла суффиксом '.java'. Определите индекс подстроки 'py'. Проверьте, начинается ли строка с подстроки 'world'.

4. Откройте REPL. Войдите в режим справочной информации и просмотрите раздел STRINGMETHODS.

Вернуть True, если S заканчивается suffix, в противном случае — False. При дополнительном запуске проверка S начинается с этой позиции. С необязательным параметром end прекратите сравнение S в этом положении. suffix также может быть кортежем строк.

Назад: 10. dir, help и pdb
Дальше: 12. Комментарии, логические значения и None