首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python3中的生成器函数

 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'''

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200803A03PY700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券