# File : learning_013_generator_and_iterator.py # Datetime : 2022/4/15 0015 17:44 import sys # 生成器generator 和迭代器iterator # 在Python中生成器函数与迭代器协议的概念联系在一起。包含yield语句的函数会被特地编译成生成器。 # 当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。 # 函数也许会有个return语句,但它的作用是用来yield产生值的。 # 生成器(generator): # 生成器(generator)的两种创建方式 # 1. 列表 元组 字典推导式 # 类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 # 如: # lis = (x for x in range(10)) # 2. 使用yield函数 # 常规函数的定义,但是,使用yield语句而不是return语句返回结果。 # yield语句语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行 # 如使用yield from生成一个斐波那契数列 # def fibonacci(max): # 斐波那契列数生成器 # a, b = 0, 1 # while b < max: # yield b # a, b = b, a + b # # # def fibonacci_wrapper(fun_iterable): # 生成器包装 # yield from fun_iterable # # # warp = fibonacci_wrapper(fibonacci(99)) # 可迭代对象包装 # for i in warp: # print(i) # 生成器(generator)的作用: # 1、节省资源消耗,和声明序列不同的是生成器在不使用的时候几乎不占内存,也没有声明计算过程! # 2、使用的时候,生成器是随用随生成,用完即刻释放,非常高效! # 3、可在单线程下实现并发运算处理效果。 # 迭代器iterator # 生成器都是迭代器,迭代器不一定是生成器 # python中可迭代的数据类型有:list/dict/tuple/string/set/bytes。 # 整形是不可迭代数据类型。可以通过collections模块的Iterable来进行判断。 # 可迭代对象: 有__iter__方法(),有__next__()方法 # 迭代器有两个基本的方法:iter() 和 next()。 lis = [1, 2, 3] it = iter(lis) # 创建迭代器对象 for i in it: print(i) # 使用next()方法 lis2 = [1, 2, 3] it2 = iter(lis2) # 创建迭代器对象 while True: try: print (next(it2)) # StopIteration 异常用于标识迭代的完成,StopIteration 异常来结束迭代。防止出现无限循环的情况 except StopIteration: sys.exit() #迭代器和生成器的区别 # 三、迭代器和生成器的异同 # 都可以节约内存和空间 # 随取随用的特点方便、灵活 # 生成器一定是迭代器,可以使用迭代器的方法遍历;但迭代器不一定生成器 # 生成器是断点保存的机制确保随取随用,而迭代器一般是将可迭代对象转变而成。