zoukankan      html  css  js  c++  java
  • 8-day8-列表解析-装饰器-迭代器

    有参装饰器:

    # 既要传函数,又要传参数
    dict_1 = {}
    print(dict_1)
    
    def deco(keys):
        def add_dict(fun):
            def wrapper():
                dict_1[keys] = fun
                print(dict_1)
            return wrapper
        return add_dict
    
    @deco('shooping_cart')
    def shooping_cart():
        print('shopping successful')
    
    
    
    @deco('buy_vip')
    def buy_vip():
        print('buy vip successful')
    
    
    @deco('book_tickets')
    def book_tickets():
        print('booking ticket successfully')
    
    
    shooping_cart()
    buy_vip()
    book_tickets()

    装饰器作业:

    # 四:编写装饰器,为多个函数加上认证功能
    
    
    # with open('a.txt', 'r', encoding='utf-8') as f:
    #     res = f.read()
    #     user_dic = eval(res)
    
    login_dic = {
        'user': None,         # None 为python数据类型,并不完全=0
        'status': False,
    }
    
    # 内层函数传参数,外层传函数名
    
    
    def auth(func):
        def wrapper(*args, **kwargs):
            if login_dic['use r'] and login_dic['status']:
                res = func(*args, **kwargs)
                return res
            name = input('your name: ')
            password = input('your password: ')
            with open('a.txt', 'r', encoding='utf-8') as f:
                user_dic = eval(f.read())
                if name in user_dic and password == user_dic[name]:
                    print('login ok')
                    login_dic['user'] = name
                    login_dic['status'] = True
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('login err')
        return wrapper
    
    
    @auth
    def index():
        print('welecome to index')
    
    
    @auth
    def home(name):
        print('welecome %s to home page' % name)
    
    
    index()
    
    home('egon')
    
    
    # 五:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
    
    from urllib.request import urlopen
    def get(url):
        res = urlopen(url).read()
        return res
    get('http://www.baidu.com')
    # print(get('http://www.baidu.com'))
    
    
    # 六:为题目五编写装饰器,实现缓存网页内容的功能:
    #     具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
    
    
    from urllib.request import urlopen
    import os
    
    
    def make_cache(func):
        def wrapper(*args, **kwargs):
            if os.path.getsize('b.txt'):
                print('=========>有缓存')
                with open('b.txt', 'rb') as f:
                    res = f.read()
    
            else:
                res = func(*args, **kwargs)
                with open('b.txt', 'wb') as f:
                    f.write(res)
    
            return res
    
        return wrapper
    
    
    @make_cache
    def get(url):
        return urlopen(url).read()
    
    get('http://www.baidu.com')
    
    
    # 七:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
    
    func_dic = {}
    
    
    def deco(key):
        def wrapper(func):
            func_dic[key]=func
        return wrapper
    
    
    @deco('f1')
    def f1():
        print('from f1')
    
    
    @deco('f2')
    def f2():
        print('from f2')
    
    f1('f1')
    f2('f2')
    
    print(func_dic)
    
    while True:
        cmd = input('>>:').strip()
        if cmd in func_dic:
            func_dic[cmd]()

    装饰器作业:

    # 1 整理今天装饰器代码(每人手写一份,注意,是手写,交到小组长手里,明天我检查),准备明天默写
    #
    # 2 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到文件中
    #     注意:时间格式的获取
    #         import time
    #         time.strftime('%Y-%m-%d %X')
    #
    # 3 判断下列数据类型是可迭代对象or迭代器
    #
    # s='hello'
    # l=[1,2,3,4]
    # t=(1,2,3)
    # d={'a':1}
    # set={1,2,3}
    # f=open('a.txt')
    #
    # 4 分别用依赖索引和不依赖索引两种方式迭代上述对象
    #
    # 5 选做题:
    #     基于课上所讲网页缓存装饰器的基础上,实现缓存不同网页的功能
    #     要求,用户提交的不同url,都能缓存下来,对相同的url发起下载请求,优先从缓存里取内容
    
    
    # 2 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到文件中
    #     注意:时间格式的获取
    #         import time
    #         time.strftime('%Y-%m-%d %X')
    
    import time
    
    
    def run_func(func1):
        def print_log():
            with open('run.log', 'a', encoding='utf-8') as f:
                r_time = time.strftime('%Y-%m-%d %H:%M:%S
    ')
                f.write(r_time)
                func1()
        return print_log
    
    
    @run_func
    def func2():
        print('函数执行')
    
    func2()
    
    
    # 3 判断下列数据类型是可迭代对象or迭代器
    #
    # s='hello'
    # l=[1,2,3,4]
    # t=(1,2,3)
    # d={'a':1}
    # set={1,2,3}
    # f=open('a.txt')
    
    s = 'hello'  可迭代对象
    s.__int__()  迭代器
    
    
    l=[1,2,3,4]
    l.__iter__()
    i=l.__iter__()
    print(i.__next__())
    print(i.__next__())
    print(i.__next__())
    
    
    t=(1,2,3)
    t.__iter__()
    d={'a':1}
    d.__iter__()
    set={1,2,3}
    set.__iter__()
    f=open('a.txt')
    f.__iter__()

    迭代器

    # eg 迭代器,以来索引的迭代
    l=[1, 2, 3, 4, 5]
    count = 0
    while count < len(l):
        print(l[count])
        count += 1
    
    # 不依赖索引的迭代
    for count in range(len(l)):
        print(l[count])
    
    
    # python为了提供一种不依赖索引的迭代方式
    # python会为一些对象内置__iter__方法
    # obj.__iter__ 称为迭代对象
    # obj.__iter__得到的结果就是迭代器
    # 得到的迭代器:既有obj.__iter__ 又有obj.__next__
    d = {'q': 1, 'd': 2, 'ds': 3}
    for i in d :
        print(i)
    

      有参装饰器习题

    #带参数的装饰器和不带参数的装饰器
    
    #!/usr/bin/env python
    #encoding: utf-8
    def start_info():
        print ('电视剧开头曲.......')
        print ('开始唱歌.......')
    def end_info():
        print ('电视剧结束曲.......')
    
    def filter(start_info,end_info): #接收俩函数
        def outer(main_fun): #接收装饰的函数
            def app(*argv,**kwargs): #接收装饰的函数的参数
                print('******************************')
                start_info()
                main_fun(*argv,**kwargs)#接收装饰的函数的参数
                end_info()
                print('******************************')
            return app
        return outer
    #先把函数传进去,然后在用里面的函数装饰
    #传函数的装饰器必须有三个def ,第一个是接受函数,第二个是装饰函数的,返回第三个函数对象
    # 把需要装饰的函数重新定义,然后调用调用
    #1: filter(start_info,end_info):
    #2: @outer ->  one_info = outer(one_info)
    @filter(start_info,end_info) #这里传入俩个函数
    def one_info(name,info):
        print ('this is one')
        print('wolcome to tv %s .......' % (name))
        print('wolcome to tv %s .......' % (info))
    
    @filter(start_info,end_info)
    def two_info(name,info):
        print('this is two')
        print('wolcome to tv %s .......' % (name))
        print('wolcome to tv %s .......' % (info))
    
    @filter(start_info,end_info)
    def three_info(name,info):
        print('this is three')
        print('wolcome to tv %s .......' % (name))
        print('wolcome to tv %s .......' % (info))
    
    if __name__ == "__main__":
        print('三国演义三部曲开始。。。。。。。。')
        print('第一部。。。。。。。。。。。。。。')
        one_info('三国电视剧第一部', '三国大战')
    
        print('第二部。。。。。。。。。。。。。。')
        two_info('三国电视剧第二部', '三国英雄')
    
        print('第三部。。。。。。。。。。。。。。')
        three_info('三国电视剧第三部', '三国鼎力')
    
    
    #!/usr/bin/env python
    #encoding: utf-8
    def start_info():
        print ('电视剧开头曲.......')
        print ('开始唱歌.......')
    def end_info():
        print ('电视剧结束曲.......')
    
    def outer(main_fun): #接收装饰的函数
        def app(*argv,**kwargs): #接收装饰的函数的参数
            print('******************************')
            start_info()
            main_fun(*argv,**kwargs)#接收装饰的函数的参数
            end_info()
            print('******************************')
        return app
    
    #1: @outer ->  one_info = outer(one_info)
    @outer
    def one_info(name,info):
        print ('this is one')
        print('wolcome to tv %s .......' % (name))
        print('wolcome to tv %s .......' % (info))
    
    @outer
    def two_info(name,info):
        print('this is two')
        print('wolcome to tv %s .......' % (name))
        print('wolcome to tv %s .......' % (info))
    
    @outer
    def three_info(name,info):
        print('this is three')
        print('wolcome to tv %s .......' % (name))
        print('wolcome to tv %s .......' % (info))
    
    if __name__ == "__main__":
        print ('三国演义三部曲开始。。。。。。。。')
        print ('第一部。。。。。。。。。。。。。。')
        one_info('三国电视剧第一部','三国大战')
    
        print('第二部。。。。。。。。。。。。。。')
        two_info('三国电视剧第二部','三国英雄')
    
        print('第三部。。。。。。。。。。。。。。')
        three_info('三国电视剧第三部','三国鼎力')
  • 相关阅读:
    4.终端
    **如何让CI框架支持service层
    *CI框架装载器Loader.php源码分析
    如何在CI中写工具类,在哪个目录写
    ***在PHP语言中使用JSON和将json还原成数组(json_decode()的常见错误)
    DedeCMS常见问题和技巧
    ***Linux系统下如何查看及修改文件读写权限
    ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
    PHP5.2至5.6的新增功能详解
    PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解
  • 原文地址:https://www.cnblogs.com/cx2c/p/7050165.html
Copyright © 2011-2022 走看看