python中的迭代器,生成器与装饰器怎么用
这篇文章主要讲解了“python中的迭代器,生成器与装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的迭代器,生成器与装饰器怎么用”吧!
迭代器每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。
for循环调用list本质上是是调用了list的迭代器进行迭代。
#对list进行for循环本质上是调用了list的迭代器list=[1,2,3,4]#for循环调用foreleminlist:print(elem)#迭代器调用list_iter=list.__iter__()whileTrue:try:print(next(list_iter))exceptStopIteration:break
实现一个自己自定的迭代类,规定迭代一个可迭代的数据结构为“倒计时”模式。
#可迭代对象类classCountDown(object):def__init__(self,num):self.num=numdef__iter__(self):returnMyIterator(self.num)#迭代类classMyIterator(object):def__init__(self,num):self.NUM=numself.FINAL=0self.now=numdef__iter__(self):returnselfdef__next__(self):step=1ifself.NUM<self.FINALelse-1whileself.now!=self.FINAL:self.now+=stepreturnself.now-stepraiseStopIterationcd_pos=CountDown(5)cd_neg=CountDown(-5)fori,jinzip(cd_pos,cd_neg):print(f'pos:{i}\tneg:{j}')生成器
含有yield指令的函数可以称为生成器,它可以将函数执行对象转化为可迭代的对象。这样就可以像debug一样一步一步推进函数。可以实现的功能是可以实现让函数内部暂停,实现了程序的异步功能,这样可以及进行该函数与外部构件的信息交互,实现了系统的解耦。
fromcollectionsimportIterabledeff():pass#含有yield指令的函数可以称为生成器defg():yield()print(type(f()),isinstance(f(),Iterable))print(type(g()),isinstance(g(),Iterable))
使用生成器可以降低系统的耦合性
importos#生成器是迭代器的一种,让函数对象内部进行迭代#可以实现让函数内部暂停,实现了程序的异步功能,同时也实现了解耦。defmy_input():globalstrstr=input('inputaline')passdefmy_write():withopen('workfile.txt','w')asf:while(str):f.write(str+'\n')yield()returnmw=my_write()while(True):my_input()try:next(mw)exceptStopIteration:passifnotstr:break装饰器
装饰器封装一个函数,并且用这样或者那样的方式来修改它的行为。
不带参数的装饰器
#不带参数的装饰器fromfunctoolsimportwraps#装饰器封装一个函数,并且用这样或者那样的方式来修改它的行为。defmydecorator(a_func):@wraps(a_func)#声明这个注解就可以不重写传入的函数,只是调用的时候wrap一下。不加的话,a_func函数可以看作被重写为wrapTheFunction.defwrapTheFunction():print(f"functionin{id(a_func)}starts...")a_func()print(f"functionin{id(a_func)}ends...")returnwrapTheFunction#在函数定义前加入此注解就可以将函数传入装饰器并包装@mydecoratordeff():print('hi')passf()print(f.__name__)
带参数的装饰器(实现输出到自定义的日志文件)
#带参数的装饰器(实现输出到自定义的日志文件)fromfunctoolsimportwrapsdeflogit(logfile='out.log'):defmydecorator2(a_func):@wraps(a_func)defwrapTheFunction(*args,**kwargs):#这个保证了函数可以含有任意形参log_string=a_func.__name__+"wascalled"print(log_string)#打开logfile,并写入内容withopen(logfile,'a')asopened_file:#现在将日志打到指定的logfileopened_file.write(log_string+'\n')returna_func(*args,**kwargs)returnwrapTheFunctionreturnmydecorator2#funcgroup1@logit('out1.log')deffunc1(str):print(str)pass@logit('out2.log')deffunc2():passfunc1('Ihaveafoulsmell')func2()
实现一个装饰器类(这样写可以简化装饰器函数,并且提高封装性)
#带参数的装饰器(实现输出到自定义的日志文件)fromfunctoolsimportwrapsdeflogit(logfile='out.log'):defmydecorator2(a_func):@wraps(a_func)defwrapTheFunction(*args,**kwargs):#这个保证了函数可以含有任意形参log_string=a_func.__name__+"wascalled"print(log_string)#打开logfile,并写入内容withopen(logfile,'a')asopened_file:#现在将日志打到指定的logfileopened_file.write(log_string+'\n')returna_func(*args,**kwargs)returnwrapTheFunctionreturnmydecorator2#funcgroup1@logit('out1.log')deffunc1(str):print(str)pass@logit('out2.log')deffunc2():passfunc1('Ihaveafoulsmell')func2()
感谢各位的阅读,以上就是“python中的迭代器,生成器与装饰器怎么用”的内容了,经过本文的学习后,相信大家对python中的迭代器,生成器与装饰器怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。