本文属于个人对知识总结,若有不当或错误,还望各位看官纠正
- 说到迭代器和生成器,就必须知道:
- 可迭代对象;
- 迭代器;
- 生成器.
重要的写在前面
迭代器和生成器的区别和关系
生成器是迭代器的一种
迭代器是惰性执行的,调用一次执行一次
1.迭代器是对已知数据进行操作next()
2.生成器是通过算法计算,返回数据,一般生成器函数都会有 yield 这个关键字
什么是可迭代对象呢?
- 我们已经知道可以对list、tuple、str等类型的数据使⽤for…in…的循环语法从其中依次拿到数据进⾏使⽤,这样的过程也被称为遍历,也叫迭代。
- 总结 : 可遍历
(for ... in ... :)
的对象,就是一个可迭代对象.
迭代器
-
判断是否是迭代器
- python中的 isinstance() 可以判断你传入的对象是否是某一特定的类型,是返回true,否返回
false.
- 用法:
from collections import Iterable,Iterator l = [1,2,3,4,56,6,6,] print(isinstance(l,Iterable)) # true print(isinstance(l,Iterator)) # false lo = iter(l) #获得 l 的迭代器对象 print(isinstance(lo,Iterable)) # true print(isinstance(lo,Iterator)) # true
- python中的 isinstance() 可以判断你传入的对象是否是某一特定的类型,是返回true,否返回
-
iter()函数,Python中的 iter( object[, sentinel]) 函数可用来返回一个迭代器对象,iter( )函数只传入一个参数时,参数必须为可迭代对象;当使用第二个参数sentinel(哨兵)时,第一个参数必须是一个可调用对象.
- 迭代器简单使用
l = [1,2,3,4,56,6,6,] lo = iter(l) for i in range(len(l): print(next(lo)) # 在lo元素调用完之后,在使用next() print(next(lo))# 会报 StopIteration异常
- 迭代器简单使用
-
把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。
iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法并* 通过 StopIteration 异常标识迭代的完成。 -
next() 方法(Python 2 里是 next())会返回下一个迭代器对象。
-
例子请看 https://www.runoob.com/python3/python3-iterator-generator.html
生成器
-
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
def gen(): for i in range(10): n = i + 1 yield n g = gen() print(g) print(next(g)) for n in g: print(n)
输出结果
解释: 语句 print(g) 输出的不是数据,而是一个生成器对象,需要使用next(),调用 gen() 函数, 不断的计算 n 的值,并通过 yield 返回 n 值.
yeild
当程序执行到 yield 这里时,系统一般会保存程序当前的执行状态,当下一次调用(此函数的next(n)
),程序就会接着上一次保存的状态,继续执行.
总结:
迭代器和生成器的区别和关系
生成器是迭代器的一种
迭代器是惰性执行的,调用一次执行一次
1.迭代器是对已知数据进行操作next()
2.生成器是通过算法计算,返回数据,一般生成器函数都会有 yield 这个关键字