生成器

1
2
3
4
5
6
7
8
ge = (i * i for i in range(1, 7))
<!--调用方式一:-->
print(next(ge))
print(next(ge))
print(next(ge))
<!--调用方式二-->
for item in ge:
print(item)
  • 之前讲过python有列表推导和生成器表达式,列表推导会把所有元素都生成放到列表中再进行遍历,而生成器表达式是在遍历的过程中对后续的元素进行生成(保存的不是对应的元素而是如何推算出元素的算法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def fib(n):
i = 0
a, b = 1, 1
while i < n:
yield a
a, b = b, a + b
i += 1


gf = fib(6)
print(next(gf))
print(next(gf))

gf = fib(6)

for item in gf:
print(item)

  • 生成器是是用yield进行实现的,和Java多线程中的yield完全不同,这里是每次迭代的时候会在yield处进行return,下次遍历从yield之后再次执行

迭代器

  • 可以是用for-in语句的对象称为可迭代对象(Iterable),一个可迭代对象可以作为内置函数next()的实参进行惰性推算叫做迭代器对象(Iterator),列表、元组、字典等都不是迭代器对象
  • 可以调用内置函数iter()把可迭代对象转换为迭代器对象
  • 一个对象同时实现了__iter__()和__next(),这个对象也被称为迭代器对象,for-in语句会先调用__iter()()返回一个可迭代对象,然后不断调用__next()__()返回下一次迭代的值