zoukankan      html  css  js  c++  java
  • 闭包,装饰器

    # 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()


  • 相关阅读:
    5.4.3 果园里的树
    5.3.2 字母重排
    5.3.1 6174问题
    Codeforces Round #253 (Div. 2), problem: (B)【字符串匹配】
    POJ1054 枚举【STL__binary_search()_的应用】
    432B
    0x3f3f3f3f...编程中无穷大常量的设置技巧
    2014年百度之星程序设计大赛 资格赛第一题 (longlong)
    Tarjan
    Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template
  • 原文地址:https://www.cnblogs.com/jassin-du/p/7773652.html
Copyright © 2011-2022 走看看