/
Программирование
/
Курс Python
/

Цепочка вызовов

Python: Цепочка вызовов

Метод представляет собой операцию, которая применяется к значению и возвращает новый результат. Если результат снова позволяет вызывать методы, то к нему можно применить еще один метод. Такой прием называется цепочка методов (method chaining).

text = '  hExLeT  '
result = text.strip().lower()
print(result)  # => 'hexlet'
  1. Метод strip() удаляет пробелы в начале и конце строки и возвращает 'hExLeT'.
  2. Метод 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
  1. ' hExLeT ' является исходной строкой.
  2. .strip() удаляет пробелы и возвращает 'hExLeT'.
  3. .lower() приводит к нижнему регистру и возвращает 'hexlet'.
  4. .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-й символы строки.

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются