#!/usr/bin/env python # -*- coding:utf-8 -*- #只要函數的代碼裏面出現了yield關鍵字,這個函數就再也不是一個普通的函數了,叫作生成器函數 #執行生成器函數,獲取到的東西就叫作生成器 #生成器的一個好處就是無需在內存中創鍵全部東西,何時須要何時建立 ''' def fun(): yield 1 yield 2 r = fun() ''' #fun是生成器函數,r是生成器,生成器具備生成一些東西的能力 ###################生成器原理####################### ''' #定義一個生成器函數 def fun(): print(11) yield 1 print(22) yield 2 print(33) yield 3 #執行生成器函數,僅僅獲取了一個生成器,不會輸出任何值 r = fun() #執行生成器的__next__方法,碰到yield就退出,這裏的yield至關於普通函數裏面的return,可是不同,yield能夠保存上一次的執行狀態,而return 是直接退出的返回值是第一個yield的值 ret = r.__next__() print(ret) #再次執行生成器的__next__方法,返回值是第二個yield的值 ret = r.__next__() print(ret) ''' ############################################################ ########################生成器實現####################### def xrange(n): start = 0 while True: if start > n: return yield start start += 1 obj = xrange(5) n1 = obj.__next__() n2 = obj.__next__() n3 = obj.__next__() n4 = obj.__next__() n5 = obj.__next__() print(n1,n2,n3,n4,n5)
#!/usr/bin/env python # -*- coding:utf-8 -*- #生成器僅僅具備一種生成能力 #如和將一個函數變爲生成器,在函數裏面出現了yield,這個函數就再也不是普通的函數了,叫生成器函數,執行這個生成器函數就會獲得一個生成器 #迭代器具備訪問能力,迭代器是一個一個進行迭代,只能一個一個日後找,不能往前找 #迭代器特色: #訪問者不須要關心迭代器內部的結構,僅須要經過next()方法不斷去取下一個內容 #不能隨機的訪問集合中的某個值,只能從頭至尾依次訪問 #訪問到一半時,不能日後退 #便於循環比較大的數據集合,節省內存 #迭代器本質上也是經過next一個一個去取,咱們在用的時候直接用for循環迭代就能夠了 #生成器須要本身寫,而迭代器直接用for循環就能夠了 def xrange(n): start = 0 while True: if start > n: return yield start start += 1 for x in xrange(10): print(x)
生成器與迭代器綜合練習:python
#! usr/bin/env python # -*-coding = utf-8 -*- #生成器 def range(n): start = 0 while True: if start < n: yield start start += 1 else: return #迭代器 for i in range(10): print(i)
對於生成器的理解要注意,在例程中,咱們使用的是一些整數,既然是生成器,那麼可不能夠生成別的東西,好比相似於列表或者字典這樣的數據結構,能夠,如:數據結構
li = [1,2,3,4,5] for item i li: yield{ 'index':item }
好比上面相似的寫法,也是個生成器,不過生成器中的數據結構是字典形式的 函數