python 之 函数 生成器
5.10 生成器
函数内有yield关键字,再调用函数就不会立刻执行函数体代码,会得到一个返回值,该返回值就是生成器,生成器本质就是迭代器
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)
1、iter_obj=obj.iter(),拿到迭代器 2、出发iter_obj.next(),拿到该方法的返回值,赋值给item 3、周而复始,直到函数内不在有yield,即取值完毕 4、for会检测到StopIteration异常,结束循环
yield功能: 1、提供了一种自定义迭代器的方式 2、yield可以返回多次值
def chicken(): print('=====>first') yield 1 print('=====>sencond') yield 2 print('=====>third') yield 3 obj=chicken() for item in obj: print(item)
range()
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)
5.10.1 生成器之yield的表达式形式
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)