python--生成器

生成器的创建方式

  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为生成器

坚持不一定成功,但放弃必定失败。
原文地址:https://www.cnblogs.com/bao9687426/p/9968409.html