生成器的创建方式
1. 列表生成式()(最复杂的也只是三元运算)
1 a = (i for i in range(10))
2. 函数(利用yield来生成一个生成器)
yield和return的区别:
1. return 返回并中止function
2.yield返回数据,并冻结当前的执行过程。
· (next 相当于是唤醒冻结的函数执行过程,继续执行,直到遇到下一个yield,
当然,还可以利用__next__()方法唤醒)
注意:在用yield来生成一个生成器时,只要有yield就是生成一个生成器,只要有
yield,return就相当于是终止生成器,其返回值其实也可以捕捉。则就会出
现StopIteration异常。就会返回return返回的值
那么我们怎么实现自己让生成器动态终止呢?
答:是不是我们要告诉生成器,不需要你返回了。那我们就要向生成器传入信号。python
当中就用send实现了,呵呵。I Love Python。看下面代码啦,,,
def myRange(n): count = 0 while count<n: #print(count) yield count count+=1 ge = myRange(10) next(ge) next(ge)
ge.__next__()
ge.send("stop")
#1. 唤醒并继续执行
#2. 发送一个信息到生成器内部,诶,我们生成器是不是要接收一下呀!!!要判断信号呀,对吧?所以
#我们的生成器代码是不是需要更新一下:
def myRange(n):
count = 0
while count<n:
#print(count)
sign = yield count
if sign =='stop':
break
count+=1
#这样是不是我们就可以实现了?
#其实在python当中打开文件也是生成了一个生成器。
f = open('fileName','r')
for data in f:
print(data)
注意:如果是第一次生成生成器时,调用里面的值时,是不可以传其它值的,要用send也就只能
传入None进去!!!也就相当于我们用next是就是发了一个None过去,不能发其它信息,而用
send就可以发送其他消息。
python2
range = list
xrange = 生成器
python3
只有range为生成器