Python之生成器
在 python 中使用 yield 的函数称为生成器。如下:
def count(n):
while n > 0:
yield n
n -= 1
1
2
3
4
2
3
4
跟普通函数不同的是生成器返回的是一个迭代器函数,只能用于迭代操作,可以说生成器就是一个迭代器。在调用生成器运行的过程中,每次运行到 yield 会暂停并保存所有的运行信息并返回 yield 的值,在下次调用 next()方法的时候当前的位置继续运行。
例如:
## 用普通函数创建斐波拉契函数
>>> def fib1(n):
... a, b, count = 0, 1, 0
... while count < n:
... print(a)
... a, b = b, a+b
... count += 1
...
>>> fib1(10)
0
1
1
2
3
5
8
13
21
34
>>>
## 用生成器创建
>>> def fib2(n):
... a,b,count = 0,1,0
... while count<n:
... yield a
... a,b=b,a+b
... count += 1
...
>>> for i in fib2(10):
... print(i)
...
0
1
1
2
3
5
8
13
21
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
作为生成器,因为每次迭代就会返回一个值,所以不能显示的在生成器函数中 return 某个值,包括 None 值也不行,否则会抛出“SyntaxError”的异常,但是在函数中可以出现单独的 return,表示结束该语句。
通过固定长度的缓冲区不断读文件,防止一次性读取出现内存溢出的例子:
def read_file(path):
size = 1024
with open(path,'r') as f:
while True:
block = f.read(SIZE)
if block:
yield block
else:
return
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
作者:
本文链接:https://jokerbai.com
版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!
上次更新: 2025/07/19, 11:33:23
- 02
- 使用Zadig从0到1实现持续交付平台07-19
- 03
- 基于Jira的运维发布平台07-19