您的位置: 网站首页> python进阶> 当前文章
生成器close()方法详解(StopIteration,GeneratorExit,RuntimeError)
老董-我爱我家房产SEO2020-05-18197围观,145赞
关于生成器的close()方法,本文主要讲解4个方面,通过如下几点可以彻底理解close()方法!
1、生成器使用 close() 方案后就无法再进行迭代,再使用next()函数会抛出 StopIteration 异常。
2、生成器调用 close() 方法会在程序停止运行的位置抛出 GeneratorExit异常 ,但前提是至少调用一次生成器的next方法后系统才会产生GeneratorExit异常,如果生成器没有启动则不会抛出异常。
3、生成器函数内捕获GeneratorExit异常后,可以继续执行剩余的代码,但剩余代码中不能再包含 yield 语句,否则会抛出RuntimeError异常
4、GeneratorExit异常不能通过Exception捕获,Exception是常规异常的基类,而GeneratorExit并不是常规异常的基类,可以通过所有异常的基类BaseException来捕获。
第1点的代码:
def test(num):
for i in range(num):
yield i
print('我爱www.python66.com')
gen = test(3)
print(next(gen))
gen.close()
print(next(gen))
Traceback (most recent call last):
File "D:/pyscript/py3script/python66/test2/test.py", line 14, in <module>
print(next(gen))
0
StopIteration
第2点的代码:
# -*- coding: utf-8 -*-
def test():
try:
yield 1
except GeneratorExit:
print('GeneratorExit抛出')
gen = test()
print(next(gen)) # 生成器启动
gen.close()
print('======分界线===========')
def test():
try:
yield 1
except GeneratorExit:
print('GeneratorExit抛出')
gen = test()
gen.close() # 未启动生成器不会有异常
1 GeneratorExit抛出 ======分界线===========
第3点的代码:
# -*- coding: utf-8 -*-
def test():
try:
yield 1
except GeneratorExit:
print('GeneratorExit抛出')
print('我爱www.python66.com')
gen = test()
print(next(gen)) # 生成器启动
gen.close()
1 GeneratorExit抛出 我爱www.python66.com
# -*- coding: utf-8 -*-
def test():
try:
yield 1
except GeneratorExit:
print('GeneratorExit抛出')
yield 2
gen = test()
print(next(gen))
gen.close()
1 Traceback (most recent call last): GeneratorExit抛出 File "D:/pyscript/py3script/python66/test2/test.py", line 13, ingen.close() RuntimeError: generator ignored GeneratorExit
第4点的代码:
# -*- coding: utf-8 -*-
def test():
try:
yield 1
except BaseException: # GeneratorExit的基类
print('GeneratorExit抛出')
gen = test()
print(next(gen))
gen.close()
print('======分界线======')
def test():
try:
yield 1
except Exception:
print('GeneratorExit抛出')
gen = test()
print(next(gen))
gen.close()
1 GeneratorExit抛出 ======分界线====== 1
很赞哦!
python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群
相关文章
文章评论
-
生成器close()方法详解(StopIteration,GeneratorExit,RuntimeError)文章写得不错,值得赞赏


