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