Я думаю, вы на самом деле не понимаете, почему это работает. Каждый раз, когда вы звоните line_reader()
, создается новый line_reader_iter
генератор . Кажется, это работает, потому что вы используете один и тот же infile
каждый раз, и каждый вызов readline()
возвращает следующую строку файла.
Рассмотрим следующий более простой пример:
>>> counter = lambda: next(iter(range(10)))
>>> counter()
0
>>> counter() # each time the lambda is called, a new range iter is created
0
Вы можете получить желаемое поведение, используя следующее:
line_reader = line_reader_iter(infile).next
Вот как это будет работать с моим примером диапазона:
>>> counter = iter(range(10)).next
>>> counter()
0
>>> counter() # yay, we are actually using the same iterator
1