Python: Цепочка вызовов
Метод представляет собой операцию, которая применяется к значению и возвращает новый результат. Если результат снова позволяет вызывать методы, то к нему можно применить еще один метод. Такой прием называется цепочка методов (method chaining).
text = ' hExLeT '
result = text.strip().lower()
print(result) # => 'hexlet'- Метод
strip()удаляет пробелы в начале и конце строки и возвращает'hExLeT'. - Метод
lower()делает все буквы строчными и возвращает'hexlet'.

Методы вызываются один за другим, как звенья в цепочке. Это позволяет писать компактный и читаемый код.
print(' hExLeT '.strip().lower().replace('h', 'x')) # => xexlet
# То же самое, но без цепочки
text = ' hExLeT '
step1 = text.strip() # 'hExLeT'
step2 = step1.lower() # 'hexlet'
step3 = step2.replace('h', 'x') # 'xexlet'
print(step3)strip()удаляет пробелы.lower()делает буквы строчными.replace('h', 'x')меняетhнаx.
Каждый метод возвращает новую строку, и следующий метод применяется уже к этой строке.
' Hello, World! '.strip().lower().replace('world', 'python')
│ │ │
↓ ↓ ↓
'Hello, World!' │ │
'hello, world!' │
'hello, python!'Порядок вычисления
В цепочке методов порядок выполнения идет слева направо. Каждый следующий метод вызывается на результате предыдущего.
print(' hExLeT '.strip().lower().replace('h', 'x')) # => xexlet' hExLeT 'является исходной строкой..strip()удаляет пробелы и возвращает'hExLeT'..lower()приводит к нижнему регистру и возвращает'hexlet'..replace('h', 'x')заменяет'h'на'x'и возвращает'xexlet'.
При использовании функций внутренняя часть выполняется первой, и ее результат передается в следующую функцию.
# Условный пример, если бы strip и lower были функциями
print(lower(strip(' hExLeT ')))В методах вы просто "двигаетесь" слева направо, читая цепочку как обычное предложение. Это делает работу с методами особенно удобной.
Если перепутать порядок, результат может отличаться:
print(' hExLeT '.replace('h', 'x').strip().lower()) # => xexletВ этом случае replace() сработает на строку с пробелами. Итог оказался тем же, но это скорее совпадение. В других ситуациях порядок действительно имеет значение.
Цепочка после среза
Методы можно вызывать и после других операций, например, после среза строки:
text = ' Hello, Hexlet! '
# Удаляем пробелы, берем подстроку и переводим в нижний регистр
print(text.strip()[7:].lower()) # => hexlet!Здесь сначала вызывается strip(), который удаляет пробелы. Затем мы берем срез строки [7:], начиная с восьмого символа. И уже после этого вызывается lower(), чтобы привести результат к нижнему регистру.
Такая запись читается слева направо и показывает весь путь преобразования данных в одной строке.
Где цепочка заканчивается
Цепочку можно продолжать, пока результат остается строкой (или другим типом, у которого есть методы). Если метод возвращает число или другой простой тип, то дальнейшие методы вызывать уже нельзя:
text = 'hexlet'
length = text.upper().count('E')
print(length) # => 2Метод count() возвращает число 2, и это число уже не имеет строковых методов, поэтому цепочка на этом заканчивается.
Цепочки методов служат удобным способом объединять несколько операций над значением без промежуточных переменных.
Задание
В переменной text хранится строка лога с лишними пробельными символами внутри. Возьмите часть строки с 5 по 15 символ включительно, удалите лишние пробелы по краям методом .strip() и выведите на экран длину получившейся строки.
Все действия выполните в одной цепочке — без создания промежуточных переменных.
Подсказки
- Индексы в строках начинаются с нуля. Например, 4-й символ имеет индекс
3. - При работе со срезами первый индекс включается, а второй — нет. Например,
text[4:6]вернет 5-й и 6-й символы строки.
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import runpy
def test(capsys):
expected = "7"
runpy.run_module('solution')
out, _ = capsys.readouterr()
assert out.strip() == expectedРешение учителя откроется через:
20:00
