python迭代器

迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 迭代器类型的定义:
1.当类中定义了__iter__和__next__两个方法
2.__iter__方法需要返回对象本身,即:self
3.__next__方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常

# 创建迭代器类型
class IT(object):
def __init__(self):
self.counter = 0

def __iter__(self):
return self

def __next__(self):
self.counter += 1
if self.counter == 3:
raise StopIteration()
return self.counter

# 根据类实例化创建一个迭代器对象:
obj1 = IT()

# v1 = obj1.__next__()
# v2 = obj1.__next__()
# v3 = obj1.__next__() # 抛出异常

v1 = next(obj1) # obj.__next__()
print(v1)

v2 = next(obj1)
print(v2)

v3 = next(obj1)
print(v3)

obj2 = IT()
for item in obj2:
print(item)

# 迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration。
# for循环内部在循环时,先执行__iter__方法,获取一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)

生成器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建生成器函数
def func():
yield 1
yield 2

# 创建生成器对象(内部时根据生产器类generator创建的对象),生成器类的内部也声明了:__iter__、__next__方法。
obj1 = func()

v1 = next(obj1)
print(v1)

v2 = next(obj2)
print(v2)

v3 = next(obj3)
print(v3)

obj2 = func()
for item in obj2:
print(item)

# 如果按照迭代器的规定来看,其实生成器类也是一种特殊的迭代器类(生成器也是一个特殊的迭代器)

可迭代对象

1
2
3
4
5
6
7
8
9
10
# 如果一个类中有__iter__方法且返回一个迭代器对象;则我们称以这个类创建的对象为可迭代对象
class Foo(object):
def __iter__(self):
return 迭代器对象(生成器对象)

obj = Foo() # obj是可迭代对象

# 可迭代对象是可以使用for循环来进行循环,在循环内部其实是先执行__iter__方法,获取其迭代器对象,然后再在内部执行这个迭代器对象的next功能,逐步取值。
for item in obj:
pass