Python內建函 iter

高洛峰
發布: 2016-11-04 14:52:38
原創
1308 人瀏覽過

中文文件:

iter(object[, Sentinel])

回傳一個迭代器物件。根據第二個參數的存在,第一個參數的解釋非常不同。如果沒有第二個參數,object 必須是支援迭代協定(__iter__() 方法)的集合對象,或者它必須支援序列協定(整數參數從 0 開始的 __getitem__() 方法)。如果它不支援這些協定中的任何一個,則會引發 TypeError。如果給出了第二個參數哨兵,則物件必須是可呼叫物件。在這種情況下建立的迭代器將在每次呼叫其 __next__() 方法時呼叫不帶參數的物件;如果傳回的值等於sentinel,則會引發StopIteration,否則將傳回該值。

iter() 第二種形式的一個有用應用是讀取檔案的行,直到到達特定行。下列範例讀取文件,直到readline() 方法傳回空白字串:

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

 說明:

凡1.函數功能傳回一個可迭代物件。

凡2.當第二個參數不提供時,第一個參數必須是一個支持可迭代協議(即實現了__iter__()方法)的集合(字典、集合、不可變集合),或者支持序列協定(即實作了__getitem__()方法,方法接收一個從0開始的整數參數)的序列(元組、列表、字串),否則將報錯。

>>> a = iter({'A':1,'B':2}) #字典集合
>>> a
<dict_keyiterator object at 0x03FB8A50>
>>> next(a)
&#39;A&#39;
>>> next(a)
&#39;B&#39;
>>> next(a)
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    next(a)
StopIteration
 
>>> a = iter(&#39;abcd&#39;) #字符串序列
>>> a
<str_iterator object at 0x03FB4FB0>
>>> next(a)
&#39;a&#39;
>>> next(a)
&#39;b&#39;
>>> next(a)
&#39;c&#39;
>>> next(a)
&#39;d&#39;
>>> next(a)
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    next(a)
StopIteration
登入後複製

3. 當第二個參數sentinel提供時,第一個參數必須是可被呼叫物件。建立的迭代對象,在呼叫__next__方法的時候會呼叫這個可被呼叫對象,當返回值和sentinel值相等時,將推送StopIteration異常,終止迭代。

# 定义类
>>> class IterTest: 
    def __init__(self):
        self.start = 0
        self.end = 10
    def get_next_value(self):
        current = self.start
        if current < self.end:
            self.start += 1
        else:
            raise StopIteration
        return current

>>> iterTest = IterTest() #实例化类
>>> a = iter(iterTest.get_next_value,4) # iterTest.get_next_value为可调用对象,sentinel值为4
>>> a
<callable_iterator object at 0x03078D30>
>>> next(a)
>>> next(a)
>>> next(a)
>>> next(a)
>>> next(a) #迭代到4终止
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    next(a)
StopIteration
登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!