python-列表生成式、生成器、迭代器、可迭代對象區別

列表生成式 就是for的嵌套 實打實的生成全部【】

a = [n for n in range(1,5)]
a # [1,2,3,4]

生成器 採用惰性觸發 是迭代器的一種 ()

列表生成式 只要一執行就生成全部的元素
元組生成器只有觸發時才生成一個,相當於遊標一直向下移動,直到stopIteration
(n for n in range(1,5))

def num(min,max):
	for i in range(min,max):
		yield i
a = num()#返回一個生成器對象而非調用
#調用方式1
a = num.send(None)#也可對返回值進行處理send('result') result5 這樣連接
#調用方式2
next(a)
#等價
a.__next__()
#調用方式3
for i in num:
	print(i)
  • 單獨談談send的使用規則
    同next一樣可以獲得一個生成器元素內容,而且可以對 temp = yield i temp返回傳入的值
    但是
    (1).第一次使用生成器的時候 是用next獲取下一個值

(2).最後一個yield不能接受外部的值

def num():
    i = 0
    for i in range(5):
        temp = yield i
        print("-"+str(temp))


a = num()
# for i in num():
#     print(i)

next(a)
print(a.send("resu"))#不能獲取第一個生成器對象使用 他既可以返回生成器當前元素內容 遊客對yield賦值
print(a.send("resu"))
print(a.send("resu"))
print(a.send("resu"))
print(a.send(None))
  • 生成器和拆包語法實現斐波那契數列
def fiber():
	a,b=0,1
	for i in range(5):
		yield (b)# 停止 和 返回b
		a,b = b,a+b

a = fiber()
print(next(a))

  • 使用生成器實現協程多任務
def func1():
    while True:
        print("1")
        yield 1
def func2():
    while True:
        print("2")
        yield 2

f1=func1()
f2=func2()
while True:
    f1.__next__()
    f2.__next__()
  • 運行結果
    反覆 1 2 1 2 …

迭代器 可以使用next這種方法生成結果 只能向前 用一個才生成一個 節省內存

  • 生成器就是迭代器 而可迭代的字符串 列表 元組 字典不是迭代器
  • 迭代器可以使用for循環 這樣可以不奔潰但是遍歷出所有的值
def fiber():
	a,b=0,1
	for i in range(5):
		yield (b)# 停止 和 返回b
		a,b = b,a+b

for i in  fiber():
	print(i)

可迭代對象 包括能for循環 和 生成器

#判斷是否爲可迭代對象
from collections import Iterable
isintance([],Iterable)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章