生成器知识点整理
Posted chacecai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器知识点整理相关的知识,希望对你有一定的参考价值。
列表生成式
- a = [i + 1 for i in range(10)]
生成器(generator)
- 一边循环,一边计算的机制
- 一种数据类型,这种数据类型自动实现了迭代器协议,是一个可迭代对象。
- 实现延迟计算,按需执行,节省内存
生成器分类
- 生成器函数,使用yield返回结果和挂起状态
- 生成器表达式,生成器返回按需生产结果的对象,用for循环或者next()方法调用。
yield
- 一个函数定义中包含yield,那么调用这个函数就是一个generator
- return在生成器里,代表生成器的终止,报StopIteration错误
yield的作用
- yield可以返回生成器内部数据
- 挂起当前函数执行过程
- 继承当前状态
- 再次调用生成器,从上次挂起的位置继续执行
生成器的send方法
- yield可以接收函数外部信号
generator.send(sign)的作用
- 唤醒generator,并继续执行
- 发送一个信息到生成器内部
生成器调用方法
- next()调用
for循环调用
- 能获取yield的返回
- 获取不到return语句的返回值
- 需要获取return,必须捕获StopIteration错误,返回值包含在StopIteration.value
可迭代对象(Iterable)
- 可以直接作用于for循环的对象统称为可迭代对象
- 数据集合(list、tuple、dict、set、fronzset、str)
- 生成器 generator
迭代器(Iterator)
- 可以被next()函数调用并不断返回下一个数值的对象称为迭代器
迭代器表示的是一个数据流,可以把这个数据流看做一个有序序列,但不能提前知道长度
next()的使用
- next(Iterator)
- Iterator.__next__()
数据集合和生成器
- 都是可迭代对象(Iterable)
- 生成器是一个有序数据流,可以表示无限大的数据流
- 数据集合是有限长度
- 都可以for循环调用
- 只有生成器可以被_next()_调用
可以使用isinstance()判断一个对象是否是Iterable对象:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance(‘abc‘, Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
可以使用isinstance()判断一个对象是否是Iterator对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance(‘abc‘, Iterator)
False
以上是关于生成器知识点整理的主要内容,如果未能解决你的问题,请参考以下文章