iter(t)
возвращает итератор, который возвращает все элементы t
. Таким образом, он вернет "F"
, "o"
, "o"
, "B"
, "a"
и "r"
.
Однако итератор может использоваться только один раз; как только он вернет все элементы, он будет пустым. Таким образом, в первый раз, когда генератор выполняет c in it
, он будет проходить через итератор, пока не найдет совпадение со значением c
. Когда он пытается найти следующий c
, он продолжит с того места, где остановился в прошлый раз. И если какой-либо из них не найдет совпадения, он достигнет конца итератора, и ни один из следующих c in it
тестов не пройдет.
Итак, когда вы делаете issup("oFB", "FooBar")
, первая итерация находит первую o
. Вторая итерация ищет F
, но ее невозможно найти, потому что мы уже прошли этот элемент в итераторе. В этот момент all()
возвращает False
.
Многие ошибки Python вызваны тем, что итераторы могут пройти только один раз. Например. как то так:
with open("filename") as f:
for _ in range(10):
for line in f:
# do stuff
f
- это итератор по строкам файла. Когда вы достигнете конца цикла for line
, в нем ничего не останется, поэтому на следующей итерации for _
не будет ничего зацикливаться. В этом случае вы можете исправить это с помощью f.seek(0)
для перемотки, но большинство итераторов не имеют ничего подобного. Итератор file
необычен тем, что использует состояние основного потока, а не сохраняет свое собственное состояние.