python生成器和迭代器

一、 python生成器

生成器:python中將一邊循環一邊計算的這種機制稱爲生成器。簡單的說就是爲了節約內存空間,產生了一種計算規則,在取下一個數的時候按照計算規則取出即可。生成器必定是一個迭代器。

(1) 生成器基本操作

# 創建生成器的方式一:
“”“把列表生成式的[]改爲()即可 ”“”
# 列表生成式:
a = [x * 2 for x in range(10)]
# 生成器:
b = (x * 2 for x in range(10))
print(a)  #  [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print(b)  # <generator object <genexpr> at 0x7f07650130d0>

# 創建生成器的方式二:
"""用程序生成斐波納契數列:
斐波納契數列:除第一個和第二個數外,任意一個數都可以由前兩個數相加得到:
1,1,2,3,5,8,13,21,34.......
a, b = 0, 1
a, b = b, a+b
上面的代碼即可生成斐波納契數列。 
"""
def Num():
	a, b = 0, 1 
	for i in range(5):
		print(b)
		a, b = b, a+b
Num() # 調用函數

"""只要將上面代碼中的print(b)更換爲yield b 即可將其作爲生成器"""
def Num():
	a, b = 0, 1 
	for i in range(5):
		yield b  #yield的作用使函數停止,返回後面的值b
		a, b = b, a+b
“”“函數中只要加了yield 就是一個生成器了,調用這個生成器時不能用函數的方式調用,要創建一個生成器對象來接收:即 p = Num() ”“”
# 取出每一個數:                                                     
p = Num()
next(p) # 每次只取出一個值
"""如果一次將所有的值都取出來,應該用for 循環進行,完整代碼如下"""
def Num():
	a, b = 0, 1 
	for i in range(5):
		yield b  #yield的作用使函數停止,返回後面的值b
		a, b = b, a+b
p = Num()
for num in p:
	print(num)
# 輸出結果: 1,1,2,3,5
“”“注意: 只要創建了生成器對象不僅可以用next(p)調用,還可以用p.__next()__調用,這兩種方式是等價的。”“”

(2) send函數

def test():
	i = 0 
	while i < 5 :
		temp = yield i #這裏yield返回的值是None,所temp=None                
		“”“要使得temp不爲None,需要使用send函數”“”
		print(temp)
	
t = send()
# next(t)
t.send("ceshi") # 不僅會起到next(t)的作用,而且還會將值“ceshi”賦值給temp
所以send的作用是給內部值傳參數,瞭解即可。

(3) 生成器的作用--------解決多任務

def test1():
	while True:
		print("--1--")
		yield None    # 函數停止


def test2():
	while True:
		print("--2--")
		yield None

t1 = test1()
t2 = test2()
while True:
	t1.__next__() # 這裏運行一次停止,然後執行下一句,下一句運行一次停止,繼續執行上一句,如果這樣依次交替,如果切換的足夠快,看上去就像是test1() 和 test2()同時執行一樣。
	t2.__next__()
	

二、python迭代器

(1) 迭代器概述
簡單的說,可以被next()函數調用並不斷返回下一個值的對象稱爲迭代器(Iterator)。

可以用for循環的對象統稱爲可迭代對象Iterable。
可迭代的類型有:
1、集合數據類型: list、tuple、dict、set、str
2、生成器(generator)、帶月yield 的生成器函數

(2) 判斷是否可以迭代

“”“isinstance()判斷一個對象是否是Iterable對象”“”
from collections import Iterable
isinstance[], Iterable) # 判斷[]列表是否是可迭代對象。
判斷結果: True

(3) 創建迭代器

“”“iter()函數用來創建迭代器””“
a = [11, 22, 33, 44, 55]
b = iter(a) # 創建迭代器
next(b) # 取值

注意: 區別單詞Iterable 可迭代 Iterator 迭代器

發佈了32 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章