Объясните пожалуйста различия между циклами for и while.
Если можно простым языком. Спасибо.
Объясните пожалуйста различия между циклами for и while.
Если можно простым языком. Спасибо.
На примере функции range(n):
В цикле for i in range(n) в переменную i будет поочередно записываться каждое значение из диапазона range(n), например:
In [1]: for i in range(3):
...: print(i)
...:
0
1
2
Сначала i принимает значение 0, затем 1, и так пока не дойдем до n.
Также циклом for можно пройтись по любому итерабельному объекту, например:
In [4]: array = [1, 2, 3]
In [5]: for i in array:
...: print(i)
В переменную i поочередно будет записаны значения из списка array.
Цикл while работает немного иначе, он проверяет условие на истинность, while x < 10 - на каждой итерации цикла, будет осуществлена проверка x < 10, если это так, цикл пойдет дальше, на примере того же range(n):
In [2]: i = 0
In [3]: while i < 3:
...: print(i)
...: i += 1
...:
0
1
2
На каждой итерации мы проверяем меньше ли переменная i чем 3, если это так, то выводим значение переменной i и прибавляем к ней единицу, повторяем это пока проверка на i < 3 не вернёт False. Мы по сути говорим, пока что-то истинно, то выполняй какие то действия.
Помните пример с циклом for когда мы проходили по списку? С while дело обстоит иначе, нам нужно вытягивать из списка элементы по их индексам, т.е в условие будет выглядеть так: while i < len(array), функция len(iterable) вернёт нам кол-во элементов в списке, на примере того же array:
In [6]: i = 0
In [7]: while i < len(array):
...: print(array[i])
...: i += 1
Чтобы определить бесконечный цикл while, нужно указать такое условие, которое всегда истинно, например while True.
С циклом for все сложнее, бесконечный цикл явно указать нельзя, так как цикл for закончит свою работу тогда, когда пройдет по всем элементам объекта, следовательно нужно ему передать такой объект, в котором бесконечно элементов, тут нам помогут генераторы, говорить о них детально я не буду, так как тема довольно обширная, лишь покажу небольшой пример с модулем itertools:
In [11]: from itertools import count
In [12]: for i in count():
...: print(i) # 1, 2, 3, 4 ...
Таким образом мы определили бесконечный цикл for, count также принимает 2 необязательных аргумента, start число с которого начнём итерацию, и step собственно шаг.
Тут Вы можете найти немного задачек на циклы для практики.
Общее у while и for конструкций, что они обе задают циклы. Всё остальное разное.
while-цикл крайне простой и общий:
пока <условие истинно>:
<выполняем тело цикла>
Пример:
while t.is_alive():
t.join(0.04)
for-цикл более специализированный:
для <каждого элемента> в <перечислимом объекте>:
<выполняем тело цикла>
Пример:
for n in numbers:
print(n * n)
Можно выразить for-цикл, используя while-цикл:
it = iter(numbers) # получаем итератор
while True:
try:
n = next(it) # получаем следующий элемент
except StopIteration: # нет больше элементов
break # выходим из цикла
print(n * n)
И наоборот, [чтобы показать, что это вообще возможно] можно while цикл как for-цикл записать:
for _ in UntilDead(t): # запрашиваем элементы у UntilDead
pass # и ничего не делаем
где UntilDead класс определяет соответствующий итератор:
class UntilDead:
def __init__(self, thread, timeout=.4):
self.thread = thread
self.timeout = timeout
def __iter__(self):
return self
def __next__(self):
if not self.thread.is_alive():
raise StopIteration
return self.thread.join(self.timeout)
Для работы for-цикла используется «протокол итератора»: в for-цикл можно передать любой объект, из которого итератор можно извлечь (эквивалент вызова iter()). В примере, UntilDead уже является итератором (определяет __iter__ метод, который возвращает самого себя). На каждой итерации вызывается __next__ метод, чтобы следующий элемент получить до тех пор пока не возникнет StopIteration исключение.
Специальные методы (начинаются и заканчиваются на __) во многих встроенных протоколах участвуют в Питоне. См. Магические методы.
while - это цикл*, который повторяет что-то, пока что-то верно. Например**:
count = 0
flag = True
while flag == True: #это цикл, который делает то, что отмечено отступом пока flag == True.
if count == 15:
break #если сount равен 15, выходить из цикла while.
print("пока верно")
count += 1
for - цикл, который повторяется несколько раз. Например:
for i in range (5): #5 раз печатает "hello"
print ("hello")
*-цикл - что-то, что повторяется.
**-после # показаны комментарии, это не код.
Надеюсь, стало понятно!
Использование объекта в конструкции for,
требует у него наличия атрибута __iter__.
def q1():
yield from [1, 2]
for a in q1():
print(a)
print(hasattr(q1(), '__iter__')) # True
print(print(hasattr(1, '__iter__'))) # False
for a in 1:
print(a) # TypeError: 'int' object is not iterable
q2 = [1, 2]
print(hasattr(q2, '__iter__')) # True
# for можно использовать в списковых включениях
a = [b + 1 for b in q2]
Использование объекта в конструкции while,
требует у него наличия атрибута __bool__.
while нельзя использовать в списковых включениях.
for x in a: x=1не меняетaсписок; Передвижение по элементам внутри for. Как реализовать *next++ в Питоне – jfs Feb 26 '18 at 15:37