Iter () во время цикла Python - PullRequest
0 голосов
/ 02 июля 2019

Мне трудно понять, почему issup("oFB","FooBar") возвращает False. Как ведет себя iter(t) во время этого цикла?

см. Это https://leetcode.com/problems/camelcase-matching/ https://leetcode.com/problems/camelcase-matching/discuss/270029/JavaC%2B%2BPython-Check-Subsequence-and-Regax

Я предполагаю, что iter(t) начинается с "FooBar", затем переходит к "ooBar" следующей итерации и т. Д.

def issup(s, t):
    it = iter(t)
    return all(c in it for c in s)

1 Ответ

2 голосов
/ 02 июля 2019

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 необычен тем, что использует состояние основного потока, а не сохраняет свое собственное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...