要一直走下去

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1、使用yield  i

def my_generator(n):
    for i in range(n):
        temp = yield i
        print(f'我是{temp}')


g = my_generator(5)

print(next(g))      # 输出0
print(next(g))      # 输出1
print(g.send(100))  # 既把100传进去了,又保留了原来迭代应该输出的2
print(next(g))      # 输出3
print(next(g))      # 输出4

'''
0                #第一次迭代
我是None          #第二次迭代
1
我是100          #第三次迭代
2
我是None         #第四次迭代
3
我是None         #第五次迭代
4
'''

2、改为使用yield

def my_generator(n):
    for i in range(n):
        temp = yield
        print(f'我是{temp}')


g = my_generator(5)

print(next(g))     
print(next(g))
print(g.send(100))
print(next(g))
print(next(g))

'''
None
我是None
None
我是100
None
我是None
None
我是None
None
'''

总结:

yield语句的一般形式
  temp=yield expression (推荐:既可以返回迭代的值,也可以接受send传进去的参数并赋给temp)

  yield expression(也可以使用,只返回迭代的值)

  temp=yield (不推荐,)

  yield (不推荐,)


send(arg)方法总结:

  (1)它的主要作用是,当我需要手动更改生成器里面的某一个值并且使用它,则send发送进去一个数据,然后保存到yield语句的返回值
  (2)send(arg)的返回值就是那个本来应该被迭代出来的那个值。 这样既可以保证我能够传入新的值,原来的应该被迭代出来的值也不会弄丢

 

3、生成器抛异常

def my_generator():
    try:
        yield 'a'
        yield 'b'
        yield 'c'
        yield 'd'
        yield 'e'
    except ValueError:
        print('方法内--触发“ValueError"了')
    except TypeError:
        print('方法内--触发“TypeError"了')


g = my_generator()
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(ValueError))
print('-------------------------')
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(TypeError))
print('-------------------------')
print(next(g))

 

 4、加上while true

def my_generator():
    while True:
        try:
            yield 'a'
            yield 'b'
            yield 'c'
            yield 'd'
            yield 'e'
        except ValueError:
            print('方法内--触发“ValueError"了')
        except TypeError:
            print('方法内--触发“TypeError"了')


g = my_generator()
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(ValueError))
print('-------------------------')
print(next(g))
print(next(g))
print('-------------------------')
print(g.throw(TypeError))
print('-------------------------')
print(next(g))

 

 总结:在生成器中抛出异常,这个throw函数会返回下一个要迭代的值或者是StopIteration


生成器的启动和关闭:
启动
第一:直接使用next(g),这会直接开始迭代第一个元素(推荐使用这个启动)
第二:使用g.send(None)进行启动,注意第一次启动的时候只能传入None,如果传入其他具体的指则会报错哦!
关闭
如果一个生成器被中途关闭之后,在此调用next()方法,则会显示错误StopIteration
在一个生成器中,如果没有return,则默认执行到函数完毕时返回StopIteration

 

 

 

-

posted on 2021-10-18 17:07  要一直走下去  阅读(61)  评论(0编辑  收藏  举报