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
浙公网安备 33010602011771号