#############################总结#########################################
函数名的应用:
1,直接打印函数名得到的是函数的内存地址。
2,函数名可以赋值运算
3,函数名可以作为函数的参数
4,函数名可以当做函数的返回值
装饰器:
python 里面的动态代理
存在的意义:在不破坏原有函数的基础上,给函数添加新的功能
def wrapper(fn):
def inner(*args,**kwargs): #为目标函数传参
'''在执行目标之前'''
ret=fn(*args,**kwargs)#调用目标函数,ret是目标函数的返回值
'''在执行目标之后'''
return ret #把目标函数返回值返回,保证函数正常的结束
return inner
@wrapper #target_fun=wrapper(target_func)
def target_func():
pass
target_func()
注意:return用法 1.函数遇到return时函数体结束 2.如果return后面跟上函数名则返回函数名在内存中的id 3.如果return后面跟上其他字符则返回其本身
###########################################################################
def wrapper(fn):
def inner(*args, **kwargs):
print("准备点钱")
ret = fn(*args, **kwargs)#这里不ret接收 得不到函数的返回值
return ret
return inner
#
@wrapper
def yue(tools):
print("使用%s约一约" % tools)
return "chengle"
ret = yue('momo')
print(ret)
准备点钱
使用momo约一约
chengle
login_name = "" flag = False def login_verify(fn): def inner(*args, **kwargs):#可以理解成函数的形参 while 1: if flag == True: ret = fn(*args, **kwargs)#可以理解成函数的实参 return ret else: print("您还没有登录. 请登录!") login() return inner def login(): print("=============欢迎进入登录环节================") while 1: uname = input('请输入你的用户名:') upwd = input('请输入你的密码:') f = open('register', mode="r", encoding="utf-8") for line in f: d = eval(line.strip()) if uname == d['username'] and upwd == d["password"]: global login_name global flag login_name = uname # 保存登录的用户名 flag = True print("=============登录成功!!!!!================") f.close() return else: f.close() # 关文件 y = input("=============用户名或密码错误,是否重新登录(Y/N)!!!!!================") if y.upper() != "Y": return
@login_verify
def article():
pass
#################################作业题##################################
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码
def func1(f):
def inner():
print('每次执行前都经过这里')
retun inner
@func1
def func2():
print('hello world')
func2()
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
def func2(f):
def innter():
a=1
while a<=3:
username=input('请输入用户名:')
password=input('请输入密码')
if username=='alex' and password=='123456':
f()
break
else:
print('账号错误,还剩下%s次机会' %(3-a))
a+=1
continue
return innter
@func2
def func1():
print('登陆成功')
func1()
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),
要求登录成功一次,后续的函数都无需再输入用户名和密码
dic = { 'name':None, 'status' : False } def func1(f): def inner(*args,**kwargs): num = 0 while num < 3: if dic['status']: ret = f(*args,**kwargs) return ret else: username = input('请输入用户名') password = input('请输入密码') f1 = open('test.txt',encoding='utf-8') for i in f1: new_list = i.strip().split() if username == new_list[0] and password == new_list[1]: dic['status'] = True break else: num += 1 print('输入用户名或密码错误还有{}次机会'.format(3-num)) continue return inner @func1# func4=func1(func4) def func4(): print('登录成功') func4()
6,给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
import time def wapper(f): def inner(*args,**kwargs): struct_time = time.localtime() time_log = time.strftime("%Y-%m-%d %H:%M:%S",struct_time) f1 = open('log1.txt',encoding='utf-8',mode='a') f1.write(time_log+' ') f1.write(str(f)+' ') f(*args,**kwargs) return inner @wapper def func1(*args,**kwargs): print('hello world') func1('aa','bbb')
import time def logger(fn): def inner(*args, **kwargs): # fn.__name__ # 函数名字 f = open("log", mode="a", encoding="utf-8") f.write("在%s, 访问了%s函数 " % (time.strftime("%Y-%m-%d %H:%M:%S"), fn.__name__)) ret = fn(*args, **kwargs) return ret return inner @logger def chi(): print("wusir特别能吃") @logger def he(): print("太白特别能和") @logger def shui(): print("太黑特别能睡") chi() chi() he() chi() shui() shui()