python--自定义迭代器的学习
#如何得到自定义的迭代器:
#在函数内一旦存在yield关键字,调用函数并不会执行函数代码体代码
#会返回一个生成器对象,生成器即自定义的迭代器
# def func():
# print("第一次")
# yield 1
# print("第二次")
# yield 2
# print("第三次")
# yield 3
# g=func()
# print(g)
#<generator object func at 0x10676fa50>
# #会触发函数体代码的运行,然后遇到yield 停下来,将yield 后的值当作本次调用的结果返回
# res=g.__next__()
# print(res)
# res1=g.__next__()
# print(res1)
# res2=g.__next__()
# print(res2)
#g.__iter__()
"""补充"""
# l="123"
# len(l)--->l.__len__()
# iter(l)--->l.__iter__()
# next(l)--->l.__next__()
"""应用案例"""
#能产生无穷个值的迭代器
# def my_range(start,stop,step):
# print("start******")
# while start<stop:
# yield start
# start+=step
# print("end******")
#
# g=my_range(1,7,2)
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
"""优化"""
# def my_range(start,stop,step):
# print("start******")
# while start<stop:
# yield start
# start+=step
# print("end******")
# for i in range(1,7,2):
# print(i)
#有了yield关键字,我们就有了一种自定义迭代器的实现方式。
#yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值
#一、叠加多个装饰器的加载,运行分析
def deco1(func1): def wrapper(*args,**kwargs):#fun3=Wrapper2的内存地址 print("正在运行===》deco1.rapper1") res2=func1(*args,**kwargs) return res2 return wrapper def deco2(func2): def wrapper2(*args,**kwargs):#fun3=Wrapper3的内存地址 print("正在运行===》deco2.rapper2") print() res2=func2(*args,**kwargs) return res2 return wrapper2 def deco3(x): def outter3(func3): def wrapper3(*args,**kwargs):#fun3=被装饰对象index函数的内存地址 print("正在运行===》deco3.rapper3") print() res3=func3(*args,**kwargs) return res3 return wrapper3 return outter3 #加载顺序自下往上 @deco1 ##index=deco1(wrapper2的内存地址)--》index=wrapper1的内存地址 @deco2 #index=deco2(wrapper3的内存地址)--》index=wrapper2的内存地址 @deco3(111) #-->@outter3-->index=outter3(index)===>index=wrapper3的内存地址 def index(x,y): print("from index %s,%s" %(x,y)) print(index) #执行顺序:执行顺序是自上而下的,即wrapper1-->wrapper2-->wrapper3 index(1,2)
/usr/local/bin/python3.8 /Users/futantan/PycharmProjects/S14/函数的学习/自定义迭代器.py <function deco1.<locals>.wrapper at 0x108f43280> 正在运行===》deco1.rapper1 正在运行===》deco2.rapper2 正在运行===》deco3.rapper3 from index 1,2 Process finished with exit code 0
每天进步一点点~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!