zoukankan      html  css  js  c++  java
  • CSIC_716_20191113【装饰器进阶以及迭代器】

    装饰器的进阶主要包含叠加装饰器有参装饰器

    叠加装饰器:在一个被装饰的对象中,添加多个装饰器。

    为什么要用叠加装饰器的原因:    -每一个新的功能都应该写一个新的装饰器,否则会导致,代码冗余,结构不清晰,可扩展性差。

    理解叠加装饰器的工作原理:装饰的时候就近原则,从下到上装饰,将函数包装起来。调用的时候自上往下执行最后,在最上层装饰器中return结束。

    有参装饰器:

    装饰中要传递参数,用三层结构的装饰器即可将参数传递。

    @wrapper('参数')

    有参装饰器的固定句式(一个参数)

    # _*_ coding: gbk _*_
    # @Author: Wonder
    def certified(paramater):   #这里只试验一个参数
        def wrapper(func):
            def inner(*args,**kwargs):            
                if('# 对paramater做个判断'):
                    #做一波条件成立的操作
                    res = func(*args, **kwargs)
                    return res
                else:
                    #做条件不成立的操作
                    res = func(*args, **kwargs)
                    return res          
            return inner
        return wrapper
    
    @certified('paramater')  # 传参数,这里只试验一个参数
    def func():
        print('做一波func的操作')
        return
    
    func( )  # 调用
    

      传多个参数的时候,在装饰器内部写入多种判断情况。可以拷贝被装饰对象,并在其上方添加参数不同的装饰器,即可实现多种判断。

    
    
    wraps:是一个修复工具,修复的是被装饰对象的空间。在装饰过程中,将装饰器中的闭包函数加入
    导入from functools import wraps,用法:在装饰器闭包函数上面
    #6.请实现一个装饰器,限制该函数被调用的频率,如10秒一次

    import time from functools import wraps runed_time = [0] def wrapper(func): @wraps(func) def inner(*args, **kwargs): hz = int(time.time()) if hz - runed_time[0] > 10: # 查看当前执行时间和上次执行时间之差 print('没等') res = func(*args, **kwargs) runed_time[0] = hz return res else: print('登陆中...') p = 10 - (hz - runed_time[0]) time.sleep(p) runed_time[0] = hz print(f'else等候了{p}秒') res = func() return res return inner @wrapper def drug(): print('执行一次') while True: input('>>>') drug() 
    # 函数对象.__doc__: 查看函数内部的注释

    迭代器 

    迭代:迭代指的是重复迭代,每一次迭代都是基于上一次的结果而来的。

    迭代器:迭代器指的是迭代取值的工具,它可以迭代取值

    可迭代对象,字符串str、列表list、元组tuple、字典dict、集合set、文件f

    可迭代对象可以通过  .__iter__()变成迭代器对象。

    迭代器对象可以通过 .__next__()取值。

    可迭代对象不一定是迭代器对象。   只有文件f是迭代器对象,其他都不是迭代器对象。

    迭代器对象都是可迭代对象。

    迭代器取值示范:

    # _*_ coding: gbk _*_
    # @Author: Wonder
    list1 = [0, 1, 2, 3, 4]
    iter_list1 = list1.__iter__()  # 可迭代对象变迭代器对象
    while True:
        try:
            print(iter_list1.__next__())
        except StopIteration:  # 捕获异常
            break
    

      

    迭代器的优点:

    1.节省内存空间

    2.提供了一种不依赖索引取值的方式

    缺点:

    1.无法通过len()方法计算长度

    2.取指定位置的值非常麻烦

    3.每次取值都从第一位开始,不可以索引取值

    for循环的原理

    for i in 可迭代对象
    in的操作 将可迭代对象.__iter__()转变为迭代器对象,
    再将迭代器对象.__next__(),对迭代器对象取值。

    可迭代对象不一定都是迭代器对象,因为除文件之外的可迭代对象都不是迭代器对象
    迭代器对象都是可迭代对象。

    可迭代对象都有 .__iter__( )方法
    迭代器对象都有.__next__( )的取值方法

  • 相关阅读:
    我开发的Quartz Cron表达式生成器
    web前端css定位position和浮动float
    ecmall模板编辑中的标题如何自定义读取
    记录一个项目的需求探讨过程
    这些记录
    今日工作总结:jquery轮转效果的集成与前台页面banner的设计思路总结
    小问题总结:鼠标点击到输入框(input)里的时候,输入框的提示消失,鼠标再移开,输入框提示出现
    web app与app的区别,即html5与app的区别
    3月初的日记:网站工作记录
    [接口]支付宝接口开发集成支付环境开发总结
  • 原文地址:https://www.cnblogs.com/csic716/p/11852896.html
Copyright © 2011-2022 走看看