Возвращает ли readlines() список или итератор в Python 3?

Я прочитал в Dive into Python 3, что:

Метод readlines() теперь возвращает итератор, поэтому он так же эффективен, как xreadlines() в Python 2.

См.: Приложение A: Перенос кода на Python 3 с 2to3: метод ввода-вывода A.26 xreadlines().

Я не уверен, что это правда, потому что они не упоминают об этом здесь: http://docs.python.org/release/3.0.1/whatsnew/3.0.html. Как я могу это проверить?


person snakile    schedule 22.08.2010    source источник


Ответы (3)


Как это:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('/junk/so/foo.txt')
>>> type(f.readlines())
<class 'list'>
>>> help(f.readlines)
Help on built-in function readlines:

readlines(...)
    Return a list of lines from the stream.

    hint can be specified to control the number of lines read: no more
    lines will be read if the total size (in bytes/characters) of all
    lines so far exceeds hint.

>>>
person John Machin    schedule 22.08.2010

Метод readlines не возвращает итератор в Python 3, он возвращает список

Help on built-in function readlines:

readlines(...)
    Return a list of lines from the stream.

Для проверки просто вызовите его из интерактивной сессии — он вернет список, а не итератор:

>>> type(f.readlines())
<class 'list'>

Погружение в Python кажется неправильным в этом случае.


xreadlines был устарел, начиная с Python 2.3, когда файловые объекты стали их собственными итераторами. Способ получить такую же эффективность, как xreadlines, вместо использования

 for line in f.xreadlines():

вы должны использовать просто

 for line in f:

Это дает вам нужный итератор и помогает объяснить, почему readlines не нужно было менять свое поведение в Python 3 — он все еще может возвращать полный список с идиомой line in f, обеспечивающей итеративный подход, и давно устаревшим xreadlines был удален полностью.

person Scott Griffiths    schedule 22.08.2010
comment
Я ожидаю, что любой, кто использовал for line in f.xreadlines():, преобразовал его в for line in f: лет назад. - person John Machin; 22.08.2010
comment
@John Machin: Я бы тоже на это надеялся (хотя, возможно, и не ожидал!) Я не имел в виду, что xreadlines был предпочтительным способом сделать это в Python 2 — он устарел еще в Python 2.3, когда файл- был введен метод as-iterator. Я просто хотел указать причину, по которой его можно было бы удалить в Python 3. - person Scott Griffiths; 22.08.2010
comment
Около недели назад я обнаружил, что файлы являются их собственными итераторами :( Я думаю, это правильно, потому что я не смотрел учебник/примечания к выпуску с версии 1.5. - person wbg; 17.04.2013
comment
Этот ответ лучше, потому что он также дает ответ на неявный вопрос: как получить итератор для файлов? - person Visgean Skeloru; 05.10.2015

Другие уже говорили об этом, но просто чтобы понять суть, обычные файловые объекты являются своими собственными итераторами. Так что было бы глупо, если бы readlines() возвращал итератор, потому что он просто вернул бы файл, для которого вы его вызвали. Вы можете использовать цикл for для перебора файла, как сказал Скотт, и вы также можете передать их прямо в функции itertools:

from itertools import islice
f = open('myfile.txt')
oddlines = islice(f, 0, None, 2)
firstfiveodd = islice(oddlines, 5)
for line in firstfiveodd:
  print(line)
person Jack O'Connor    schedule 27.10.2012