'''
生成器: generator
1,通過列表推導式
g = (x+1 for x in range(4))
2,函式+yield
def func():
...
yield
g = func()
產生元素
1,next(g)
2,g.__next__()
'''
from typing import Iterable
g = (x *3 for x in range(20))
print(type(g)) #<class 'generator'>
#方式1呼叫生成器
print(g.__next__())
print(g.__next__())
#方式2 系統自帶的方法 next()
print(next(g))
while True:
try:
e=next(g)
print(e)
except:
print('沒有更多的元素了')
break
#定義生成器的方式2 ,藉助函式完成
'''
步驟:
1,定義一個函式,函式中使用yield 關鍵字
2,呼叫函式,接收呼叫的結果
3,得到的結果就是生成器
4,藉助next() 或者(__next__)
'''
def func():
n= 0
while True:
n+=1
yield n
e = func()
print(e) #<generator object func at 0x000001FA4CE3BB88>
#生成器,應用協程
def task1(n):
for i in range(n):
print(f'正在搬第{i}塊磚')
yield None
def task2(n):
for i in range(n):
print(f'正在聽第{i}首歌')
yield None
g1 = task1(5)
g2 = task2(5)
while True:
try:
next(g1)
next(g2)
except:
break
'''
可以被next() 函式呼叫並不斷返回下一個值的物件稱為迭代器,Iterastor,只能前進不能後退
'''
#可迭代物件:1,生成器 2,元組,列表,集合,字典,字串
#判斷一個物件是否可以迭代?
list1 = [1,1,1,1,1,1]
f = isinstance(list1,Iterable)
print(f)