如何理解python的生成器?
一、怎样理解生成器呢?
-
刚开始的时候,看到这样的格式python 代码
def generator_test(): for i in range(5): yield i;
总是容易把它看成是一个函数来理解。就是这种思维方法,让人难以理解它的运作。
-
那应该如何理解呢?我看了看这个generator单词的翻译。
然后,我尝试把generator 理解成一个发电机。
-
然后我就发现很好理解了。
''' 定义一个发电机的结构。 发电机的运行方法是和函数类似,不同的是每次碰到 yield 就会发一个电出来。 可以把yield看成是 线圈切割 磁感线的那一下。哈哈哈 ''' def generator_test(): for i in range(5): yield i; print("我就看看我又没有被执行"); ''' 这样的格式,要是函数,那就是被调用了。返回一个返回值。 但是它是一个发电机,那这句话应该这样描述:造了一个叫x的发电机,发电方法是generator_test定义的 造发电机不会发电,所以generator_test里面的内容不会执行。 ''' x=generator_test(); ''' 使用发电机的时候,才会运作,才会发电,才会产生预定好的内容。 ''' for i in x: print(i); '''只产生一点点电量就退出了,还可以继续发电。''' break; ''' 这里继续使用这台发电机,发电机会把剩下的电量也发出来。 ''' print(list(x)); ''' 因为上面已经把所有的电都发了,所以这台发电机已经报废了,这里什么都发不出来了。 ''' print(list(x));
二、做个题
-
看看下面的代码会输出什么?
def generator_test(): for i in range(5): yield i; def add(n,i): return n+i; x=generator_test(); for i in [6,7]: x = (add(i,j) for j in x); print(list(x));
答案是:[14,15,16,17,18]
-
为啥?
-
要先弄明白发电机最后是什么样的。
最开始的 x 是 generator_test();
然后循环 i = 6 的情况。
被改成 (add(i,j) for j in generator_test()) 了。这个返回结果还是一个发电机
然后循环 i = 7 的情况
被改成 (add(i,j) for j in (add(i,j) for j in generator_test())) 了,这就是最终这个叫x的发电机的内部构造。
最后循环结束之后,i=7了。
然后你调用 list(x)开始发电:
(add(7,j) for j in (add(7,j) for j in generator_test()))
变成类似这样,但是其实有点区别,因为for j in 后面的是发电机,不是列表。
add(7,j) for j in ([7,8,9,10,11])
然后算出来是:
[14,15,16,17,18]
-