Python中对延迟提供了友好的支持:即它提供了在需要的时候才产生结果的工具,而不是立即产生结果。下面介绍的函数生成器就是这种工具之一。
1:生成器函数的定义
定义:使用常规的def语句进行编写,但是使用yield语句一次返回一个结果集,在每次结果产生之间挂起和恢复它们的状态。
# 常规函数def func1(): print('hello ') return 'ixusy88' ret = func1()print(ret) '''结果:hello ixusy88''' print("*"*30)# 生成器函数,把常规函数中的return替换为yielddef func2(): print('hello ') yield 'ixusy88' ret = func2() # 并没有执行函数,而是返回一个生成器对象print(ret)'''结果:'''
2:生成器函数的本质
生成器函数本质就是一个迭代器:函数中如果包含一条yield语句,那么Python就会将它编译为生成器,这个函数不再是普通函数,而是作为返回支持迭代协议的对象的函数,这个函数返回的对象会自动创建名为__next__的方法接口。
"""yield语句会挂起该函数并向调用者传回一个值,同时会保留足够的状态使函数能从它离开的地方继续执行,当继续时,函数在上一个yield传回后立即继续执行。"""def func1(N): for i in range(N): yield i**2 ret = func1(3) # 只要函数func1中有yield语句,就会返回一个支持迭代协议的对象print(ret)print('__iter__' in dir(ret))print('__next__' in dir(ret)) """输出结果:TrueTrue"""print("*"*30) # ret 是一个支持迭代协议的对象,可以通过手工进行访问 print(ret.__next__())print(ret.__next__())print(ret.__next__())print(ret.__next__()) # """014Traceback (most recent call last): File "D:\python\生成器函数.py", line 53, in print(ret.__next__()) # StopIterationStopIteration""" print("*"*30)ret = func1(5) # ret 是一个支持迭代协议的对象,可以使用for循环来遍历for item in ret: print(item)"""014916"""
3:小示例
# 斐波那契函数# def Fibonacci(N): a,b,max_cnt = 0,1,N while b a,b = b,a+b yield a print('*'*30)fib = Fibonacci(5)print(fib) for x in fib: print(x) '''输出结果:11235'''print('*'*30) # 手工访问fib = Fibonacci(5)print(fib.__next__())print(fib.__next__())print(fib.__next__())print(fib.__next__())print(fib.__next__())print(fib.__next__()) '''结果:11235Traceback (most recent call last): File "D:\python\生成器函数.py", line 119, in print(fib.__next__())StopIteration'''
领取专属 10元无门槛券
私享最新 技术干货