9月20日生成器
生成器
生成器:自定义迭代器,生成器就是迭代器(由自己自造)
例子将函数变成生成器
def func():
    yield 123456789#yield会使函数func()变成生成器对象,因此这个函数就具有__iter__方法
f =func()#生成器
print(f)
f_iter=f.__iter__()#这一步是不能省略的
print(f_iter.__next__())
#结果为<generator object func at 0x0000020DA03BB8A0>
#123456789
yield会停止函数的特性:
def func():
    yield 123456789#yield会使函数func()变成生成器对象,因此这个函数就具有__iter__方法
    print('123')#yield会停止函数,当运行下一次next才会继续运行下面的代码,因为这里不是值只是输出,所以下一次next没有可以得到值就会报错
f =func()#生成器
print(f)
f_iter=f.__iter__()#这一步是不能省略的
print(f_iter.__next__())
#结果只有123456789没有123因为yield将函数停止了,只有运行下一次next才会有123
如果我多输入一次__ next __ ()就会报错
def func():
    yield 123456789#yield会使函数func()变成生成器对象,因此这个函数就具有__iter__方法
    print('123')#yield会停止函数,当运行下一次next才会继续运行下面的代码,因为这里不是值只是输出,所以下一次next没有可以得到值就会报错
f =func()#生成器
print(f)
f_iter=f.__iter__()#这一步是不能省略的
print(f_iter.__next__())
print(f_iter.__next__())#因为没有得到需要的值所以报错StopIteration
当yield出现StopIteration错误该如何处理,出现这个错误的原因是关键字yield会停止函数,当再次运行next才会被停止后没有运行的代码。但是此代码里面只有123456798一个值,没有多余的值提供给 __ next __ 所以就会报错
解决方法给此代码里面添加一个值
def func():
    yield 123456789#yield会使函数func()变成生成器对象,因此这个函数就具有__iter__方法
    print('123')#yield会停止函数,当运行下一次next才会继续运行下面的代码,因为这里不是值只是输出,所以下一次next没有可以得到值就会报错
    yield 456321#一个yield对应一个next
f =func()#生成器
print(f)
f_iter=f.__iter__()#这一步是不能省略的
print(f_iter.__next__())#这里的值为123456789
print(f_iter.__next__())#这里的值为456321
yield的特性
通过上面的代码得知yield的三个特性
1.yield可以把函数变成生成器(自定制的迭代对象,具有 __ iter __ 和 __ next __ 方法)(这个是核心的功能)
2.yield可以停止函数,再下一次next才会再次运行yield下面的代码
3.有n个yield生成器就有n个值,少一个值就会报错StopIteration
简写格式如下:
def func():
    yield[1,2,3]
    yield 101102103
g=func()
for i in g:
    print(i)
当函数内有return时,return的特征为:1.返回值、2.终止函数
def func():
    yield[1,2,3]
    return
    yield 101102103#这里的值是无法被输出,因为上面的return终止了函数
g=func()
for i in g:
    print(i)
生成器实例
自己定制一个基础的range方法
def range(x):
    cishu=0
    while cishu < x:
        yield cishu
        cishu+=1
for i in range(5):#这里的range函数是自己定制的,只具有确定终值的功能
    print(i)
上面的range()只具备确定终值的功能,不具备确定初值和步长的功能
下面的代码就能实现所有range()的功能
def range(star,end,step=1):
    while star < end :
        yield star
        star+=step
for i in range(1,20,2):
    print(i)
略微复杂点定制具有初值和终值的range()
def range(*args,step=1):
    args=list(args)
    if len(args) == 1:#这一块是初值的编辑
        count = 0
        while count < args[0]:
            yield count
            count += step
    elif len(args) == 2:#这一块是终值的编辑
        while args[0] < args[1]:
            yield args[0]
            args[0] += step
for i in range(1,10):
    print(i)
生成器就是相当于给迭代器服务的,假设我有一个需要的对象不是可迭代对象,那我就要给它变成生成器在带入进去

                
            
浙公网安备 33010602011771号