调用一个普通的函数,一般是从函数的第一行代码开始执行,至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