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

Я прочитал в "Dive into 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 ответов


такой:

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.

>>>

метод readlines не возвращает итератор в Python 3, он возвращает list

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:

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


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