1defread_in_block(file_path):
2 block_size = 100
3 with open(file_path, "rb"
) as f:
4while
true:
5 con = f.read(block_size) #
每次讀取固定長度到記憶體緩衝區
6yield
con7
if con == b'':8
break
#如果讀取到檔案末尾,則退出
這裡給自己補充2個概念:
可迭代物件(iterables)
建立乙個列表list時,你可以逐個地讀取裡面的每一項元素,這個過程稱之為迭代(iteration)
迭代器(iterator)
迭代器代表乙個資料流物件,不斷重複呼叫迭代器的next()方法逐次的從返回資料流中的每一項,當沒有更多資料可用時,next()方法會丟擲異常stopiteration。此時迭代器物件已經枯竭了,之後呼叫next()方法都會丟擲stopiteration。迭代器需要乙個__iter__()方法用來返回迭代器本身,因此它也是乙個可迭代的物件。
生成器(generators)
生成器也是乙個迭代器,但是你只可以迭代它們一次,不能重複迭代,因為它並沒有把所有的值儲存在記憶體中,而是實時地生成值:
generators = (2*x for x in range(3))從結果上看用()代替的效果是一樣的,但是你不可能第二次執行for i in generators:,因為生成器只能使用一次for i in
generators:
print(i)
yield
yield是關鍵字,它類似於return,只是函式會返回乙個生成器。
乙個帶有 yield 的函式就是乙個 generator,它和普通函式不同,生成乙個 generator 看起來像函式呼叫,但不會執行任何函式**,直到對其呼叫 next()(在 for 迴圈中會自動呼叫 next())才開始執行。雖然執行流程仍按函式的流程執行,但每執行到乙個 yield 語句就會中斷,並返回乙個迭代值,下次執行時從 yield 的下乙個語句繼續執行。看起來就好像乙個函式在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。
yield 的好處是顯而易見的,把乙個函式改寫為乙個 generator 就獲得了迭代能力,比起用類的例項儲存狀態來計算下乙個 next() 的值,不僅**簡潔,而且執行流程異常清晰。
使用yield的乙個例子,從檔案讀取內容。
如果直接對檔案 物件呼叫read()方法,會導致不可**的記憶體占用。好的方法是利用固定長度的緩衝區來不斷讀取檔案內容。通過yield,我們不在需要編寫讀取檔案的迭代類,就可以輕鬆實現檔案讀取:
js將陣列按固定長度分割
最近遇到這個問題,需要每隔n個將陣列分開進行操作,開始想想覺得很簡單,結果楞是廢了一會兒功夫才實現,感覺最近業務邏輯寫少了,腦子也不太轉得動了,方法一是我當時寫的,後來發現其實很簡單 捂臉 此處做個記錄.方法一 function cutarray array,sublength if count a...
CSS定義a固定長度
今天遇到了乙個問題,就是在設定a固定長度的時候,width和height屬性不管用。導致a的背景background transparent url無法正常顯示。只好用 將其撐開,感覺這個辦法滿苯的,而且ff和ie對 長度解析不一樣。在網上查詢了半天,終於找到了解決方法,就是加上display bl...
python練習 字串按固定長度分隔
連續輸入2次字串,並按長度為8拆分每個字串,然後輸出到新的字串陣列,拆分規則是 若字串不是8整倍數需要右側補數字0,空字串不處理。思路一 輸入的字串長度不足8位或者不是8的整數倍,都右補0,補齊後的新字串滿足為8的整數倍,然後將新字串按照下標進行每8位分隔至乙個list中 思路二 輸入的字串長度不足...