直接上代码:
file.txt
Four score and seven years ago...
Four score and seven years ago...
Four score and seven years ago...
含有yield的函数:
yield_test.py
def index_file(handle):
"""
从文件一次读入各行内容,然后逐个处理每行中的单词,并产生相应结果
"""
offset = 0
for line in handle:
if line:
print("yield1")
yield offset
print("yield1____")
for letter in line:
offset += 1
if letter == " ":
print("yield2")
yield offset
print("yield2__")
print("--------------test1-----------------")
with open("address.txt",'r') as f:
it = index_file(f)
for i in range(10):
print(next(it))
print("\n\n--------------test2-----------------")
with open("address.txt",'r') as f:
it = index_file(f)
results = islice(it,0,10)
print(list(results))
输出:
--------------test1-----------------
yield1
0
yield1____
yield2
5
yield2__
yield2
11
yield2__
yield2
15
yield2__
yield2
21
yield2__
yield2
27
yield2__
yield1
34
yield1____
yield2
39
yield2__
yield2
45
yield2__
yield2
49
--------------test2-----------------
yield1
yield1____
yield2
yield2__
yield2
yield2__
yield2
yield2__
yield2
yield2__
yield2
yield2__
yield1
yield1____
yield2
yield2__
yield2
yield2__
yield2
[0, 5, 11, 15, 21, 27, 34, 39, 45, 49]
结论:
含有yield的函数都是生成器,yield将函数体中传给yield的值逐次产生出来,送到函数体外部
含有yield的函数,当执行到yield时会暂时跳出函数,向外界输出一个结果,当外界的后续代码被执行完后,再回到含有yield的函数体,从yield的下一行继续按语法执行,直到遇到下一个yield。
islice:会消耗yield的迭代,暂时不输出结果,执行指定次数的迭代后,再统一将结果输出。