Возвращает ли readlines () список или итератор в Python 3? - PullRequest
30 голосов
/ 22 августа 2010

В «Погружении в Python 3» я прочитал, что «метод readlines () теперь возвращает итератор, поэтому он так же эффективен, как xreadlines () в Python 2».Смотрите здесь: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html.Я не уверен, что это правда, потому что они не упоминают это здесь: http://docs.python.org/release/3.0.1/whatsnew/3.0.html.Как я могу это проверить?

Ответы [ 3 ]

30 голосов
/ 22 августа 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 имеетбыл полностью удален.

21 голосов
/ 22 августа 2010

Как это:

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.

>>>
7 голосов
/ 27 октября 2012

Другие уже говорили об этом, но просто чтобы понять, обычные файловые объекты являются их собственными итераторами. Так что иметь readlines() return итератор было бы глупо, потому что он просто возвращал файл, к которому вы его вызывали. Вы можете использовать цикл 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)
...