前几天遇到了这个yield,不知道是干嘛的,这里学习整理下,主要参考了:
如何理解Python关键字yield
Python高级特性
上面介绍的都很好,这里就根据自己的理解,简单整理下。
#1. 什么是迭代
常见的list、tuple等集合,我们会通过遍历,比如for循环来获取每一个元素,这就是迭代。这些可以遍历的对象,也叫做可迭代对象
小例子
我们怎样判断一个对象是否可以去迭代呢?可以使用collections模块的Iterable
2. 列表生成式(List Comprehensions)
一个非常简单的方式来生成list,像这样:
3.迭代器
前面,我们说了for循环和可迭代对象,像这种可以使用for循环不断取出先一个元素的对象,就叫做迭代器(Iterator)。迭代器不单单可以使用for循环来遍历,
还可以使用next()函数不断获取下一个元素,当没有下一个元素时,会抛出StopIteration异常。
我们可以使用collections模块的Iterator来判断一个对象是否为迭代器
|
|
创建一个迭代器有3中方式:
- 为对象创建 iter()和next()方法
- 内置的iter()可以将可迭代对象转换为迭代器
- 生成器
|
|
4. 生成器
上面,我们使用list()或者[],很简单方便的生成了一个列表,只要我们将[]替换为(),就创建一个一个generator。生成器可以一边循环,一边计算生成下一个元素,而不是像list一样,一下生成所有的数据。
通常,我们使用yield语句可以返回一个生成器,很多例子,这里都是举一个斐波那契数列
yield类似return,只不过他返回的是生成器,调用了next()之后,
我们调用fab的时候,执行到yield,会返回一个生成器,当调用next()后,程序会回到yield停止的地方继续往下执行
这样,就是每次只生成当前元素,而不是一下子生成所有的元素;
当然,for循环替我们调用了next(),并处理了StopIteration异常。
好了,梳理好上面这些概念,到yield这里,其实还好,平时在理解下,多用用,好,就到这。