当前位置: 首页 > 科技观察

Python的三大神器你知道吗?史上最详细入门教程!

时间:2023-03-13 06:11:47 科技观察

Python的三大神器:装饰器、迭代器和生成器!以上就是Python的三大神器了,废话不多说。直接来干货!生成器只有生成东西的能力,如果不使用__next__方法,是取不到值的。创建生成器函数>>>defscq():...print("11")#当函数代码块中遇到yield关键字时,此函数为生成器函数...yield1...print("22")...yield2...print("33")...yield3...将生成器赋给一个对象>>>r=scq()检查r的苏联歌剧类型并输出r的值value>>>print(type(r),r)当执行生成器的__next__时,代码会按顺序执行。当执行到yield时,会返回并提出,yield之后的值就是返回值,然后记录代码执行的位置,并退出执行结果C:Python35python.exeF:/Python_code/sublime/Week5/Day03/s1.py01234Processfinishedwithexitcode0迭代器具有访问生成器的能力,可以访问生成器的值,类似于生成器的__next__方法,值得一一迭代,只能按顺序查找。特点:访问者无需关心迭代器的内部结构,只需要使用next()方法不断获取下一个内容即可。不能随机访问集合中的某个值,只能从头到尾依次访问,访问到一半不能回退方便循环比较大的数据集,节省内存,优化范围或x范围的生成器defirange(start,stop,step=1):whilestart!=stop:yieldstartstart+=stepelse:raiseStopIterationforninirange(1,10):"""for只要循环遇到StopIteration,就会停止"""print(n)ret=irange(1,20)print(ret)#返回一个生成器,相当于只在内存中创建一个值print(list(ret))#如果想获取所有的值,可以把它变成一个列表/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5/Users/ansheng/MyPythonCode/hello.py123456789[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]Python的Processfinishedwithexitcode0装饰器现在需要在执行func函数前后进行一些操作n、可以创建装饰器实现:#!/usr/bin/envpython#_*_coding:utf-8_*_defdecorator(func):#创建装饰器函数,接受的参数arg参数为func函数名definener(*args,**kwargs):print("beforeexecutionthefunction")ret=func(*args,**kwargs)print("afterexecutingthefunction")returnreturnreturninner@decorator#如果你想要一个函数使用一个装饰器,只需要在这个函数上面加上@+装饰器名deffunc(arg):print(arg)func("HelloWorld)!")输出为:/usr/bin/python3.5/home/ansheng/Documents/PycharmProjects/blogcodes/decorator.py函数执行前HelloWorld!函数执行后Processfinishedwithexitcode0多个装饰器装饰同一个函数#!/usr/bin/envpython#_*_coding:utf-8_*_defdecorator1(func):definner():print("开始前执行装饰器01")ret=func()print("结束后执行装饰器01")returnreturnnerdefdecorator2(func):definner():print("decorator2>>>Start...")ret=func()print("decorator2>>>End...")returnreturnner@decorator1@decorator2defindex():print("Executefunction...")index()输出:/usr/bin/python3.5/home/ansheng/Documents/PycharmProjects/blogcodes/decorator.pyexecutedecorator01decorator2>>>Start...执行函数。..decorator2>>>End...结束后执行装饰器01Processfinishedwithexitcode0更多例子#!/usr/bin/envpython#_*_coding:utf-8_*_#CreatedbyAnshengon2017/2/9"""函数装饰器""“defdecorator(func):defwrapped(*args,**kwargs):returnfunc(*args,**kwargs)returnwrapped@decoratordeffunc(a,b):returna+bprint(乐趣c(1,2))"""类装饰器"""classdecorator:def__init__(self,func):self.func=funcdef__call__(self,*args,**kwargs):returnsself.func(*args,**kwargs)@decoratordeffunc(a,b):return+bprint(func(1,2))"""带参数的函数装饰器"""defparameter(a,b):print(a,b)defdecorator(func):defwrapped(*args,**kwargs):returnfunc(*args,**kwargs)returnwrappedreturndecorator@parameter(1,2)deffunc(a,b):return+bprint(func(10,20))"""with类装饰器对于参数“””defparameter(a,b):print(a+b)classdecorator:def__init__(self,func):self.func=funcdef__call__(self,*args,**kwargs):returnsself.func(*args,**kwargs)returndecorator@parameter(1,2)deffunc(a,b):returna+bprint(func(10,20))"""带参数的类装饰器"""defparameter(a,b):print(a,b)defdecorator(cls):classwrapped:def__init__(self,*args,**kwargs):self.cls=cls(*args,**kwargs)def__getattr__(self,item):returngetattr(self.cls,item))returnwrappedreturndecorator@parameter(1,2)classCLS:def__init__(self):self.a='a'defP(self,v):print(v)obj=CLS()print(obj.a)obj.P('Hello,')"""是一个类中的函数中和方法添加装饰器"""defCall(aClass):calls=0defonCall(*args,**kwargs):nonlocalcallscalls+=1print('call%sto%s'%(calls,func.__name__))returnClass(*args,**kwargs)returnCall@Calldefunc(a,b):returna+bprint(func(1,2))classCLS:def__init__(self):self.a='a'@Calldefb(self):返回自我。aobj=CLS()打印(obj.b())