天天看點

python 生成器 通路生成器元素的方式 建立生成器的方式1,生成器2,通路生成器元素的方式3,建立生成器的方式

**

1,生成器

**

1,什麼是生成器?
		genterator,記錄一個算法,可以一邊循環一邊計算的一種機制

2,清單推導式
		更加耗時,更加開銷系統記憶體

3,存儲資料
		實際上算法的存儲

4,節約時間,節省記憶體開銷
           

清單推導式的時間開銷驗證如下:

import time   		   # 時間子產品
import sys     		   # 系統子產品 可以計算變量在記憶體中所使用的記憶體開銷 需要用到固定的方法去計算
time.clock()
list = [x for x in range(2, 1000000, 2)]
costTime = time.clock()
print("建立清單耗時%g" % costTime)
print("建立清單記憶體開銷%d" % sys.getsizeof(list))
           

運作結果為:

建立清單耗時0.0590449
建立清單記憶體開銷4290016
           

生成器推導式的時間開銷驗證如下:

import time     # 時間子產品
import sys      # 系統子產品 可以計算變量在記憶體中所使用的記憶體開銷 需要用到固定的方法去計算
time.clock()

list = (x for x in range(2, 1000000, 2))
costTime = time.clock()
print("建立生成器耗時%g" % costTime)
print("建立生成器記憶體開銷%d" % sys.getsizeof(list))
           

運作結果為:

建立清單耗時1.2402e-05
建立清單記憶體開銷88
           

**

2,通路生成器元素的方式

**

生成器裡面通路元素的第一種方式:for循環周遊

list = (x for x in range(2, 10, 2))
for i in list:
    print(i)
           

運作結果為:

2
4
6
8
           

通路生成器中的元素的第二種方式:使用next方法通路

list = (x for x in range(2, 10, 2))
print(next(list))
print(next(list))
print(next(list))  # 需要注意的是:超出生成器生成資料的範圍,會報錯StopIteration
           

通路生成器中的元素的第三種方式:使用__next__方法通路

list = (x for x in range(2, 10, 2))
print(list.__next__())
print(list.__next__())
print(list.__next__())
           

運作結果為:

2
4
6
           

通路生成器中的元素的第四種方式:使用send()方法通路

list = (x for x in range(2, 10, 2))
print(list.send(None))     			 #注意: 對第一個參數有要求必須給None參數,後續的參數可以随便給
print(list.send("abc"))
print(list.send("efg"))
           

運作結果為:

2
4
6
           

**

3,建立生成器的方式

**

方式1:

(x for x in range(10))   # 外面的是 () 小括号它就是一個生成器  外面是 [] 中括号它就是一個清單推導式
           

方式2:yield 用在函數中

def test():
    for x in range(5):
        yield x

f = test()
print(type(f))
print(next(f))
print(next(f))
           

運作結果為:

<class 'generator'>
0
1