day12 生成器

# -*- coding: utf-8 -*-
# @Time:
# @Auther: kongweixin
# @File:
# 需求造一个数量巨大的数据类型


# 如何得到自定义的迭代器(生成器):
# 在函数内一旦存在yield关键字,调用函数并不会执行函数体代码(yield可以返回多次值 与return返回值差不多)
# 会返回一个生成器对象,生成器即自定义的迭代器
"""

def func():
print('第一次')
yield 1
print('第二次')
yield 2
print('第三次')
yield 3
print('第四次')



g=func()#生成器(自定义的迭代器)
print(g)
# 生成器就是迭代器
g.__iter__()
g.__next__()



# 会触发函数体代码的运行,然后遇到yield停下来,将yield后的值,
# 当做本次调用的结果返回
res1=g.__next__()
print(res1)#返回值1


res2=g.__next__()
print(res2)#返回值2

res3=g.__next__()
print(res3)#返回值3

res4=g.__next__()#没值了就报错



# 调用len()
# len('aaa') #本质就是 'aaa'.__len__()

# 同理如下:
# next(g) # g.__next__()

# iter(可迭代对象) # 可迭代对象.__iter__()

"""
"""
# 应用案列#产生多个个值
def my_range(start,stop,step=1):
# print('start...')
while start < stop:
yield start
start+=step
# print('end....')


g=my_range(1,5,2) # 1 3
print(next(g))
print(next(g))
print(next(g))#取干净了就会报错

# 用for循环

for n in my_range(1,7,2):
print(n)


"""


# 总结yield:
# 有了yield关键字,我们就有了一种自定义迭代器的实现方式。
# yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,
# 而yield可以保存函数的运行状态挂起函数,用来返回多次值

# !!!我们可以编写装饰器来完成为所有表达式形式yield对应生成器的初始化操作,如下:!!!

def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper

@init
def eater():
# print('Ready to eat')
while True:
food=yield
print('get the food: %s, and start to eat' %food)


g=eater()
g.send("狗腿") #用于给food传参


# 表达式形式的yield也可以用于返回多次值,即变量名=yield 值的形式,如下:
# !!!! 变量名 = yield + 值 !!!!

def eater():
print("Ready to eat")
food_list=[]
while True:
food=yield food_list
food_list.append(food)

e=eater()
next(e)
e.send("骨头")
e.send("吃鸡")
e.send('蒸熊掌')
e.send('蒸羊羔')
print(e.send('蒸鹿尾儿'))
原文地址:https://www.cnblogs.com/kwkk978113/p/13301854.html