您好,登錄后才能下訂單哦!
迭代器
迭代器是一個可以記住遍歷的位置的對象,迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。
方法:iter() ,next()。
載體:字符串,列表或元組對象都可用于創建迭代器:
示例:for循環取出列表和字符串中的元素
list=[1,2,3] it_list = iter(list) for it in it_list: print it str = "abc" it_str = iter(str) for it in it_str: print it
生成器
使用了yield 的函數被稱為生成器(generator),生成器是一個返回迭代器的函數,只能用于迭代操作。
在調用生成器運行的過程中,每次遇到 yield 時函數會暫停并保存當前所有的運行信息,返回yield的值。它最大的特點在于并非一次性全部生成,而在于每次調用都生成當前一輪循環,再次調用則再次生成,直到循環結束或是本次生成數據已到終點(例如文件讀取完畢或是判斷條件變成false)。
使用yield的函數并不會一次執行完畢,僅僅返回一個迭代對象,當讀取該迭代對象時,它并沒有完全讀取迭代內容,而是根據代碼需求每次讀取一部分,從而節約了資源。
函數執行結束時,生成器自動拋出StopIteration異常,表示迭代完成,在for循環里,無需處理 StopIteration 異常,循環會正常結束。
在一個生成器函數中,如果沒有return,則默認執行至函數完畢,如果在執行過程中return,則直接拋出 StopIteration 終止迭代。
可以利用 isgeneratorfunction 判斷一個函數是否是一個特殊的 generator 函數isgeneratorfunction(readfile)
while True必須有,否則迭代器無法駐留,輪詢一行就會結束;
示例:yield字段將readfile函數變成一個文件迭代器,每次的輸出都是文件中的一行內容,for循環調用該函數時,每次執行到yield data語句時,該函數就會將當前數據保留并傳遞給item,接著再次下一個循環。
def readfile(): seek = 0 while True: with open('test_server.py','r') as f: f.seek(seek) data = f.readline() if data: seek = f.tell() yield data else: return for item in readfile(): print item
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。