生成器
# 什么是生成器?
# 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,
# 而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,
# 如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
#
# 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
# 这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator
#
# 生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,
# 使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。
#
# 生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,
# 但是,不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,
# 而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器
#生成器两种形式
# 生成器函数:也是用def定义的,利用关键字yield一次性返回一个结果,阻塞,重新开始
#
# 生成器表达式:返回一个对象,这个对象只有在需要的时候才产生结果
#***************************************************
# def f(x):
# i=0
# while i
# i=i+1
# return 'hello'
#a=f(5)
#1.next方法遍历
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
#2.一般用for遍历
# for i in a:#一般用for遍历
# print(i)
#3.用for遍历之后 函数的return值无法访问,用循环遍历加异常捕获的方式获取返回值,这个值在异常对象的value中
# while True:
# try:
# print(next(a))
# except StopIteration as e:
# print(e.value)
# break
#*******************************************************************************************************************
# 列表生成式
lis = [x * x for x in range(10)]
print(lis)
# 生成器表达式
generator_ex = (x * x for x in range(10))
print(generator_ex,type(generator_ex))#是一个生成器地址
# https://www.cnblogs.com/wj-1314/p/8490822.html