您的位置: 网站首页> python进阶> 当前文章

生成器close()方法详解(StopIteration,GeneratorExit,RuntimeError)

老董-我爱我家房产SEO2020-05-18197围观,150赞

  关于生成器的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, in 
    gen.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。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    生成器close()方法详解(StopIteration,GeneratorExit,RuntimeError)文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 客服微信:a772483200