Пожалуйста, объясните синтаксис цикла for в питоне
Я новичок и уже долгое время пытаюсь освоить этот цикл, но я просто логически не могу понять, что такое i и так далее... Я вообще не понимаю как работает следующий код:
for i in "hello":
print(i)
И ОН КАК-ТО ВЫВОДИТ
h
e
l
l
o
КАКККККККККККК
for в Python - это цикл по коллекции. На каждой итерации цикла переменной цикла (той самой i) присваивается очередной элемент коллекции, после чего выполняется тело цикла (в твоём случае - print(i) ). И цикл продолжается, пока не будут перебраны все элементы коллекции.
Если коллекция - строка, то элементы коллекции - все символы этой строки, перебираемые последовательно - слева направо. Т.е. для строки "hello" на первой итерации цикла переменной i будет присвоено значение "h", на второй "e", ..., на последней (пятой) - "o".
Есть некоторый поток элементов — например, на основе списка, множества или генератора значений.
Мы берем из потока по одному элементу за раз, пока этот поток не закончится.
Для каждого такого элемента мы выполняем тело цикла, в котором можем этот элемент использовать.
Чтобы обращаться к элементу, мы даем ему имя, как обычной переменной.
Например, i.
for i in range(5):
print(i + 1)
print("вышел зайчик погулять")
Здесь функция range порождает поток из пяти целых чисел: 0, 1, 2, 3, 4.
Для каждого числа последовательно выполняется оператор print(i + 1) из тела цикла.
По сути, происходит следующее:
print(0 + 1)
print(1 + 1)
print(2 + 1)
print(3 + 1)
print(4 + 1)
В вашем случае:
for i in "hello":
print(i)
источником букв служит строка, воспринимаемая циклом как список символов.
Логически звучит примерно так: Для переменной i в диапазоне "hello" выводим i.
Т.е. каждую итерацию i принимает одно значение из hello, в нашем случае букву и печатает её, потом другая итерация и опять печать и так пока слово не закончится.
После in идет итерируемый объект (имеющий метод __iter__), из которого цикл получает итератор, и, до момента вызова исключения StopIteration, записывает значения, полученные из итератора (через метод __next__).
По итогу цикл for i in "smth" заменяет собой подобную конструкцию:
iterator = "smth".__iter__()
while True:
try:
i = iterator.__next__()
except StopIteration:
break
...
печатается буква соответствующая индексу(i). Сначала первая, потом вторая и тд