Python: Цикл For
С помощью цикла while решают любую задачу перебора элементов, но его отличает многословность. Для while нужно задавать условие остановки и вводить счетчик. Когда циклов немного, то это нормально, но в реальном коде циклы встречаются на каждом шагу. Поэтому управлять условиями вручную утомительно, особенно когда условие остановки очевидно.
Например, если мы хотим перебрать символы в строке, то компьютер сам может понять, когда строка заканчивается. Для таких ситуаций в Python есть цикл for. Он сам знает, когда нужно остановиться: for работает со значениями, по которым можно проходить поэлементно (например, со строкой).
Строка состоит из символов, и цикл for позволяет проходить по строке символ за символом. Пример:
text = 'code'
for symbol in text:
print(symbol)
# => c
# => o
# => d
# => eВ коде выше for проходит по каждому символу в строке, записывает его в переменную symbol и вызывает внутренний блок кода, где эта переменная используется. Имя этой переменной может быть любым. Общая структура цикла for выглядит так: for <переменная> in <объект, который можно перебирать>.
Сравним for и while для одной и той же задачи:
for char in 'Hi!': while i < len('Hi!'):
print(char) print(text[i])
i = i + 1
│ │
└── проще └── нужен счетчикПосмотрим, как реализовать функцию переворота строки через цикл for. Такое задание встречается на собеседованиях.
def reverse_string(text: str) -> str:
# Начальное значение
result = ''
# char - переменная, в которую записывается текущий символ
for char in text:
# Соединяем в обратном порядке
result = char + result
# Цикл заканчивается, когда пройдена вся строка
return result
reverse_string('go!') # => '!og'Разберем подробно как отрабатывает цикл в примере выше на каждом шаге итераций.
reverse_string('go!')
до цикла: result = ''
1 итерация: char = 'g'
result = char + result
= 'g' + ''
= 'g'
2 итерация: char = 'o'
result = char + result
= 'o' + 'g'
= 'og'
3 итерация: char = '!'
result = char + result
= '!' + 'og'
= '!og'Теперь посчитаем количество упоминаний символа в строке без учета регистра:
# text - произвольный текст
# char - символ, который нужно учитывать
def chars_count(text: str, char: str) -> int:
# Так как ищем сумму, то начальное значение 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Задание
Реализуйте функцию normalize_filename(), которая подготавливает имя файла для сохранения. Функция принимает строку и возвращает новую строку, где все пробелы заменены на символ _.
Пример вызова:
normalize_filename('my photo.png') # 'my_photo.png'
normalize_filename('final report.pdf') # 'final_report.pdf'
normalize_filename('already_ready.txt') # 'already_ready.txt'Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
from solution import normalize_filename
def test():
assert normalize_filename("my photo.png") == "my_photo.png"
assert normalize_filename("final report.pdf") == "final_report.pdf"
assert normalize_filename("already_ready.txt") == "already_ready.txt"
assert normalize_filename("two spaces.txt") == "two__spaces.txt"Решение учителя откроется через:
20:00
