• 圣诞节的整理前两周的内容3


    一、装饰器:

    1.装饰器的基本实现:

    2.

    # def cal():
    #     res=0
    #     for i in range(5,10):
    #         res+=i
    #     return res
    # print(cal())
    # # 是从0加到4
    
    
    #
    # import time
    # def cal():
    #     start_time=time.time()
    #     res=0
    #     for i in range(10):
    #         res+=i
    #         stop_time=time.time()
    #     print('这个函数的运行时间是%s'%(stop_time-start_time))
    #     return res
    # print(cal())
    
    
    
    
    
    
    # import time
    # def timmer(func):
    #     def wrapper(*args,**kwargs):
    #         start_time=time.time()
    #         res=func(*args,**kwargs)
    #         stop_time=time.time()
    #         print('函数运行的时间是%s'%(stop_time-start_time))
    #         return res
    #     return wrapper
    # @timmer
    # def cal():
    #     res=0
    #     for i in range(10):
    #         time.sleep(0.1)
    #         res+=i
    #     return res
    # print(cal())
    
    
    
    # 高阶函数复习
    # def foo():
    #     print('你好啊林师傅')
    # def test(func):
    #     print(func)
    # test(foo())
    # test(foo)
    
    
    
    
    # def foo():
    #     print('你好啊林师傅')
    # def test(func):
    #     print(func)
    #     func()
    # test(foo)
    
    
    
    
    # def foo():
    #     print('from the foo')
    # def test(func):
    #     return func
    # print(test(foo))
    #
    # # pp=test(foo)
    # # pp()
    #
    # foo=test(foo)
    # foo()
    
    
    
    
    
    
    
    
    
    
    
    
    # def father(name):
    #     print('from father %s'%name)
    #     def son():
    #         print('from the son')
    #     print(locals())
    # father('alex')
    
    
    # def foo():
    #     name='lijialun'
    #     def pp():
    #         name='sjdk'
    #         print(locals())
    #     return pp()
    # foo()
    # local()函数的作用:将局部变量显示出来,并且以字典的形式。
    
    
    
    
    # 装饰器的基本实现:
    import time
    def timmer(func):
        def wrapper():
            start_time=time.time()
            func()
            stop_time=time.time()
            print('运行了%s'%(stop_time-start_time))
        return wrapper
    @timmer   #相当于   test=timmer(test)
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    test()
    
    
    
    
    
    
    # # 加上返回值
    # import time
    # def timmer(func):
    #     def wrapper():
    #         start_time=time.time()
    #         res=func()
    #         print(res)
    #         stop_time=time.time()
    #         print('运行了%s'%(stop_time-start_time))
    #         return 123
    #     return wrapper
    # @timmer    #等于test=timmer(test)
    # def test():
    #     time.sleep(3)
    #     print('test函数运行完毕')
    #     return '这是test的返回值!'
    # # res=test()
    # # print(res)
    # # # 这时,返回的是none!因为返回的不是test的return,而是timmer的return值,进而返回的是wrapper 的返回值。
    # # 而wrapper没有返回值,因此是none
    # res=test()
    # print(res)
    
    
    
    
    
    
    
    # # 加上参数
    # import time
    # def timmer(func):
    #     def wrapper(*args,**kwargs):
    #         start_time=time.time()
    #         res=func(*args,**kwargs)
    #
    #         stop_time=time.time()
    #         print('运行了%s'%(stop_time-start_time))
    #         return res
    #     return wrapper
    # @timmer    #等于"test=timmer(test)"
    # def test(name,age):
    #     time.sleep(1)
    #     print('test函数运行完毕',name,age)
    #     return '这是test的返回值!'
    #
    # @timmer   #相当于“test1=timmer(test1)"
    # def test1(name,age,gender):
    #     time.sleep(1)
    #     print('test函数运行完,名字是%s,年龄是%s,性别%s' %(name,age,gender))
    #     return '这是test1的返回值!'
    # res=test('linhaifeng',18)
    # print(res)
    # pp=test1('wupeiqi',19,'男')
    # print(pp)
    # #这样就存在了参数不固定的问题
    # #所以不能再wrapper中书写固定的参数——引入*,**
    
    
    
    
    
    
    
    # def test(*args,**kwargs):
    #     print(args)
    #     print(kwargs)
    # test(1,2)
    # #输出结果:
    # # (1, 2)————元组形式
    # # {}————字典形式
    # test(1,2,3,name=18)
    # #输出结果:
    # #  (1, 2, 3)
    # # {'name': 18}
    # test(1,2,3,name=18,age=1999)
    # #输出结果:
    # # (1, 2, 3)
    # # {'age': 1999, 'name': 18}
    # # test(mee=wdw,1,2,3,name=18)
    # # SyntaxError: non-keyword arg after keyword arg
    
    
    
    
    
    # # 分析args,kwargs:
    # import time
    # def timmer(func):
    #     def wrapper(*args,**kwargs):
    #         start_time=time.time()
    #         res=func(*args,**kwargs)
    #
    #         stop_time=time.time()
    #         print('运行了%s'%(stop_time-start_time))
    #         return res
    #     return wrapper
    # @timmer    #等于"test=timmer(test)"
    # def test(name,age):
    #     time.sleep(1)
    #     print('test函数运行完毕',name,age)
    #     return '这是test的返回值!'
    #
    # @timmer   #相当于“test1=timmer(test1)"
    # def test1(name,age,gender):
    #     time.sleep(1)
    #     print('test函数运行完,名字是%s,年龄是%s,性别%s' %(name,age,gender))
    #     return '这是test1的返回值!'
    # res=test('linhaifeng',18)
    # print(res)
    # pp=test1('wupeiqi',19,'男')
    # print(pp)
    # #这样就存在了参数不固定的问题
    # #所以不能再wrapper中书写固定的参数——引入*,**

    二、装饰器模拟session:

    # user_dic={'username':None,'login':False}    #定义了一个全局变量
    #
    # def auth_func(func):
    #     def wrapper(*args,**kwargs):
    #         if user_dic['username'] and user_dic['login']:   #字典的索引,即:None and False
    #             res = func(*args, **kwargs)
    #             return res
    #         username=input('用户名:').strip()
    #         passwd=input('密码:').strip()
    #         if username=='sb' and passwd=='123':
    #             user_dic['username']=username
    #             user_dic['login']=True      #这两步相当于直接把全局变量给改了,接下来就不用每次都输入用户名和密码了
    #             res=func(*args,**kwargs)
    #             return res
    #         else:
    #             print('不对')
    #     return wrapper
    # @auth_func
    # def index():
    #     print('欢迎来到京东主页')
    # @auth_func
    # def home(name):
    #     print('%s欢迎回家'%(name))
    # @auth_func
    # def shopping_car(name):
    #     print('%s的购物车里面有【%s】【%s】【%s】'%(name,'奶茶','玩具','小视频'))
    # index()
    # home('产品经理')
    # shopping_car('产品经理')
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    user_list=[
        {'name':'alex','passwd':'123'},
        {'name':'linhaifeng','passwd':'123'},
        {'name':'wupeiqi','passwd':'123'},
        {'name':'yuanhao','passwd':'123'}   #用户信息列表
    ]
    current_dic={'username':None,'login':False}    #记录当前用户登录状态
    
    def auth_func(func):
        def wrapper(*args,**kwargs):
            if current_dic['username'] and current_dic['login']:   #字典的索引,即:None and False
                res = func(*args, **kwargs)
                return res
            username=input('用户名:').strip()
            passwd=input('密码:').strip()
            for user_dic in user_list:   #user_dic是新的变量!!
                if username==user_dic['name'] and passwd==user_dic['passwd']:
                    current_dic['username']=username
                    current_dic['login']=True
                    res = func(*args, **kwargs)
                    return res
            else:   #注意else 的位置!
                print('用户名不正确,或者密码错误')
    
    
        return wrapper
    @auth_func
    def index():
        print('欢迎来到京东主页')
    @auth_func
    def home(name):
        print('%s欢迎回家'%(name))
    @auth_func
    def shopping_car(name):
        print('%s的购物车里面有【%s】【%s】【%s】'%(name,'奶茶','玩具','小视频'))
    index()
    home('产品经理')
    shopping_car('产品经理')

    三、生成器函数:

    # p=(i for i in range(10))
    # print(p)
    # print(next(p))
    # print(next(p))
    # print(next(p))
    # print(next(p))
    # print(next(p))
    
    
    
    
    
    # def test():
    #     print('我要生孩子了')
    #     print('我要生孩子了')
    #     return '我'
    # res=test()
    # print((res))

    四、解压序列:

    # a,b,c=[1,2,3]
    # print(a)
    # print(b)
    # print(c)
    
    
    
    # a,b,c=(1,2,3,4)
    # print(a)
    # print(b)
    # print(c)
    # #报错!
    
    
    
    
    #
    # a,b,c='hel'
    # print(a)
    # print(b)
    # print(c)
    
    
    
    
    
    # # p=[10,3,2,4,6,2,23,53,2,2134]
    # #需求:只取第一个和最后一个
    # a,*_,c=[10,3,2,4,6,2,23,53,2,2134]
    # print(a)
    # print(c)
    
    # a,*d,c=[10,3,2,4,6,2,23,53,2,2134]
    # print(d)

    五、加验证:

    def auth_func(func):
        def wrapper(*args,**kwargs):
            username=input('用户名:').strip()
            passwd=input('密码:').strip()
            if username=='sb' and passwd=='123':
                res=func(*args,**kwargs)
                return res
            else:
                print('不对')
        return wrapper
    @auth_func
    def index():
        print('欢迎来到京东主页')
    @auth_func
    def home(name):
        print('%s欢迎回家'%(name))
    @auth_func
    def shopping_car(name):
        print('%s的购物车里面有【%s】【%s】【%s】'%(name,'奶茶','玩具','小视频'))
    index()
    home('产品经理')
    shopping_car('产品经理')

    六、生产者消费者模型:

    #
    # # 复习一下enumerate()函数:
    # season=['spring','summer','fall','winter']
    # print(enumerate(season))
    # print(list(enumerate(season)))
    
    
    
    
    
    #
    # # 补充知识:触发生成器有三种方式:1,.__next__()     2.next()    3.send()
    # def test():
    #     print('开始啦')
    #     yield 1
    #     print('第一次')
    #     yield 2
    #     print('第三次')
    #     yield 3
    # t=test()
    #
    # # print(t.__next__())
    #
    # # print(next(t))
    #
    # # print(t.send(None))
    #
    # # 以上三个方法的结果是一样的!!!!!
    #
    # print(t.send(None))
    # t.send(None)
    # t.send(None)  #相当于None赋值给了yield  !!!
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    # def test():
    #     print('开始啦')
    #     yield
    #     print('第一次')
    #     yield 2
    #     print('第三次')
    #     yield 3
    # t=test()
    # print(t.__next__())
    # t.send(None)
    
    
    
    
    
    
    #
    #
    # def test():
    #     print('开始啦')
    #     first=yield
    #     print('第一次',first)
    #     yield 2
    #     print('第三次')
    #     yield 3
    # t=test()
    # print(t.__next__())
    # # # print(t.__next__())
    # # print(t.send(None))
    # print(t.send('函数停留在first那个位置,我就是给first赋值的'))
    
    
    
    # 视频上的讲解:
    # def producer():
    #     ret=[]
    #     for i in range(10000):
    #         ret.append('包子%s'%i)
    #     return  ret
    # def consumer(name):
    #     print('我是[%s],我准备开始吃包子了'%name)
    #     while True:
    #         baozi=yield
    #         print('%s  很开心的把[%s]吃掉了' %(name,baozi))
    # c1=consumer('wupeiqi')
    # c1.__next__()
    # c1.send('屎馅包子')
    
    
    
    
    
    
    # 自己的思考:
    # def consumer(name):
    #     print('我是[%s],我准备开始吃包子了'%name)
    #
    #     baozi=yield
    #     print('%s  很开心的把[%s]吃掉了' %(name,baozi))
    #     yield 2
    # c1=consumer('wupeiqi')
    #
    # # c1.send('屎馅包子')
    # print(c1.__next__())
    # c1.send('屎馅包子')
    
    
    
    
    
    
    # 终结版:
    import time
    def consumer(name):
        print('我是%s,我准备开始吃包子了'%name)
        while True:
            baozi=yield
            time.sleep(1)
            print('%s很开心的把【%s】吃掉了'%(name,baozi))
    def producuer():
        c1=consumer('wupeiqi')
        c1.__next__()
        for i in range(10):
            time.sleep(1)
            c1.send('包子%s'%i)
    producuer()

    七、函数闭包带参数装饰器:

    user_list=[
        {'name':'alex','passwd':'123'},
        {'name':'linhaifeng','passwd':'123'},
        {'name':'wupeiqi','passwd':'123'},
        {'name':'yuanhao','passwd':'123'}   #用户信息列表
    ]
    current_dic={'username':None,'login':False}    #记录当前用户登录状态
    def auth(auth_type='filedb'):
        def auth_func(func):   #这时不管auth_func有多少层,都能够接收auth_type这个参数。
            def wrapper(*args,**kwargs):
                if auth_type=='filedb':     #增加if判断auth_type
                    if current_dic['username'] and current_dic['login']:   #字典的索引,即:None and False
                        res = func(*args, **kwargs)
                        return res
                    username=input('用户名:').strip()
                    passwd=input('密码:').strip()
                    for user_dic in user_list:   #user_dic是新的变量!!
                        if username==user_dic['name'] and passwd==user_dic['passwd']:
                            current_dic['username']=username
                            current_dic['login']=True
                            res = func(*args, **kwargs)
                            return res
                    else:   #注意else 的位置!
                        print('用户名不正确,或者密码错误')
                elif auth_type=='ldap':
                    print('鬼知道怎么玩,只是为了多一个选择而已')
                else:
                    print('鬼知道你用的是什么类型')
            return wrapper
        return auth_func         #返回auth_func相当于没有做任何改动,只是加了一层可选类型而已 。所以最终还是@auth_func
    @auth(auth_type='filedb')
    def index():
        print('欢迎来到京东主页')
    @auth(auth_type='ldap')
    def home(name):
        print('%s欢迎回家'%(name))
    @auth(auth_type='xxxxx')
    def shopping_car(name):
        print('%s的购物车里面有【%s】【%s】【%s】'%(name,'奶茶','玩具','小视频'))
    
    index()
    home('产品经理')
    shopping_car('产品经理')
  • 相关阅读:
    Windows下获取逻辑cpu数量和cpu核数量
    QtScript, QML, Quick1, Quick2, Declarative 之间的关系
    将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
    QPixmap的缓冲区
    Qt+QZXing编写识别二维码的程序
    ASP.NET 5:依赖注入
    angularJS之使用指令封装DOM操作
    Windows 10技术布局,谈微软王者归来
    Microsoft dotnetConf 2015
    Net社区虚拟大会
  • 原文地址:https://www.cnblogs.com/mufaiyang/p/10174551.html
Copyright © 2020-2023  润新知