Python生成器、迭代器

列表生成式

 1 a = [x for x in range(10)] 

>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

其中x也可是函数,函数时要保持参数一致性,例如f(x)。

生成器

为什么会有生成器,是因为内存空间有限,如果列表中的元素过多,会占用很多的内存空间,列表中的元素并不是每个都在用,故一边循环一边计算的方式,就称为generator,生成器也是一个迭代对象,生成器本质上也是一个函数,主要是使用yield关键字返回结果。

生成器的创建

1、将列表生成式的中括号修改为圆括号即可。

1 l = (x*2 for x in range(10))
2 print(l)
3 # >> <generator object <genexpr> at 0x0000000000000000>

生成器调用

next(s),如果超出范围,next()函数则会报错。可迭代对象(内部由iter方法的都是可迭代对象iterable)与迭代器是不同的概念。

2、yield关键字和生成器对象的部分方法

1 def foo():
2     print("生成器打印--1")
3     yield 1
4     print("生成器打印--2")
5     yield 2
6 
7 for i in foo():
8     print(i)
 1 def fib(max):
 2     n = 0
 3     a = 0
 4     b = 1
 5     while n <= max:
 6         yield a
 7         a, b = b, a+b  # 此处就是你是先计算出等号右侧的b, a+b的值后,再进行赋值的操作,如果需要分行操作,则需要增加临时temp参数
 8         n += 1
 9 
10 
11 g = fib(8)
12 for i in g:
13     print(i)
 1 def bar():
 2     print("--1")
 3     count = yield 1
 4     print(count)
 5     print("--2")
 6     yield 2
 7 
 8 
 9 b = bar()
10 s = b.send(None)  # 等同于next(b),第一次send如果没有next,只能传一个None
11 s = b.send("abc")  # 第一个send()函数遇到第一个yield就返回,第2个send()函数会遇到赋值表达式
12 print(b)

 生成器对象使用send()方法,可基本实现伪并发。

迭代器

被next()函数调用并不断返回下一个值的对象称为迭代器。Iterator对象表示的是一个数据流,能够节省计算机中的内存。

生成器都是迭代器,迭代器不一定是生成器。

迭代器对象的生成:列表L= [1, 2, 3, 4],iter(L)可生成迭代器对象,同样适用元组,字典,字符串,它们都是可迭代对象。

迭代器满足两个条件:首先是有iter()方法,其次是有next()方法。

1 L = [1, 2, 3, 4]
2 s = iter(L)  # 返回<list_iterator object at 0x000000000213E6A0>
3 print(s)

迭代器取值

使用for循环,for操作列表时所做的事情有:调用迭代对象的iter()方法,返回一个迭代器对象;调用迭代器的next()方法;处理Stopinteration异常。

是否为迭代器判断

1 L = [1, 2, 3, 4]
2 s = iter(L)
3 print(isinstance(s, Iterator))  # 此处我运行的时候显示错误,主要是没有Iterator对象

概念判断

可迭代对象:Iterable

迭代器:Iterator

生成器:generator

posted on 2018-03-26 16:13  Artisan正传  阅读(101)  评论(0)    收藏  举报