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