0%

python生成器和迭代器

迭代器

【进阶Python】第五讲:迭代器与生成器

实现:

  • 可迭代对象只需要实现iter方法
  • 迭代器还需要实现next方法,使用next访问非迭代器会报错
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
class Iterator:
def __init__(self,array):
self.array = array
self.index = 0

def __iter__(self):
return self

def __next__(self):
if(self.index < len(self.array)):
result = self.array[self.index]
self.index += 1
return result
raise StopIteration

it = Iterator([1,2,3,5,7,9])

for i in it:
print(i)

# 啥也没输出
for t in it:
print(t)

# 此时再迭代会报错
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))

生成器

定义:一边循环一边计算的机制,叫做生成器:generator

生成器的用途:列表所有数据存储在内存中,若数据量过多非常消耗内存。若列表中元素按照某种算法推演出来,那么可以一边循环一边计算后面的元素,而不必生成完整列表,从而节省大量空间。

方法一:

1
2
3
4
list_ = [x+x for x in range(10)]
print(type(list_)) # list
list__ = (x+x for x in range(10))
print(type(list__)) # generator

方法二:

函数中加yield:yield相当于return一个值,并记住位置,下次调用函数从该yield语句之后执行

send()与next()一样,都可以让generator走一步,但send()可以传一个值,修改上一个yield表达式

如:a = yield 5,第一次运行到这里时返回5,a未被赋值;这时使用.send(10),就会赋10给a

1
2
3
4
5
6
7
8
9
10
11
12
#encoding:UTF-8
def yield_test(n):
for i in range(n):
yield call(i)
print("i=",i)
print("Done.")

def call(i):
return i*2

for i in yield_test(5):
print(i,",")