""" Python 当中的生成器"""
""" 生成器表达式 生成器当中 三个方法:close,send,throw()
Python 3有一个内置函数next(),
它通过调用其next ()方法从迭代器中检索下一个项目,或者通过
生成器对象检索下一个项目
"""
""" 创建生成器对象的表达式:"""
#表达式1
# tuple1 = (i for i in range(10))
# print(tuple1)
# print(next(tuple1))
"""
返回生成器对象
<generator object <genexpr> at 0x01304E70> """
#表达式2
#生成器表达式
# def token():
# a = yield 11
# print(a)
# b = yield 22
# print(b)
#创建一个生成器对象
# a = token()
# print(a)
""" 返回结果<generator object token at 0x01B44E70>"""
# a = token()
""" 生成器中,send,close,throw方法:
方法1:throw 方法是在迭代的过程当中抛出异常信息,
相对于异常处理当中:raise IndexError
"""
# a.throw(IndexError)
# print(next(a))
# print(next(a))
"""
方法2:close 方法,相对于迭代器,生成器,当中可以手动执行close
关闭的方法,来实现迭代终止的操作
如果使用close,则抛出异常StopIteration"""
# a.close()
# next(a)
""" send 方法可以和生成器内部的数据进行交互."""
# def my_func():
#
# print("=======START======")
# values1 = yield 22
# print("===1===",values1)
# values2 = yield 33
# print("===1===", values2)
# values3 = yield 44
# print("===1===", values3)
#创建一个生成器对象:
# a = my_func()
# print(next(a))
# print(next(a))
""" 此时我在进行下一步迭代的时候 打印values1 的属性返回的是空值
那么如果设置values1 的值呢,这个时候就需要用到send方法跟
生成器内部进行交互
=======START======
22
===1=== None
33
"""
# a = my_func()
# print(next(a))
# print(a.send("wuhan"))
"""此时可以看到 我send的wuhan其实是传给 my_func当中
的values1 变量
=======START======
22
===1=== wuhan
33
"""
#第一种使用数据类型进行存储的时候,他是直接将数据存储
#在序列当中是实际占用内存的.
# list1 = [i for i in range(50000)]
# print(list1)
#创建一个生成器,那么他是直接记录生成数据的规则,我需要
# 数据时可以通过迭代器next进行取值,不会占用实际的内存
tuple1 = (i for i in range(50000))
print(next(tuple1))