Python之生成器
""" 生成器说明: 1、生成器一次只返回一个数据; 2、yield 把函数变成了一个生成器; 3、生成器函数的执行过程看起来就是不断地 执行->中断->执行->中断 的过程; 4、一开始,调用生成器函数的时候,函数不会立即执行,而是返回一个生成器对象; 然后,当我们使用 next() 作用于它的时候,它开始执行,遇到 yield 语句的时候,执行被中断,并返回当前的迭代值, 要注意的是,此刻会记住中断的位置和所有的数据,也就是执行时的上下文环境被保留起来; 5、当再次使用 next() 的时候,从原来中断的地方继续执行,直至遇到 yield ,如果没有 yield,则抛出异常。 """ def counter(): """ 1、调用该函数的时候不会立即执行代码,而是返回了一个生成器对象; 2、当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时, 函数开始执行,在遇到 yield 的时候会『暂停』,并返回当前的迭代值; 3、当再次使用 next() 的时候,函数会从原来『暂停』的地方继续执行,直到遇到 yield 语句, 如果没有 yield 语句,则抛出异常; """ i = 0 while i <= 5: yield i # 定义一个生成器 i += 1 print(counter()) # 返回一个生成器对象如:<generator object counter at 0x00000252D8E9CAC0> # 遍历生成器 for i in counter(): print(i, end=" ") """ 0 1 2 3 4 5 """ # 生成器一次只生成一个数据 c = counter() print() print(next(c), end=" ") # 0 print(next(c), end=" ") # 1 print(c.__next__(), end=" ") # 2 # ... c.close() # 关闭生成器,再次调用会抛异常 print() print("#### 生成器表达式 ####") t = (i ** 2 for i in range(1, 10)) for i in t: print(i, end=" ") # 1 4 9 16 25 36 49 64 81 #### send()方法:同next功能,但是会给yield表达式的变量赋值 #### def demo(): value1 = yield 1 print("value1", value1) value2 = yield 2 print("value2", value2) value3 = yield 3 print("value3", value3) print() d = demo() print(d.__next__()) print(d.send(5)) print(d.__next__()) """ 1 value1 5 2 value2 None 3 """