Python的三大神器:装饰器.迭代器与生成器!这就是Python的三大神器,好了废话不多说。直接来上干货吧!
Python的三大神器:装饰器、迭代器与生成器!这就是Python的三大神器,好了废话不多说。直接来上干货吧!
生成器
仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。
创建一个生成器函数
- >>>
- defscq():...print("11")#当函数代码块中遇到yield关键字的时候,这个函数就是一个生成器函数...yield
- 1...print("22")...yield2...print("33")...yield3...
把生成器赋值给一个对象
- >>>r=scq()
查看r的苏剧类型并且输出r的值
- >>>print(type(r),r)<class'generator'><generatorobjectscqat0x000001F117D8DF10>
当执行生成器的__next__的时候,代码会按照顺序去执行,当执行到yield时会返回并提出,yield后面的值就是返回值,然后记录代码执行的位置,并退出
执行结果
- C:Python35python.exeF:/Python_code/sublime/Week5/Day03/s1.py01234Processfinishedwithexitcode0
迭代器
具有访问生成器的能力,可以访问到生成器的值,类似于生成器的__next__方法,一个一个值一个值得去迭代,只能够按照顺序的去查找。
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
优化上面range或xrange的生成器
- def
- irange(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.py
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- <generatorobjectirangeat0x1021df7d8>
- [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
- Processfinishedwithexitcode0
Python之装饰器
现要在执行func这个函数前后执行一些操作,就可以创建一个装饰器来实现:
- #!/usr/bin/envpython
- #_*_coding:utf-8_*_
- defdecorator(func):#创建一个装饰器函数,接受的参数arg参数就是func函数名
- definner(*args,**kwargs):
- print("执行函数之前")
- ret=func(*args,**kwargs)
- print("执行函数之后")
- returnret
- returninner
- @decorator#如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名
- deffunc(arg):
- print(arg)
- func("HelloWorld!")
输出结果为:
- /usr/bin/python3.5/home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py
- 执行函数之前
- HelloWorld!
- 执行函数之后
- Processfinishedwithexitcode0
多个装饰器装饰同一个函数
- #!/usr/bin/envpython
- #_*_coding:utf-8_*_
- defdecorator1(func):
- definner():
- print("开始之前执行装饰器01")
- ret=func()
- print("结束之后执行装饰器01")
- returnret
- returninner
- defdecorator2(func):
- definner():
- print("decorator2>>>Start...")
- ret=func()
- print("decorator2>>>End...")
- returnret
- returninner
- @decorator1
- @decorator2
- defindex():
- print("执行函数...")
- index()
输出结果:
- /usr/bin/python3.5/home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py
- 开始之前执行装饰器01
- decorator2>>>Start...
- 执行函数...
- decorator2>>>End...
- 结束之后执行装饰器01
- Processfinishedwithexitcode0
更多实例
- #!/usr/bin/envpython
- #_*_coding:utf-8_*_
- #Createdby安生on2017/2/9
- """
- 函数装饰器
- """
- defdecorator(func):
- defwrapped(*args,**kwargs):
- returnfunc(*args,**kwargs)
- returnwrapped
- @decorator
- deffunc(a,b):
- returna+b
- print(func(1,2))
- """
- 类装饰器
- """
- classdecorator:
- def__init__(self,func):
- self.func=func
- def__call__(self,*args,**kwargs):
- returnself.func(*args,**kwargs)
- @decorator
- deffunc(a,b):
- returna+b
- print(func(1,2))
- """
- 带参数的函数装饰器
- """
- defparameter(a,b):
- print(a,b)
- defdecorator(func):
- defwrapped(*args,**kwargs):
- returnfunc(*args,**kwargs)
- returnwrapped
- returndecorator
- @parameter(1,2)
- deffunc(a,b):
- returna+b
- print(func(10,20))
- """
- 带参数的类装饰器
- """
- defparameter(a,b):
- print(a+b)
- classdecorator:
- def__init__(self,func):
- self.func=func
- def__call__(self,*args,**kwargs):
- returnself.func(*args,**kwargs)
- returndecorator
- @parameter(1,2)
- deffunc(a,b):
- returna+b
- print(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)
- returnwrapped
- returndecorator
- @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=0
- defonCall(*args,**kwargs):
- nonlocalcalls
- calls+=1
- print('call%sto%s'%(calls,func.__name__))
- returnaClass(*args,**kwargs)
- returnonCall
- @Call
- deffunc(a,b):
- returna+b
- print(func(1,2))
- classCLS:
- def__init__(self):
- self.a='a'
- @Call
- defb(self):
- returnself.a
- obj=CLS()
- print(obj.b())
©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经