• 闭包,装饰器


    # def f1(b):
    #     def f2():
    #         print(b)
    #     f2()
    #
    # f1()
    # 闭包的定义
    # 内部的函数引用了外部函数的变量
    #
    def f1(b):     #闭包的常用状态
        def f2():
            print(b)
        return f2
    f2 = f1('bbb')
    ff = f1('bbb')
    ff()   #==f1('bbb')()
    
    # def f1():  #从内部函数返回一个值到全局
    #     b = 10
    #     def f2():
    #         return b
    #     return f2()
    # print(f1())
    
    #爬虫
    from urllib.request import urlopen
    # ret = urlopen('http://www.cnblogs.com/Eva-J/articles/7194277.html').read()
    # print(ret)
    def get_url(url):
        def read1():
            ret = urlopen(url).read()
            print(ret)
        return read1
    
    read_func = get_url('http://www.cnblogs.com/Eva-J/articles/7194277.html')
    read_func()
    read_func()
    # #讲故事
    # #带着你一步一步的剖析装饰器的成因
    # #关于时间:
    import time    #模块
    # start_time = time.time()
    # time.sleep(1)   # 睡眠时间
    # end_time = time.time()
    # print('=====%s====='%(end_time-start_time))
    import time    #模块
    def timmer(func):
        def inner():
            start_time = time.time()
            time.sleep(0.1)
            func()
            end_time = time.time()
            print('=====%s=====' % (end_time - start_time))
        return inner
    
    def func():
        print('公司好老板好同事好')
    
    func = timmer(func)
    func()
    #
    # 装饰器的作用
    # 在不改变函数的调用方式的情况下,给函数的前后添加新的功能
    #
    #从最简单的装饰器
    def timmer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
        def inner():      #在装饰器中需要定义一个内部函数
            print('努力工作')
            qqxing()      #被装饰的函数,并且要执行  功能模块
            print('吃喝玩乐')
        return inner      #将内部函数的名字返回
    
    @timmer   #语法糖  func = timmer(func)功能模块
    def func():
        print('有钱')
    
    func()
    # # 完整的装饰-万能的装饰
    # def timmer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
    #     def inner(*args,**kwargs):      #在装饰器中需要定义一个内部函数
    #         print('调用func之前')
    #         ret = qqxing(*args,**kwargs)      #被装饰的函数,并且要执行
    #         print('调用func之后')
    #         return ret
    #     return inner      #将内部函数的名字返回
    #
    # @timmer   #语法糖  func = timmer(func)
    # def func(name):
    #     print('%s的公司好老板好同事好'%(name))
    #     return 1111111111
    #
    # ret = func('俊杰')
    # print('result : %s'%ret)
    #
    # #装饰器的固定结构
    # def wrapper(func):
    #     def inner(*args,**kwargs):
    #         """被装饰函数执行之前要添加的代码"""
    #         ret = func(*args,**kwargs)
    #         """被装饰函数执行之后要添加的代码"""
    #         return ret
    #     return inner
    #
    #
    #
    #

     作业

     1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
    login_dic = {'alex':False}
    def login(func):
        def inner(*args,**kwargs):
            if not login_dic['alex']:
                usrname = input('用户名 : ')
                passwd = input('密  码 : ')
                with open('userinfo') as f:
                    for line in f:
                        usr,pwd = line.split(' ')
                        if usrname.strip() == usr and passwd.strip() == pwd:
                            print('登陆成功')
                            login_dic[usrname] = True
            if login_dic['alex']:
                ret = func(*args,**kwargs)
                return ret
        return inner
    
    @login
    def home():
        print('欢迎来到home页')
    
    home()
    home()
    home()
    2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
    def log(func):
        def inner(*args,**kwargs):
            with open('func.log','a+',encoding='utf-8') as f:
                f.write('%s被调用了
    '%func.__name__)
            ret = func(*args,**kwargs)
            return ret
        return inner
    
    @log
    def func1():
        print('我是func1')
    
    @log
    def func2():
        print('我是func2')
    
    func1()
    func1()
    func2()


  • 相关阅读:
    [转] iphoneX、iphoneXS、iphoneXSMax、iphoneXR适配
    [转] 以 async/await 为例,说明 babel 插件怎么搭
    [转] 使用Node.js实现简易MVC框架
    [转] vue异步处理错误
    [转] 谈谈前端异常捕获与上报
    everything 13问
    Mysql 工具mysqlbinlog
    Mysql 删除日志
    Mysql 错误 ERROR 1 (HY000) at line 1: Can't create/write to file '/home/kaizenly/cfg_dict.csv' (Errcode: 13
    Mysql 问题集
  • 原文地址:https://www.cnblogs.com/jassin-du/p/7773652.html
Copyright © 2020-2023  润新知