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\n') 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('三国电视剧第三部','三国鼎力')