python使用生成器對延遲操作提供了支援,所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。
gen_exp = (i for i in range(10)) #生成器表示式
print(gen_exp) #generator
# for i in gen_exp: #取出生成器表示式的值,for迴圈
# print(i)
print(gen_exp.__next__()) #next方法
print(gen_exp.__next__())
print(gen_exp.__next__())
print(gen_exp.__next__())
print(gen_exp.__next__())
g = (i for i in range(10**100))#生成器表示式
l = [i for i in range(10**100)]#列表生成式
print g.__next__()#更省記憶體,需要乙個取乙個
print l.__next__()#需要在記憶體中建立1行10**100列的序列
>>> gen = (i for i in range(5))
>>> gen
object
at 0x0000004de29a70a0>
>>> next(gen)
0>>> next(gen)
1>>> next(gen)
2>>> next(gen)
3>>> next(gen)
4>>> next(gen)
traceback (most recent call last):
file "", line 1, in
stopiteration
注意:generator儲存的是演算法,每次呼叫next方法,就計算出gen的下乙個元素的值,直到計算到最後乙個元素,沒有更多元素時,就stopiteration的錯誤。
當然,上面這種不斷呼叫next(gen),用著有點坑,正確的方法是使用for迴圈,因為generator也是iterator:
>>> g = (i for i in range(5))
>>> for i in g:
... print(i)
...012
34
小例子:
def
read_file
(fpath):
block_size = 1024
with open(fpath, 'rb') as f:
while
true:
block = f.read(block_size)
if block:
yield block
else:
return
如果直接對檔案物件呼叫 read() 方法,會導致不可**的記憶體占用。好的方法是利用固定長度的緩衝區來不斷讀取檔案內容。通過 yield,我們不再需要編寫讀檔案的迭代類,就可以輕鬆實現檔案讀取。 關於Python那些事兒
1.易於學習 python有相對較少的關鍵字,結構簡單,和乙個明確定義的語法,學習起來更加簡單。2.易於閱讀 python 定義的更清晰。3.易於維護 python的成功在於它的源 是相當容易維護的。4.乙個廣泛的標準庫 python的最大的優勢之一是豐富的庫,跨平台的,在unix,windows和...
Python那些事兒 資料放縮
討論如何對資料進行放縮 import numpy as np np.random.seed 10 x np.random.randomint 10,25 1.0 for i in range 10 defmin max x return round round xx min x 1.0 max x ...
python那些事兒pdf Python 那些事兒
python datatype 好久沒用,完了不少,寫個複習筆記以供以後使用 python 最基本的資料是序列,序列的基本特點就是可以索引,但是要記住python的index同c一樣,是從0開始的。序列的基本操作包括 indexing 索引 sliceing 分片 interation 迭代 以及a...