python – 内置类型 之 迭代器类型
python – 内置类型 之 迭代器类型
目录
一、迭代器iterator
1.理解迭代器
2.迭代器函数iter和next
3.迭代器运用案例
二、生成器generator
1.理解生成器
2.创建生成器
3.yield函数
一、迭代器iterator
1.理解迭代器
(1)什么是迭代器
迭代器也称迭代对象,指可for .. in ..等语句进行循环,这样的过程叫迭代,该对象称为迭代对象
迭代器用于迭代数据,记录每次访问的数据,以及返回下一个数据,用__next__取下一个指向的值
(2)可迭代对象有哪些
列表,元祖,字典,字符串,set集合等都是可迭代对象
(3)通过isinstance()来判断一个对象是否是迭代对象
2.迭代器函数iter和next
(1)iter(iterable)
从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象
(2)next(iterator)
从迭代器iterator中获取下一了记录,如果无法获取下一条记录,则触发stoptrerator异常
注意:迭代器只能往前取值,不会后退
3.迭代器运用案例
(1)创建迭代器
l = [1,3,5,7]
it = iter(l)
next(it) #1
next(it) #3
next(it) #5
next(it) #7
next(it) #StopIterable 异常
(2)用迭代器轮循列表
l = [2,3,5,7]
it = iter(l)
while True:
try:
x = next(it) #获取一个数据并绑定到x
print(x) #2,3,5,7
except StopIteration:
break
(3)自定义可迭代的类
在类中添加了__iter__方法即取得迭代器
在通过__next__方法指出所有的数据
class Fab(object):
def __init__(self, max):
self.max = max
self.n, self.a, self.b = 0, 0, 1
def __iter__(self):
“””返回一个迭代器”””
return self
def __next__(self):
“””返回迭代器下一个指向的值”””
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
else:
raise StopIteration()
if __name__==’__main__’:
for key in Fab(5):
print(key)
二、生成器generator
1.理解生成器
生成器有什么作用: 省内存
生成器一次只能返回一个值,将大大减小占用内存,而且允许调用函数快速的处理前几个返回值,因此生成器看起来像函数,但表现得却像迭代器
2.创建生成器
(1)把列表的[]改为()就创建generator
lis = [x*x for x in range(10)]
print(lis)
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#生成器
generator_ex = (x*x for x in range(10))
print(generator_ex)
# <generator object <genexpr> at 0x000002A4CBF9EBA0>
使用next(generator_ex)函数获得generator的下一个返回值
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
结果:
0
1
4
每次调用next()就返回generator的下一个值,多次调用next()直到*后一个元素,若再调用next()则抛出StopIteration的错误
所以正确的方法是使用for循环,因为generator也是可迭代对象,所以我们创建一个generator后,基本上永远不会调用next(),而是通过for循环来迭代
#生成器
generator_ex = (x*x for x in range(10))
for i in generator_ex:
print(i)
3.yield函数
yield 函数创建生成器generator。yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
send()和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果
例子:
def fib(max):
n,a,b =0,0,1
while n < max:
yield b
a,b =b,a+b
n = n+1
return ‘done’
for i in fib(6):
print(i)
结果:
1
1
2
3
5
8
def fib(max):
n,a,b =0,0,1
while n < max:
yield b
a,b =b,a+b
n = n+1
return ‘done’
g = fib(6)
while True:
try:
x = next(g)
print(‘generator: ‘,x)
except StopIteration as e:
print(“生成器返回值:”,e.value)
break
结果:
generator: 1
generator: 1
generator: 2
generator: 3
generator: 5
generator: 8
生成器返回值: done