zoukankan      html  css  js  c++  java
  • 装饰器,生成器,迭代器

    一、装饰器

      什么是装饰器

        装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

        特点:

          不修改调用方式、不修改源代码

      为什么要使用装饰器

        在进行现有功能的添加时,不可能一个一个的添加,这时候就可以使用装饰器。结合应用场景所需求比如提高代码复用性,节省内存空间

      装饰器应用场景

        用户认证,判断用户是否登录
        计算函数运行时间(算是一个功能、在项目里用的不多)
        插入日志的时候
        redis缓存

      二级装饰器和三级装饰器的区别以及三级装饰器带参数时加括号和不加括号的区别

        二级和三级装饰器的区别就是三级装饰器在二级基础上再次嵌套了一层函数

        三级装饰器加括号就是调用函数,返回函数执行结果,不加括号返回是内存地址

      怎么写装饰器

        装饰器(不带参数):

     1 def outer(func):
     2     def inner():
     3         print("开始验证性别")
     4         func()
     5     return inner
     6 @outer
     7 defcass():
     8     print("开始进行排除")
     9 if__name__ == '__main__':
    10     cass()

        装饰器(带参数):

    def outer(func):
        def inner(*args,**kwargs):
            print("asdasd")
            func(*args,**kwargs)
        return inner
    @outer
    def maia(a,b,c):
        print("asdfghjasdfghj",a+b+c)
    if __name__ == '__main__':
        maia(10,20,30)

        多层装饰器:

     1 def outer1(func):
     2   def inner(*args,**kwargs):
     3     print("开始=====1")
     4     func(*args,**kwargs)
     5     print("结束=====1")
     6   return inner
     7 def outer2(func):
     8   def inner(*args,**kwargs):
     9     print("开始=====2")
    10     func(*args,**kwargs)
    11     print("结束=====2")
    12   return inner
    13 def outer3(func):
    14   def inner(*args,**kwargs):
    15     print("开始=====3")
    16     func(*args,**kwargs)
    17     print("结束=====3")
    18   return inner
    19 @outer1
    20 @outer2
    21 @outer3
    22 def fun():
    23     print("asdasd")
    24 if __name__ == '__main__':
    25     fun()

    二、生成器

      什么是生成器

        生成器就是一个特殊的迭代器,一个有yield关键字的函数就是一个生成器

        特点:

          生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

      生成器应用场景

        生成器是一个概念,我们平常写代码可能用的并不多,但是python源码大量使用比如我们tornado框架就是基于 生成器+协程

      为什么要使用生成器

        节省空间,高效

      怎么写生成器

        yield构造斐波那契:

     1 def fun(n):
     2     num1=0
     3     num2=1
     4     current=0
     5     while current<n:
     6         num=num1
     7         num1,num2=num2,num1+num2
     8         current+=1
     9         yield num
    10 if __name__ == '__main__':
    11     sat=fun(10)
    12     for x in sat:
    13         print(x,end="")

    三、迭代器

      什么是迭代器

        一个实现了iter方法的对象是可迭代的,一个实现next方法并且是可迭代的对象是迭代器。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。所以一个实现了iter方法和next方法的对象就是迭代器。

      可迭代对象

        内置iter方法的,都是可迭代的对象。 list是可迭代对象,dict是可迭代对象,set也是可迭代对象。

      next()和iter()

     1 lst=[1,2,30]
     2 for i in lst:
     3     print(i)
     4 next(lst)
     5 
     6 lst=[1,2,30]
     7 for i in iter(lst):
     8     print(i)
     9 next(iter(lst))
    10 
    11 运行结果:
    12 1
    13 2
    14 30
    15 1

      迭代器遍历列表

     1 class fun():
     2     def __init__(self,list):
     3         self.list=list
     4         self.current=0
     5     def __iter__(self):
     6         return self
     7     def __next__(self):
     8         if self.current<len(self.list):
     9             ret=self.list[self.current]
    10             self.current+=1
    11             return ret
    12         else:
    13             raise StopIteration
    14 if __name__ == '__main__':
    15     list=[1,2,3,4,5,6,7,8]
    16     sat=fun(list)
    17     while True:
    18         try:
    19             print(next(sat))
    20         except StopIteration:
    21             break
  • 相关阅读:
    [转]编程能力与编程年龄
    github for windows 使用
    github 改位置
    Linux下设置和查看环境变量
    Docker基础 :网络配置详解
    docker入门实战笔记
    Jenkins +Maven+Tomcat+SVN +Apache项目持续集成构建
    使用nsenter工具进入Docker容器
    Docker从入门到实战(四)
    Docker从入门到实战(三)
  • 原文地址:https://www.cnblogs.com/errenjune/p/12467300.html
Copyright © 2011-2022 走看看