生成器

'''

1 什么是生成器?
在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码。调用函数会返回一个值,该值称之为生成器
生成器本质就是迭代器

2、为什么要有生成器?
可以自定义一个迭代器,即生成器
生成器是一种自定义迭代器的方式
生成器都是迭代器

3、如何用生成器


'''

def func():
print('first1')
print('first2')
print('first3')
yield 1 #暂停
print('second1')
print('second2')
print('second3')
yield #暂停
print('third')
yield 3 #暂停
print('fourth')

func() # 调用函数,无事发生,函数体代码根本不会执行。

g=func() # 调用函数,返回的是一个生成器对象,不经过next()方法不会输出值。
print(g) # <generator object func at 0x00000146EE4A1F68>
print(next(g)) # 函数体执行,并且返回了1,并且暂停在了yield 1
print(next(g)) # 函数体从yield 1 开始执行,到yield停下,yield返回值为None
print(g.__iter__().__iter__().__iter__() is g) # True
res1=next(g)
print('第一次的返回值:',res1)

print('='*100)
res2=next(g)
print('第二次的返回值:',res2)

print('='*100)
res3=next(g)
print('第三次的返回值:',res3)

g = func()
print('='*100)
res4=next(g)
print('第三次的返回值:',res4)

for item in g: #g=iter(g) #item=next(g) next(g) 从g里取出一个返回值
print(item) # 会循环取出剩余的值 item 就是next取出的值(包括执行print部分)

i=range(1,1000) # 只是一个可迭代的对象
print(type(i)) # <class "range">
print(len(i)) # 999
print(i) # range(1,1000)
for item in range(1,100): # 列表把range(1,100)变成一个迭代器对象
print(item)


def my_range(start,stop,step=1):
while start < stop:
yield start # 暂停
start+=step
g=my_range(1,5,2) #1 3


print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

for item in g:
print(item)


总结yield的功能
1、提供一种自定义迭代器的方式
2、yield可以暂停住函数,并返回值

yield VS return
相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制
不同点:return只能返回一次值,yield可以返回多次值


了解知识
yield 值
就是单纯的返回一个值
x=yield
可以接受send进来的值并赋值给x
x= yield 值
返回值为x 并且可以接受send进来的值

def dog(name):
food_list=[]
print('狗哥 %s 准备开吃' %name)
while True:
food=yield food_list #暂停 food=yield='一桶泔水'
print('狗哥[%s]吃了<%s>' %(name,food))
food_list.append(food)


alex_dog=dog('alex')

print(type(alex_dog))
print(alex_dog)
<class 'generator'>
<generator object dog at 0x000001C014E41F68>

res1=next(alex_dog) # 初始化,即让狗准备好
print(res1)
next(alex_dog) # 等同于alex_dog.send(None)

next(alex_dog)

res2=alex_dog.send(('一泡翔','咖啡伴侣'))
print(res2)

res3=alex_dog.send('一桶泔水')
print(res3)




posted @ 2018-06-13 15:23  Roc_Atlantis  阅读(243)  评论(0编辑  收藏  举报