# def f1(b):# def f2():# print(b)# f2()## f1()# 闭包的定义# 内部的函数引用了外部函数的变量#def f1(b): #闭包的常用状态 def f2(): print(b) return f2f2 = 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 read1read_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 innerdef 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@logindef 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被调用了\n'%func.__name__) ret = func(*args,**kwargs) return ret return inner@logdef func1(): print('我是func1')@logdef func2(): print('我是func2')func1()func1()func2()