python 之 函数 生成器

2019-06-14 08:06:12来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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)

原文链接:https://www.cnblogs.com/mylu/p/11019820.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:python语言的鸭子类型和强类型语言的多态

下一篇:odoo通过actions.client进行自定义页面