Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Python
/

Цикл For

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'
Коммерческий опыт и Трудоустройство

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

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

Цикл For

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

waiting_clock
← ПредыдущийСледующий →