一、迭代器
1、迭代
迭代是一种重复获取数据集合中元素的过程,一次只获取一个元素,直到遍历完所有元素,通过for···in···语句实现。
2、可迭代对象
只要定义了__iter__()方法,我们就说该对象是可迭代对象。
在python中,for循环可用于任何“可迭代对象”。换句话说,可使用for循环遍历元素的数据集合,都是可迭代对象 iterable,如列表/元组/字典/生成器等。
可以使用 isinstance() 判断一个对象是否是 Iterable 对象。
from collections.abc import Iterable
print(isinstance(123,Iterable)) #False
print(isinstance("123",Iterable)) #True
print(isinstance([1,2,3],Iterable)) #True
3、迭代器
使用迭代器,每次只从对象中读取一条数据,不会造成内存的过大开销。
迭代器是一个可以记住遍历的位置的对象,它实现了迭代协议,即拥有__iter__和__next__方法,以有序的方式访问集合中的元素。__iter__返回迭代器本身,而__next__返回集合的下一个元素。迭代器在没有更多元素时抛出StopIteration异常。任何类只要实现了__iter__和__next__方法,就满足了迭代器协议。
可以使用 isinstance() 判断一个对象是否是 Iterator 对象。
from collections.abc import Iterator
print(isinstance(123,Iterator)) #False
print(isinstance(iter("123"),Iterator)) #True
print(isinstance([1,2,3],Iterator)) #True
使用内建的工厂函数iter(iterable)可以获取迭代器对象,使用next()方法访问下一个元素,python处理迭代器越界是抛出StopIteration异常。
next(n) == n._ next _() ,iter(n) == n._ iter _() 。
a=[1,2,3] #可迭代对象
b=iter(a) #获取迭代器对象
print(b) #<list_iterator object at 0x000001B5252C68E0>
print(next(b)) #获取第一个元素:1
print(next(b)) #获取第二个元素:2
print(next(b)) #获取第三个元素:3
print(next(b)) #没有元素了,抛出异常:StopIteration
在Python中,我们经常使用的 for 循环,本质上就是通过不断调用 next() 实现的。
二、生成器
生成器(generator)是一个特殊的迭代器,只能用于迭代操作。生成器具有和迭代器一样的特性,都是迭代器对象,都可以使用next()和iter()方法,但它们在实现方式上不一样。
迭代器和生成器都是容器,迭代器元素确定了,生成器没有确定。迭代器用来存储元素,生成器一般用来存储生成元素的算法,然后一边生成一边运行;通过生成器一个个去生成元素,而不是一下子生成全部的元素。
1、生成器表达式
生成器表达式类似列表推导式。列表推导式返回的是一个列表对象,而生成器表达式返回的是一个生成器对象。
a=[i for i in range(5)] #列表推导式
print(a) #[0,1,2,3,4]
print(type(a)) #<class 'list'>
b=(i for i in range(5)) #生成器表达式
print(b) #<generator object <genexpr> at 0x000001E620C50CF0>
print(type(b)) #<class 'generator'>
print(next(b)) #0
print(next(b)) #1
print(next(b)) #2
2、生成器函数
普通函数使用return返回一个值,生成器函数使用yield返回一个值。
def test1():
return 1
def test2():
yield 1
print(type(test1())) #<class 'int'>
print(type(test2())) #<class 'generator'>
对于普通函数,按顺序执行时遇到 return 或最后一行函数语句就会返回;对于有 yield的生成器函数,每次调用 next() 方法遇到 yield 语句才返回,如果再次调用 next() 方法,就会从上次返回的 yield 语句位置继续执行。
对于生成器,可使用next()函数或for循环打印数据集中的元素。
b=(i for i in range(5))
for j in b:
print("元素:",j)
'''
元素: 0
元素: 1
元素: 2
元素: 3
元素: 4
'''
使用生成器来实现斐波那契数列。
def fibonacci(n):
a,b=0,1
while n>0:
yield b
a,b=b,b+a
n-=1
f=fibonacci(15)
for i in f:
print(i,end=' ') #1 1 2 3 5 8 13 21 34 55 89 144 233 377 610