博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成器
阅读量:6998 次
发布时间:2019-06-27

本文共 2485 字,大约阅读时间需要 8 分钟。

  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)  # 
17 18 # 当执行了生成器的__next__方法后,生成器函数的代码才第一次触发了19 # print(ret.__next__()) # 120 # # a21 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 a34 # print(g.__next__()) # 2 \n b35 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' % i45 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

  

  3.补充

1 # 从生成器中取值的几个方法 2     # next 3     # for 4     # 数据类型的强制转换(这种方法不好,不省内存) 5 def wahaha(): 6     for i in range(20): 7         yield '娃哈哈 %s' % i 8  9 g = wahaha()10 l = list(g) # 将生成器强制类型转换,会一次性的将所有要生成的数据都放入到了这个list中,不省内存11 print(l)
View Code

 

  4.生成器与迭代器共同特点:惰性运算,不管他要值时,他就不干活,并且你要一次,他只给一个,每一个生成器中的数据只能取一次,之后就没有了

转载于:https://www.cnblogs.com/whylinux/p/9581871.html

你可能感兴趣的文章