函數內有yield關鍵字,再調用函數就不會馬上執行函數體代碼,會獲得一個返回值,該返回值就是生成器,生成器本質就是迭代器app
def chicken():
print('=====>first')
yield 1
print('=====>sencond')
yield 2
print('=====>third')
yield 3
obj=chicken()
#生成器本質就是迭代器,也就是說生成器的玩法其實就是迭代器的玩法
print(obj.__iter__() is obj)
res=obj.__next__()
print(res)
res1=obj.__next__()
print(res1)
res2=obj.__next__()
print(res2)
一、iter_obj=obj.iter(),拿到迭代器 二、出發iter_obj.next(),拿到該方法的返回值,賦值給item 三、周而復始,直到函數內不在有yield,即取值完畢 四、for會檢測到StopIteration異常,結束循環函數
yield功能: 一、提供了一種自定義迭代器的方式 二、yield能夠返回屢次值ui
def chicken():
print('=====>first')
yield 1
print('=====>sencond')
yield 2
print('=====>third')
yield 3
obj=chicken()
for item in obj:
print(item)
range()spa
def my_range(start,stop,step=1):
n=start
while n < stop:
yield n #yield 4
n+=step #5
obj=my_range(3,7,2) #3,5,
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
print(obj.__next__())
def my_range(start,stop,step=1):
n=start
while n < stop:
yield n #yield 5
n+=step #2
for item in my_range(5,10,2):
print(item)
def eat(name):
print('%s ready to eat' %name)
food_list=[]
while True:
food=yield food_list # food='骨頭'
food_list.append(food) #food_list=['泔水','骨頭']
print('%s start to eat %s' %(name,food))
dog1=eat('alex')
1、必須初始化一次,讓函數停在yield的位置
res0=dog1.__next__()
print(res0)
接下來的事,就是喂狗,send有兩方面的功能
1、給yield傳值
2、同__next__的功能
res1=dog1.send('泔水')
print(res1)
res2=dog1.send('骨頭')
print(res2)
res3=dog1.send('shit')
print(res3)