Поведение strip(), split() и join() в Python

Поведение strip(), split() и join() в Python

@python_quiz

Разберем этот квиз

Код из задания:

python

Кратко: здесь одновременно работают три простых метода строк — strip, split и join — и их взаимодействие даёт неожиданный для новичка результат. Разберём по шагам.

Что содержится в исходной строке

Строка внутри кавычек выглядит так (визуально):

  • два пробела в начале,
  • затем символы через запятые: пустой элемент, "a", пустой элемент (из-за двойной запятой), "b",
  • затем запятая и пробел в конце (т. е. последняя запятая перед пробелом).

Явное представление символов:

Шаг 1 — strip()

strip() убирает только пробельные символы по краям строки (слева и справа). У нас два пробела слева и один пробел справа — они удаляются. Внутренние пробелы (если бы были между запятыми и символами) остались бы.

После strip() строка становится:

Шаг 2 — split(',')

split(',') разбивает строку по каждому символу запятой. При этом:

  • если строка начинается с запятой — первый элемент будет пустой строкой '',
  • если между двумя запятыми нет символов — появится пустой элемент '',
  • если строка заканчивается запятой — последний элемент тоже будет пустой ''.

Для нашей строки ",a,,b," результат split будет списком:

python

Шаг 3 — '-'.join(parts)

join соединяет элементы списка, вставляя между ними дефис. join не игнорирует пустые строки — между элементами-'' он всё равно вставит разделитель.

Соединяя ['','a','','b',''] через '-', получаем:

Вывод программы:

text

Анализ вариантов ответов

  • Вариант с "-a--b- -": содержит дополнительный пробел/элемент в конце — это случилось бы, если бы strip не удалил последний пробел и у нас в части списка был элемент, состоящий из пробела. В текущем коде strip удаляет пробел справа, такого элемента нет.
  • Вариант "-a--b-": совпадает с тем, что мы получили после разборa (см. выше).
  • Вариант "a--b-": отсутствует начальный дефис — это означало бы, что первый элемент не пустой, но у нас строка начиналась с запятой, поэтому первый элемент пуст.
  • Вариант "a-b": это результат, который можно получить, если дополнительно отфильтровать пустые элементы (например, убрать их перед join).

Как получить "чистый" результат без пустых элементов

Если хочется игнорировать пустые части, можно фильтровать список перед join:

Пример 1 — удалить абсолютно пустые строки:

python

Пример 2 — удалить пустые и пробельные элементы (strip для каждого элемента):

python

Вывод

  • strip убирает пробелы только по краям строки;
  • split по разделителю возвращает пустые элементы для последовательных разделителей и для ведущих/замыкающих разделителей;
  • join просто вставляет выбранный разделитель между элементами, включая пустые строки.

Комбинация этих фактов даёт результат "-a--b-" для исходного кода.

Report Page