python : yield 的工作机制

直接上代码:

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的迭代,暂时不输出结果,执行指定次数的迭代后,再统一将结果输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值