迭代器的好处是可以节省内存,如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。 python中提供的生成器1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行 2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 生成器Generator:本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现) 特点:惰性运算,开发者自定义 生成器函数一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。 import timedef genrator_fun1(): a = 1 print('现在定义了a变量') yield a b = 2 print('现在又定义了b变量') yield bg1 = genrator_fun1() # 不执行函数 得到一个生成器对象print('g1 : ', g1) # 打印g1可以发现g1就是一个生成器 注意这里并没有执行函数print('-' * 20) # 我是华丽的分割线print(next(g1))time.sleep(1) # sleep一秒看清执行过程print(next(g1))'''g1 : <generator object genrator_fun1 at 0x7fb5aae851d0>--------------------现在定义了a变量1现在又定义了b变量2''' 生成器有什么好处呢?就是不会一下子在内存中生成太多数据
读取文件 import timedef tail(filename): f = open(filename) f.seek(0, 2) #从文件末尾算起 while True: line = f.readline() # 读取文件中新的文本行 if not line: time.sleep(0.1) continue yield linetail_g = tail('tmp')for line in tail_g: print(line) next() 和 send()next()让包含yield的函数(Generator)执行 第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错的,因为没有yield语句来接收这个值。
def x(): print('bai wei') m = yield 5 # m的值就是send传的 hi print(m) d = yield 12 print('reach here ')c = x()next(c) # 启动generatorc.send('hi')'''bai weihi''' 第一次调用时 不能使用send传一个非None的值
send(msg) 与 next()的返回值send(msg) 和 next()是有返回值的,它们的返回值很特殊,返回的是下一个yield表达式的参数。比如yield 5,则返回 5 def h(): print('Wen Chuan') m = yield 5 # m的值就是send传过来的 Fighting! print(m) d = yield 12 print('We are together!')c = h() # 不执行函数 得到一个生成器m = next(c) # m 获取了yield 5 的参数值 5d = c.send('Fighting!') # d 获取了yield 12 的参数值12print('We will never forget the date', m, '.', d)'''Wen ChuanFighting!We will never forget the date 5 . 12''' |
|