第八章、生成器

第八章、生成器

一、什么是生成器

生成器本质是迭代器,不仅仅是迭代器,除了迭代器的作用其他作用也没多少,生成器提供了方便的自定义迭代器的途径。

二、yield关键字

迭代器具有__iter__h和__next__的方法

def func():
    return 123
f = func():
print(f)  #123
#我们调用了func函数,那他当然是123了

然后我们看return和yield有什么区别吧

def func():
    yield 456   # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
    print(789)  # yield会停止函数,当运行下一次next才会继续运行下面的代码
    yield 12345  # 一个yield对应一个next
    print(369789)
f = func()  #生成器
print(f)   # <generator object func at 0x000001F0E44237D8>
f_iter = f.__iter__()
print(f_iter.__next__())#123
print(f_iter.__next__())#12345
print(f_iter.__next__())#报错
#但是这样的话会报错,有多少yield关键字就有多少next,next多了会报错StopIteration

然后总结一下:

yield的三个特性

  1. yield可以把函数变成生成器(自定制的迭代器对象,具有__iter____next__方法)
  2. yield可以停止函数,下一次next再次运行yield下面的代码
  3. 有n个yield生成器就有n个元素,就可以next n次,第n+1次next会报错

return的特性

  1. 返回值
  2. 终止函数

三、利用yeild关键字制作生成器制作一个range方法

  1. 首先要把可迭代对象变成迭代器,即使用yield关键字使让range函数成为生成器

  2. 丢一个10 通过for 循环把range迭代出(for循环使用了next方法的原理)所有的元素0到9

   def range(*args):
       if len(args)==3:
           a=args[0]
           while args[1]>a and a>=args[0]:
               yield a
               a+=args[2]
       elif len(args)==2:
           if args[0]<args[1]:
               a=args[0]
               while a>=args[0] and a<args[1]:
                   yield a
                   a+=1
           elif args[0]>args[1]:
               a = 0
               while a >= 0 and a < args[0]:
                   yield a
                   a += args[1]
       elif len(args) == 1:
           a=0
           while a<args[0]:
               yield a
               a+=1
   
   for i in range(3,10,3):
       print(i)
#调用一下我自己做的函数(其实是生成器)
 for i in range(10,3):
 	print(i)
#结果正确,完美收场
0
3
6
9
posted @ 2019-08-14 15:50  得淼  阅读(158)  评论(0编辑  收藏  举报