放上原文:迭代器 · explore-python
一、迭代器(Iterator)
1.在 Python 中,迭代器是指遵循迭代器协议(iterator protocol)的对象。
2.迭代(Iteration)与可迭代对象(Iterable)
3.可以使用Python 内置的 hasattr()
函数来判断一个对象是不是可迭代的;也可以使用 isinstance()
进行判断
4.我们熟知的字典(dict {})、元组(tuple ())、集合(set)、字符串对象('')和列表[],都是可迭代的,但他们不是迭代器!
5.迭代器是指遵循迭代器协议(iterator protocol)的对象。
同样可以使用hasattr()
进行判断,【】
虽然元组、列表和字典等对象是可迭代的,但它们却不是迭代器!对于这些可迭代对象,可以使用 Python 内置的 iter()
函数获得它们的迭代器对象:
6.
二、生成器(generator)
简言之,就是 next
使函数执行,yield
使函数暂停
进阶使用
三、上下文管理器
以上是with 语句执行过程没有出现异常的情况。
下面是出现异常的情况。
在上面的例子中,方法__exit__中没有return语句,那么执行完该方法返回的是NONE。故按照前面讲的执行步骤,:“出现异常时,如果 __exit__(type, value, traceback)
返回 False 或 None,则会重新抛出异常,让 with 之外的语句逻辑来处理异常”。
对 __exit__
方法做一些改动,加上return True。则不会返回异常。
内建对象使用 with 语句
contextlib 模块
① yield 产生的值赋给了 as 子句中的 value 变量。
② 执行with中的语句 print ('value is: %s' % value)
③ 执行yield后的语句 print('after yield')
另外,需要强调的是,虽然通过使用 contextmanager 装饰器,我们可以不必再编写 __enter__
和 __exit__
方法,但是『获取』和『清理』资源的操作仍需要我们自己编写:『获取』资源的操作定义在 yield 语句之前,『释放』资源的操作定义在 yield 语句之后