本文實例講述了Python迭代器和生成器定義與用法。分享給大家供大家參考,具體如下:
迭代器 iter()
迭代器是訪問集合中元素的一種方式,迭代器 object 從集合中的第一個元素開始訪問,直到所有的元素被訪問完成.
所以迭代器的特點是:只能往前,不能后退
迭代器的優點:不需要提前準備整個迭代器中的所有元素,僅僅迭代到某個元素時才計算該元素,而之前或者之后,元素可以不存在或者銷毀.因為這個特點,迭代器特別適合遍歷文件比較大或者無限的集合.
總結下迭代器 iter()的特點吧:
1.訪問者不需要關心迭代器內部的結構,僅需通過next()方法不斷去取下一個內容
2.不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問
3.訪問到一半時不能往回退
4.便于循環比較大的數據集合,節省內存
**迭代器是用__next__()來取值的,來看個例子吧:
li=[1,2,3,4,56,78]a=iter(li)print(a.__next__())print(a.__next__())print(a.__next__())print(a.__next__())print(a.__next__())print(a.__next__()) #取值到最后一個元素787print(a.__next__())
輸出:
12345678#開始報錯Traceback (most recent call last): File "/Users/shane/PycharmProjects/Py_study/Base/S5/iter_test.py", line 14, in <module> print(a.__next__())StopIteration
生成器generator
一個函數調用時返回一個迭代器,那這個函數就叫做生成器(generator);如果函數中包含yield語法,那這個函數就會變成生成器
yield是個什么鬼?yield 其實和函數中的 return 一樣,一樣的是都會返回定義好的值,但不同的是,return 是退出函數,yield 只是暫停函數執行,等待下一次迭代器取值
我們來看個例子:
def func(): print(111) yield 1 print(222) yield 2 print(333) yield 3ret=func()r1=ret.__next__()print(r1) #如果沒有 print,只會返回111
out:
1111
一個典型的生成器的取值方式:
def func(): print(111) yield 1 print(222) yield 2 print(333) yield 3ret=func()r1=ret.__next__()print(r1)r2=ret.__next__()print(r2)r3=ret.__next__()print(r3)r4=ret.__next__() #如果沒有 r4就不會報錯,因為已經沒值可取了print(r4)
out:
Traceback (most recent call last): File "/Users/shane/PycharmProjects/Py_study/Base/S5/geno.py", line 21, in <module> r4=ret.__next__()StopIteration111122223333
進程已結束,退出代碼1
來看一個比較完整一點的生成器和迭代器吧:
def myrange(args): start=0 while True: if start > args: return else: yield start start+=1res=myrange(3)ret=res.__next__()print(ret)ret=res.__next__()print(ret)ret=res.__next__()print(ret)ret=res.__next__()print(ret)ret=res.__next__()print(ret)
新聞熱點
疑難解答