С помощью цикла while
решают любую задачу перебора элементов, но его отличает многословность. Для while
нужно задавать условие остановки и вводить счетчик. Когда циклов немного, то это нормально, но в реальном коде циклы встречаются на каждом шагу. Поэтому управлять условиями вручную утомительно, особенно когда условие остановки очевидно.
Например, если мы хотим перебрать символы в строке, то компьютер сам может понять, когда строка заканчивается. Для таких ситуаций в Python ввели цикл for
. Он сам знает, когда нужно остановиться, так как работает только с коллекциями — наборами элементов, которые нужно перебрать.
Строка — это коллекция, так как состоит из набора символов. Остальные виды коллекций подробно изучаются в другом курсе.
Пример:
text = 'code'
for symbol in text:
print(symbol)
# => c
# => o
# => d
# => e
В коде выше for
проходит по каждому символу в строке, записывает его в переменную symbol
и вызывает внутренний блок кода, где эта переменная используется. Имя этой переменной может быть любым. Общая структура цикла for
выглядит так: for <переменная> in <коллекция>
.
Посмотрим, как реализовать функцию переворота строки через цикл for
:
def reverse_string(text):
# Начальное значение
result = ''
# char - переменная, в которую записывается текущий символ
for char in text:
# Соединяем в обратном порядке
result = char + result
# Цикл заканчивается, когда пройдена вся строка
return result
reverse_string('go!') # => '!og'
Разберем подробно как отрабатывает цикл в примере выше на каждом шаге итераций:
result
равен пустой строке, char
равен первому символу 'g'. Поэтому в result
присваивается символ 'g' плюс пустая строка, в итоге сохраняется только символ 'g'result
уже хранит символ 'g', а char
равен следующему символу 'o'. В result
записывается char + result
, то есть 'o' + 'g'
result
хранится строка 'og', а char
равен последнему символу '!'. В result
теперь сохраняется '!' + 'og'
Теперь посчитаем количество упоминаний символа в строке без учета регистра:
# text - произвольный текст
# char - символ, который нужно учитывать
def chars_count(text, char):
# Так как ищем сумму, то начальное значение 0
result = 0
for current_char in text:
# приводим все к нижнему регистру,
# чтобы не зависеть от текущего регистра
if current_char.lower() == char.lower():
result += 1
return result
chars_count('hexlet!', 'e') # 2
chars_count('hExlet!', 'e') # 2
chars_count('hExlet!', 'E') # 2
chars_count('hexlet!', 'a') # 0
Советуем поэкспериментировать с примерами выше в интерактивном Replit.
В одном из предыдущих уроков мы уже написали функцию filter_string()
. Напомним, она принимает на вход строку и символ и возвращает новую строку, в которой удалён переданный символ во всех его позициях. На этот раз реализуйте эту функцию с помощью цикла for
. Дополнительное условие: регистр исключаемого символа не имеет значения.
Пример вызова:
text = 'If I look forward I win'
filter_string(text, 'i') # 'f look forward wn'
filter_string(text, 'O') # 'If I lk frward I win'
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1from index import filter_string
2
3
4def test1():
5 text = 'If I look forward I am win'
6 assert filter_string(text, 'z') == 'If I look forward I am win'
7 assert filter_string(text, 'I') == 'f look forward am wn'
8 assert filter_string('zz zorro', 'z') == ' orro'
9
Решение учителя откроется через: