生成器

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)
View Code

 

  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)
View Code

 

以上是关于生成器的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Codegen 没有找到生成代码的操作或片段

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

vscode代码片段生成vue模板

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

vs 2010代码片段