Оператор for в Python несколько отличается от того, что Вы могли видеть в языках C или Pascal. Вместо того, чтобы всегда итерироваться по арифметической прогрессии (как это делается в Pascal) или предоставить пользователю возможность определить и итерационный шаг, и завершающее условие цикла (как это сделано в языке C), оператор for в Python итерируется по элементам любой последовательности (будь то список или строка) в том порядке, в котором эти элементы идут в самой последовательности. Например:
if __name__ == '__main__':
mylist = ["Это", "пример", "элементов", "списка", "и", "оператора", "for", "в", "Python"]
for word in mylist:
print(f'Элемент списка: {word}, длина элемента: {len(word)} символов')
Если запустить этот скрипт, например, в PyCharm, то на экране консоли мы увидим результат этой небольшой программы:
Элемент списка: Это, длина элемента: 3 символов
Элемент списка: пример, длина элемента: 6 символов
Элемент списка: элементов, длина элемента: 9 символов
Элемент списка: списка, длина элемента: 6 символов
Элемент списка: и, длина элемента: 1 символов
Элемент списка: оператора, длина элемента: 9 символов
Элемент списка: for, длина элемента: 3 символов
Элемент списка: в, длина элемента: 1 символов
Элемент списка: Python, длина элемента: 6 символов
Таким образом, мы видим, что оператор for перебрал все элементы нашей последовательности (в данном примере последовательностью выступает список mylist) и для каждого элемента последовательности вывел сам элемент и его длину (с помощью встроенной функции len()) в символах.
Теперь давайте посмотрим, как можно использовать цикл for для перебора символов в строке, которая также является последовательностью в Python:
if __name__ == '__main__':
s = "Это пример использования цикла for в Python, который применяется к строке"
cyr_symbols_count = 0
lat_symbols_count = 0
for ch in s:
if ('А' <= ch <= 'Я') or ('а' <= ch <= 'я'):
cyr_symbols_count += 1
elif ('A' <= ch <= 'Z') or ('a' <= ch <= 'z'):
lat_symbols_count += 1
print(f'Количество кириллических символов в строке: {cyr_symbols_count}')
print(f'Количество латинских символов в строке: {lat_symbols_count}')
В данной небольшой программе у нас есть входная тестовая строка s, и мы хотим подсчитать, сколько в ней кириллических символов, а сколько латинских символов. Для этого мы определили две переменные cyr_symbols_count и lat_symbols_count, соответственно. Дальше у нас есть цикл for по нашей строке s, где мы последовательно будем перебирать каждый очередной символ строки и присваивать его в переменную цикла ch. В самом цикле мы с помощью диапазонов сравниваем, что наш символ лежит либо в пределах кириллических символов, и в этом случае наращиваем на единицу счётчик cyr_symbols_count, либо, если символ лежит в пределах букв латинского алфавита, то аналогичным образом наращиваем на единицу счётчик lat_symbols_count. По выходу из цикла for на экран мы выведем количество обоих типов символов.
Обратите внимание, что пробелы и запятая, которые также присутствуют в нашей входной строке s, не считаются.
Результат вывода на консоль данного скрипта:
Количество кириллических символов в строке: 53
Количество латинских символов в строке: 9
Важной особенностью цикла for в Python является то, что если Вы хотите менять содержимое Вашей последовательности, то соответствующий этой задаче код может выглядеть несколько хитро и нужно постараться, чтобы написать его правильно. Вместо этого самым простым путём для изменения содержимого последовательности, является её копирование, либо же создание новой последовательности. Взглянем на пример, который использует обе эти стратегии:
# Пример скрипта, который удалит все фрукты из исходной последовательности
if __name__ == '__main__':
# Создаём простую последовательность
fruits_and_vegetables = {'Апельсин': 'фрукт', 'Банан': 'фрукт', 'Огурец': 'овощ', 'Репа': 'овощ'}
# Стратегия №1 - итерироваться по копии исходной последовательности
for fav_name, fav_type in fruits_and_vegetables.copy().items():
if fav_type == 'фрукт':
del fruits_and_vegetables[fav_name]
print(f'Результат стратегии №1: {fruits_and_vegetables}')
fruits_and_vegetables = {'Апельсин': 'фрукт', 'Банан': 'фрукт', 'Огурец': 'овощ', 'Репа': 'овощ'}
# Стратегия №2: Создать новую коллекцию
only_vegetables = {}
for fav_name, fav_type in fruits_and_vegetables.items():
if fav_type == 'овощ':
only_vegetables[fav_name] = fav_type
print(f'Результат стратегии №2: {only_vegetables}')
В первом случае мы пробегаем в цикле for по копии последовательности, которую получаем через вызов fruits_and_vegetables.copy().items(). Внутри цикла, если тип элемента последовательности удовлетворяет определенному условию (сравнение со значением 'фрукт'), то мы удаляем элемент из исходной последовательности, таким образом оставляя в ней только "овощи".
Стратегия №2 чуть отличается от этого подхода - здесь мы создаем пустую новую последовательность only_vegetables, в которую будем складывать только овощи. Для этого внутри цикла for мы сравниваем тип элемента со значением 'овощ', и если оно истинно, то помещаем в новую последовательность наш итерируемый элемент.
Результат выполнения скрипта на экране консоли PyCharm:
Результат стратегии №1: {'Огурец': 'овощ', 'Репа': 'овощ'}
Результат стратегии №2: {'Огурец': 'овощ', 'Репа': 'овощ'}
Как видим, в обоих случаях, наши стратегии отсеяли все фрукты и оставили только овощи, хоть и механика фильтрации у них отличается.
Вот и всё, как видим, оператор for очень удобен для решения подобных задач. Попробуйте обязательно попрактиковаться с его использованием и напишите результаты своих экспериментов или отзыв в комментариях к статье.
Примеры из этой статьи: https://github.com/AllineedRu/PythonExamples/blob/main/ain_for_statement/__init__.py