строка в iter (fp.readline, ''), а не строка в fp: - PullRequest
0 голосов
/ 21 сентября 2018

Я прочитал пример встроенной функции iter в Встроенные функции - документация Python 3.7.0

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

Я не мог понять, в чем преимущество над следующими:

with open('mydata.txt') as fp:
    for line in fp:
        process_line(line)

Не могли бы вы дать какие-нибудь подсказки?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Как мы с Вимом обсуждали в комментариях, не дает никаких преимуществ для этого конкретного случая.Если второй фрагмент кода будет эквивалентен первому фрагменту кода, он будет выглядеть примерно так:

with open('mydata.txt') as fp:
    for line in fp:
        if line == '':
            break
        process_line(line)

Однако, единственный случай, когда с помощью readline может быть возвращена пустая строка, находится в концефайл (EOF), поэтому теперь он имеет значение (другие строки содержат как минимум символ новой строки '\n').

Если бы вместо пустой строки использовалось другое значение, тогда разница была бы значимой.Лично я думаю, что документы должны использовать лучший пример, чтобы проиллюстрировать это, например:

>>> f = open('test')
>>> f.read()
'a\nb\nc\n\nd\ne\nf\n\n'
>>> f = open('test')
>>> [line for line in iter(f.readline, 'b\n')]
['a\n']
>>> f = open('test')
>>> [line for line in f]
['a\n', 'b\n', 'c\n', '\n', 'd\n', 'e\n', 'f\n', '\n']

(Обратите внимание, что я действительно должен закрывать дескрипторы файлов)

РЕДАКТИРОВАТЬ: я поднял этокак возможная ошибка документации в Issue34764

0 голосов
/ 21 сентября 2018

Оба будут перебирать генератор, не загружая весь файл в память, но версия iter() демонстрирует использование второго аргумента iter(), "sentinel".

Из документов:

, если возвращаемое значение равно часовому, будет сгенерировано стоп-значение

Таким образом, этот код будет считан из файла,пока линия не будет равна '', а затем остановится.

Это странный пример, так как все строки в файле будут иметь новую строку в конце, так что в любом случае это будет срабатывать только в конце файла (если вообще).

...