码迷,mamicode.com
首页 > 其他好文 > 详细

生成器

时间:2018-09-04 01:50:30      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:二次   输入   实现   one   strip()   code   print   英文单词   就是   

  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 \n  a
34 # print(g.__next__())     # 2 \n 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

 

生成器

标签:二次   输入   实现   one   strip()   code   print   英文单词   就是   

原文地址:https://www.cnblogs.com/whylinux/p/9581871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!