# -*- 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('蒸鹿尾儿'))