天天看點

python檔案疊代器以及next内置函數

作者:梯閱線條

1.1 python檔案疊代器

python檔案疊代器有next方法和iter方法,是以是疊代器和可疊代對象。

示例

>>> path=r'E:\documents\F盤\iterator.py'
>>> f=open(path)
>>> '__iter__' in dir(f)
True
>>> '__next__' in dir(f)
True           

1.1.1 python檔案對象的readline與next

python檔案對象readline()方法,每調用一次傳回1行文本,到達檔案末尾,傳回空字元串。

python檔案對象next()方法,每調用一次傳回1行文本,到達檔案末尾,觸發StopIteration異常。

示例

>>> path=r'E:\documents\F盤\iterator.py'
# readline()檔案末尾 傳回空字元串
>>> f=open(path,encoding='utf-8')
>>> f.readline()
"S='梯閱線條'\n"
>>> f.readline()
'print(S)\n'
>>> f.readline()
'L=list(S)\n'
>>> f.readline()
'print(L)'
>>> f.readline()
''
>>> f.readline()
''
>>> f.close()
# __next__()檔案末尾觸發 StopIteration
>>> f=open(path,encoding='utf-8')
>>> f.__next__()
"S='梯閱線條'\n"
>>> f.__next__()
'print(S)\n'
>>> f.__next__()
'L=list(S)\n'
>>> f.__next__()
'print(L)'
>>> f.__next__()
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    f.__next__()
StopIteration
>>> f.close()           

1.1.2 python文本讀取

python文本讀取可用for自動調用next,或者readlines()讀取到清單後周遊。

next每次讀一行,readlines一次讀取全部,推薦使用for循環調用檔案對象的next。

示例

>>> path=r'E:\documents\F盤\iterator.py'
# for 循環每次調用檔案對象的 __next__()方法,每次讀1行
>>> for line in open(path,encoding='utf-8'):
    print(line,end='')

    
S='梯閱線條'
print(S)
L=list(S)
print(L)
# readlines()一次讀取全部檔案内容放到清單
>>> open(path,encoding='utf-8').readlines()
["S='梯閱線條'\n", 'print(S)\n', 'L=list(S)\n', 'print(L)']
>>> for line in open(path,encoding='utf-8').readlines():
    print(line,end='')

    
S='梯閱線條'
print(S)
L=list(S)
print(L)           

1.2 python調用iter和next

1.2.1 iter和next

python的next(X)内置函數,會自動調用X對象的next()方法,X是疊代器對象。

有next()方法的對象是疊代器對象。疊代工具會一直調用疊代對象的next()方法。

python的iter(Y)内置函數,會自動調用Y對象的iter()方法,Y是可疊代對象。

iter()内置函數調用可疊代對象的iter()方法,傳回疊代器對象。

可疊代對象通過iter()函數轉為疊代器對象。

for循環将可疊代對象傳給iter()内置函數,獲得具有next()方法的疊代器對象,然後調用疊代對象的next()方法。

示例

>>> path=r'E:\documents\F盤\iterator.py'
# 檔案對象f本身是疊代器對象,具有next方法,不需iter()函數進行轉換
# next(f) 相當于 F.__next__() 
>>> f=open(path,encoding='utf-8')
>>> f.__next__()
"S='梯閱線條'\n"
>>> f.__next__()
'print(S)\n'
>>> next(f)
'L=list(S)\n'
>>> next(f)
'print(L)'

>>> L=list('tyxt')
>>> '__iter__' in dir(L)
True
>>> '__next__' in dir(L)
False
>>> IT=iter(L)
>>> type(IT)
<class 'list_iterator'>
>>> next(IT)
't'
>>> IT.__next__()
'y'
# iter(L)相當于 L.__iter__()
>>> type(iter(L)),type(L.__iter__())
(<class 'list_iterator'>, <class 'list_iterator'>)           

版權聲明©:

本文首發微信公衆号:梯閱線條,

原創不易,轉載請注明出處。

更多内容參考python知識分享或軟體測試開發目錄。