• python三大器(装饰器/生成器/迭代器)


    1装饰器

    1.1基本结构

    def 外层函数(参数):
        def 内层函数(*args,**kwargs);
        	return 参数(*args,**kwargs)
       	return 内层函数
    @外层函数
    def index()
    	pass	
    
    #示例:
    def func(arg):
        def inner():
            v = arg()
            return v 
        return inner 
    @func
    def index():
        print(123)
        return 666
    
    print(index)
    
    • @func :执行func函数把下面色函数当做参数传递,相当于:func(index)
    • 将外层函数的返回值(内层函数)重新赋值给下面的函数名index,index = func(index)

    1.2装饰器基本应用

    应用场景:想要为函数扩展功能时,使用装饰器

    • 计算运行时间

      • 时间模块:time.time()获取当前时间
      • time.sleep('秒数')睡眠
      # 计算函数执行时间
      
      def wrapper(func):
          def inner():
              start_time = time.time()
              v = func()
              end_time = time.time()
              print(end_time-start_time)
              return v
          return inner
      @wrapper
      def func1():
          time.sleep(2)
          print(123)
      @wrapper
      def func2():
          time.sleep(1)
          print(123)
      func1()
      

    1.3 带参数的装饰器

    #普通装饰器基本格式
    def wrapper(func):
        def inner():
            pass
            return func()
        return inner
    
    def func():
        pass
    func = wrapper(func)
    func()
    #带参数装饰器基本格式
    def w(counter):
        def wrapper(func):
            def inner(*args,**keargs):
                lis = []
                for i in range(0,counter):
                    a=func(*args,**keargs)
                    lis.append(a)
                return lis
            return inner
        return wrapper
    
    def func(*args,**keargs):
        return 8
    
    #面试题
    # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【面试题】
    def xxx(counter):
        print('x函数')
        def wrapper(func):
            print('wrapper函数')
            def inner(*args,**kwargs):
                for i in range(counter):
                    data = func(*args,**kwargs) # 执行原函数并获取返回值
                return data
            return inner
        return wrapper
    
    @xxx(5)
    def index():
        return 8
    
    v = index()
    print(v)
    

    2生成器

    • 函数中存在yield,那么该函数为生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部的代码才会执行,每次驯化都会获取yield返回的值.
    • 基本格式:
    ##生成器函数存在yield
    def func(*args)
    	*args=1
        yield 1
        yield 2   
    func('a')
    #函数内部代码不会执行,返回一个生成器对象
    v = func('a')
    #生成器是可以被for循环,一旦开始循环name函数内部代码就会开始执行.
    for item in v:
        print(item)    #循环开始,函数运行,yield 返回值,停止第一次循环,再次循环时从上一次yield的位置开始运行
    
    • 生成数字:
      • return 可以做终止命令,不会返回值
    def func():
        count = 1
        while True:
            yield count
            count += 1
            
    val = func()
    
    for item in val:
        print(item)
    

    3迭代器

    3.1 迭代器

    • 迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代

    • 迭代器:帮助对某种对象(str/list/tuple类所创建的对象..)中的y元素一一获取.表象:具有__next__方法,每次迭代都返回一个值

      • 列表转换成迭代器:
        • lis = iter([1,2,4,2])
        • lis= [1,2,4,2]._ _ iter __()
      • 迭代器想要获取每个值就要反复调用:val = lis.__ next __()
        • 直到报错Stopinteration取到最后一个元素
      • 判断一个对象是否是迭代器:内部是否有__ next __方法.
      v1 = [11,22,33,44]
      
      # 列表转换成迭代器
      v2 = iter(v1)
      result1 = v2.__next__()
      print(result1)
      result2 = v2.__next__()
      print(result2)
      result3 = v2.__next__()
      print(result3)
      result4 = v2.__next__()
      print(result4)
      result5 = v2.__next__()
      print(result5)
      """
      # v1 = "alex"
      # v2 = iter(v1)
      # while True:
      #     try:
      #         val = v2.__next__()
      #         print(val)
      #     except Exception as e:
      #         break
      

    3.2 可迭代对象

    • 具有__inter__方法的就是可迭代对象,并且返回一个迭代器,才成为可迭代对象

      v1= [11,22,33,44]
      result= v1.__iter__()
      
    • 能被for循环的就是可迭代对象

    小结

    • 迭代器,对可迭代对象中的元素进行逐一获取,迭代器对象的内部都有一个 __next__方法,用于以一个个获取数据。
    • 可迭代对象,可以被for循环且此类对象中都有 __iter__方法且要返回一个迭代器(生成器)。
    • 生成器,函数内部有yield则就是生成器函数,调用函数则返回一个生成器,循环生成器时,则函数内部代码才会执行。
      • 生成器是特殊的迭代器(**)
  • 相关阅读:
    Grafana、Prometheus、mtail-日志监控
    Grafana、Prometheus-监控平台
    vijos1062迎春舞会之交谊舞
    【模板】字符串哈希
    非递归方式打印4的全排列
    蚂蚁金服后端开发面试
    Intern Day163
    Intern Day156
    Intern Day153
    Intern Day153
  • 原文地址:https://www.cnblogs.com/bigox/p/10738889.html
Copyright © 2020-2023  润新知