Python那些事兒 Python中的生成器

2021-07-25 13:14:14 字數 1618 閱讀 2223

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...