python學習之關於生成器的學習

2022-07-10 08:57:15 字數 1636 閱讀 3665

a=[0,1,2,3,4,5,6,7,8,9]

print("此處輸出的是手寫列表",a)

b=a[0:4]

print("此處輸出的是手寫列表的切片展示",b)

#這個是列表生成

c=[i+1 for i in range(10)]

print("此處輸出的的列表生成的的切片展示",c)

d=c[0:5]

print(d)

#這就是生成器

e=(i+2 for i in range(10))

print("此處輸出的是生成器",e)

print(e.__next__())

上面**輸出結果為

此處輸出的是手寫列表 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

此處輸出的是手寫列表的切片展示 [0, 1, 2, 3]

此處輸出的的列表生成的的切片展示 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[1, 2, 3, 4, 5]

此處輸出的是生成器 at 0x000001785d52c7d8>

2上邊就是從列表到生成器的變化過程。

為什麼print(e)

的結果是乙個位址呢。

因為在這個地方儲存了乙個演算法,就是自動加以的演算法。

生成器不是列表是乙個過程,乙個還沒有開始的過程。

不能像列表一樣可以直接切片提取。

操作方法也只有乙個「__next__」,即下乙個計算。

def

fib3(max):

x=1y=0

z=0while z

print

(x) y,x= x,x+y

z+=1

return"脫離

"fib3(10)

print("

**********=")

deffib4(mac):

a=1b=0

c=0while c

yield

a b,a= a,a+b

c+=1

return"脫離

"f=fib4(10)

print(fib4(10))

f.__next__

()f.

__next__

()f.

__next__

()print(f.__next__())

從上面**中可以看到,乙個函式如果將輸出print改為yield那麼這個函式就變成了乙個發生器,也沒有了函式的功能和特性了。

但是函式的計算方法被完整的保留下來。

並且可以通過_next_方法乙個個的讀取下乙個資料。

**的執行結果為

112

35813

2134

55**********=

3

由此可以看出_next_方法一次只可以執行一行,如果資料多多麼麻煩啊。

可採用我們之前學習的迴圈方法。

關於next和send的用法:

next就是讓這個生成器走一步。

send則是將()中的值返回給yield然後走一步。

python之生成器

使用生成器表示式取代列表解析可以同時節省cpu 和 記憶體 ram 如果你構造乙個列表的目的僅僅是傳遞給別的函式,比如 傳遞給tuple 或者set 用生成器表示式替代吧 def ord map a string for c in a string yield ord c gen ord map u...

python之生成器

先來介紹下迭代器 迭代器即迭代取值的工具 迭代 的意思就是重複的基於上一次的結果取值 迭代器可以不依賴索引取值 取值 取乙個值就會少乙個,取完了,還取值就會報錯 1.什麼是生成器 在函式內但凡出現yield關鍵字,在呼叫函式就不會執行函式內 會返回乙個迭代器物件的值,該值稱之為生成器 強調 生成器的...

Python之生成器

通過列表生成式,我們可以產生列表,但是列表容量肯定有限,如果建立乙個很大的列表元素,要占用大量的記憶體空間,如果我們只要列表前面的元素,則後面的儲存空間大大浪費,這時候我們需要引出python生成器,這樣就必要建立完整的列表,從而大大節省空間,我們稱之為 generator.建立生成器方法一 使用 ...