生成器
Posted whylinux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器相关的知识,希望对你有一定的参考价值。
1.生成器
1 # 生成器 本质是迭代器 2 3 # 写生成器的方式,一种是写生成器函数:本质上就是我们自己写的函数。 另一种是写生成器表达式 4 5 6 # 生成器函数 7 8 # 生成器函数定义:只要含有yield关键字的函数都是生成器函数,yield必须要写在函数里面,一个函数里面有了yield就不能有return了 9 # yield不能与return共用。生成器函数执行之后(函数内代码不被执行)会返回一个生成器,生成器有__iter__方法和__next__方法,所以也是一个迭代器 10 # def generator(): # generator英文单词生成器意思 11 # print(1) 12 # yield ‘a‘ 13 14 # ret = generator() 15 # 生成器函数执行之后会返回一个生成器 16 # print(ret) # <generator object generator at 0x000002341C77E570> 17 18 # 当执行了生成器的__next__方法后,生成器函数的代码才第一次触发了 19 # print(ret.__next__()) # 1 20 # # a 21 22 # yield 与 return不同,遇到return后直接返回,遇到yield后不会直接返回, 23 # 当第一次用__next__走生成器时,会调用第一个yield之前的代码,并得到第一个yield的返回值。 24 # 当第二次用__next__走生成器时,会调用第二个yield之前和第一个yield之间的代码,并返回第二个yield的值 25 # 每一次只在内存中生成一个yield和yield之前代码,被运行后的yield会在内存中消失 26 def generator(): 27 print(1) 28 yield ‘a‘ 29 print(2) 30 yield ‘b‘ 31 32 g = generator() 33 # print(g.__next__()) # 1 a 34 # print(g.__next__()) # 2 b 35 36 # 因为生成器有__next__与__iter__方法,所以也是一个迭代器,所以可以被for循环 37 for i in g: 38 print(‘c‘, i) 39 40 # 用生成器生产20个娃哈哈字符串,每一次要的时候生成一个给一个,给了一个之后再生成器中就消失一个 41 # 生成器函数 42 def wahaha(): 43 for i in range(20): 44 yield ‘娃哈哈 %s‘ % i 45 46 for i in wahaha(): # wahaha()生成器函数运行后得到一个生成器对象,可迭代,每一次调用都会运行一次yield和之前的,运行后在生成器对象中消失这个yield和之前的 47 print(i) 48 49 50 l = [1, 2, 3, 4 , 5] 51 52 for i in l: # list是可迭代的,不是一个迭代器,当这句话执行后,for循环将list变成了一个迭代器拥有了__next_方法,先加的__next__ 53 print(i) 54 55 for i in l: # 所以两个for循环了l,l的值没有变,因为list中的__next__方法是for循环时先加的 56 print(i)
2.用生成器监听用户输入文件中的内容,用户输入一行则监听处理一行
1 # 用户输入内容到文件,我们监听用户输入的内容 2 # 用户一边输入,我们一边监听 3 4 # f = open(‘file‘, encoding=‘utf-8‘) 5 # 6 # while True: 7 # line = f.readline() # 读文件内容,文件内容读完了会返回空不会报错 8 # if line: 9 # print(line.strip()) 10 11 # 现在用一个通用的函数去实现,用生成器去实现,读一行做了处理后,在读一行,想读在读,不想读不读 12 def tail(filename): 13 f = open(filename, encoding=‘utf-8‘) 14 while True: 15 line = f.readline() # 读文件内容,文件内容读完了会返回空不会报错 16 if line.strip(): 17 yield line.strip() 18 19 20 for i in tail(‘file‘): 21 if ‘python‘ in i: # 如果python字符在用户输入的这一行内容在怎么怎么样 22 print(i)
以上是关于生成器的主要内容,如果未能解决你的问题,请参考以下文章