浅谈python中的生成器

  • 调用一个普通的函数,一般是从函数的第一行代码开始执行,至return语句、异常或者所有语句执行完毕,可以理解为函数执行完成。一旦函数使用结束,函数中做的所有工作以及保存在局部变量中的数据都都会丢失。下次使用该函数时,一切又都从头开始。

  • 生成器可以使得Python模仿协同程序的概念得以实现。
    * 协同程序:可以运行的独立函数调用,函数可以暂停或者挂起,并且在需要的时候从程序离开的地方继续或者是重新开始运行。

  • 生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后下次调用的时候,从上一次暂停的位置继续执行下去。

练习1

In [1]: def myGen():
   ...:     print("生成器被执行!")
   ...:     yield 1
   ...:     yield 2
   ...:     

In [2]: myGenerator = myGen()

In [3]: next(myGenerator)
生成器被执行!
Out[3]: 1

In [4]: next(myGenerator)
Out[4]: 2

In [5]: next(myGenerator)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
 in ()
----> 1 next(myGenerator)

StopIteration: 

注意:当函数结束时,抛出一个StopIteration异常。Python中的for循环会自动调用next()方法和处理StopIteration异常,即for循环可以对生成器产生作用。

练习2

In [6]: for i in myGen():
   ...:     print(i)
   ...:     
生成器被执行!
1
2

以生成器的方式实现斐波那契数列

In [7]: def fibs():
   ...:     a = 0
   ...:     b = 1
   ...:     while True:
   ...:         a , b = b ,a + b
   ...:         yield a
   ...:         

In [8]: for each in fibs():
   ...:     if each > 100:
   ...:         break
   ...:     print(each)
   ...:   
结果如下:  
1
1
2
3
5
8
13
21
34
55
89

推导式(列表、字典、集合

  • 1.列表推导式
In [1]: a = [i for i in range(100) if not( i % 2 )and i % 3]

In [2]: print(a)
[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]

注意:上述列表推导式求得是100以内,能被2整除,但不能被3整除的所有整数。

  • 2.字典推导式
In [3]: b = {i:i % 2 == 0 for i in range(10)}

In [4]: print(b)
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
  • 3.集合推导式
In [5]: c = {i for i in [1,1,2,3,3,4,5,5,5,5,7,8,9,41]}

In [6]: print(c)
{1, 2, 3, 4, 5, 7, 8, 9, 41}
  • 4.生成器推导式
In [7]: e = (i for i in range(10))

In [8]: e
Out[8]:  at 0x000001B8579DBF10>

注意:generator就是生成器的意思,用普通的小括号括起来的正是生成式推导式,说明如下:

In [11]: next(e)
Out[11]: 0

In [12]: next(e)
Out[12]: 1

In [13]: next(e)
Out[13]: 2

In [14]: next(e)
Out[14]: 3

In [15]: next(e)
Out[15]: 4

In [16]: next(e)
Out[16]: 5
for循环打印出剩余的:
In [17]: for each in e:
    ...:     print(each)
    ...:     
6
7
8
9
  • 生成器推导式如果作为函数的参数,可以直接写推导式,不用加小括号:
In [1]: sum(i for i in range(100) if i % 2)
Out[1]: 2500

补充:

运行环境:Anaconda3 中的Jupyter QTConsole,还可以使用PyCharm或者python3自带的IDLE(适合新手学习使用)
下载地址:
python3&python2.7最新版本下载地址

python学习交流群:463024091
作者qq:1070457631

你可能感兴趣的:(浅谈python中的生成器)