第八章、生成器
第八章、生成器
一、什么是生成器
生成器本质是迭代器,不仅仅是迭代器,除了迭代器的作用其他作用也没多少,生成器提供了方便的自定义迭代器的途径。
二、yield关键字
迭代器具有__iter__
h和__next__
的方法
def func():
return 123
f = func():
print(f) #123
#我们调用了func函数,那他当然是123了
然后我们看return和yield有什么区别吧
def func():
yield 456 # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
yield 12345 # 一个yield对应一个next
print(369789)
f = func() #生成器
print(f) # <generator object func at 0x000001F0E44237D8>
f_iter = f.__iter__()
print(f_iter.__next__())#123
print(f_iter.__next__())#12345
print(f_iter.__next__())#报错
#但是这样的话会报错,有多少yield关键字就有多少next,next多了会报错StopIteration
然后总结一下:
yield的三个特性
- yield可以把函数变成生成器(自定制的迭代器对象,具有
__iter__
和__next__
方法) - yield可以停止函数,下一次next再次运行yield下面的代码
- 有n个yield生成器就有n个元素,就可以next n次,第n+1次next会报错
return的特性
- 返回值
- 终止函数
三、利用yeild关键字制作生成器制作一个range方法
-
首先要把可迭代对象变成迭代器,即使用yield关键字使让range函数成为生成器
-
丢一个10 通过for 循环把range迭代出(for循环使用了next方法的原理)所有的元素0到9
def range(*args):
if len(args)==3:
a=args[0]
while args[1]>a and a>=args[0]:
yield a
a+=args[2]
elif len(args)==2:
if args[0]<args[1]:
a=args[0]
while a>=args[0] and a<args[1]:
yield a
a+=1
elif args[0]>args[1]:
a = 0
while a >= 0 and a < args[0]:
yield a
a += args[1]
elif len(args) == 1:
a=0
while a<args[0]:
yield a
a+=1
for i in range(3,10,3):
print(i)
#调用一下我自己做的函数(其实是生成器)
for i in range(10,3):
print(i)
#结果正确,完美收场
0
3
6
9
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee