# 装饰器:
# "在不改变原函数的基础上,给函数增加功能"
# 把一个函数当作参数,返回一个替代版的函数
# 本质上:返回函数的函数
def func1(): print 'have a nice day!' def func2(): print 'good luck!' def outer(func): def inner(): print '*********' func() print '&&&&&&&&&&&&' return inner func1 = outer(func1) func1()
*********
have a nice day!
&&&&&&&&&&&&
def say(age): print 'man is %d years old' % age def outer(func): def inner(age): if age < 0: age = 0 func(age) return inner # "化妆过的函数" say = outer(say) # 其实是调用的新的函数 say(-10)
man is 0 years old
def desc(fun): def add_info(): print '中秋快乐' fun() print '西开欢迎你' return add_info # 语法糖 @desc def login(): # print '中秋快乐...' print 'login....' # print '西开欢迎你...' @desc # login = desc(login) def logout(): print 'logout....' @desc def savemoney(): print '存钱...' @desc def transferMoney(): print '转账....' # def .. login() logout() savemoney() transferMoney()
中秋快乐
login....
西开欢迎你
中秋快乐
logout....
西开欢迎你
中秋快乐
存钱...
西开欢迎你
中秋快乐
转账....
西开欢迎你
装饰器的需求:获取每个函数的执行时间
1).函数执行之前计算时间
2).函数执行之后计算时间
1.问题1:被装饰的函数有返回值的时候怎么办
2.问题2:如何保留被装饰函数的函数名和帮助文档信息
import time import string import random import functools li = [random.choice(string.ascii_letters) for i in range(100)] def timeit(fun): """这是一个装饰器timeit""" @functools.wraps(fun) def wrapper(*arges, **kwargs): # 接收可变参数和关键字参数 """这是一个wrpper函数""" # args:元组 kwargs:字典 # 函数执行之前 start_time = time.time() # 执行函数 res = fun(*arges, **kwargs) # fun_list(50000) # 函数执行之后 end_time = time.time() print '运行时间为:%.6f' % (end_time - start_time) return res return wrapper @timeit def con_add(): s = '' for i in li: s += (i + ',') print s @timeit def join_add(): print ','.join(li) con_add() join_add()
A,O,t,p,Y,Z,M,r,a,S,y,H,J,C,b,y,H,Y,K,W,k,j,w,x,s,S,Z,z,N,m,s,R,y,z,E,D,z,Y,r,i,l,F,l,R,f,y,W,f,I,S,U,d,g,R,X,A,E,X,t,r,Q,R,h,L,V,H,l,t,d,l,T,x,p,p,D,K,f,T,E,m,N,l,b,H,r,M,e,I,f,b,U,Z,O,K,R,p,X,w,e,o,
运行时间为:0.000054
A,O,t,p,Y,Z,M,r,a,S,y,H,J,C,b,y,H,Y,K,W,k,j,w,x,s,S,Z,z,N,m,s,R,y,z,E,D,z,Y,r,i,l,F,l,R,f,y,W,f,I,S,U,d,g,R,X,A,E,X,t,r,Q,R,h,L,V,H,l,t,d,l,T,x,p,p,D,K,f,T,E,m,N,l,b,H,r,M,e,I,f,b,U,Z,O,K,R,p,X,w,e,o
运行时间为:0.000009
import time import string import random import functools li = [random.choice(string.ascii_letters) for i in range(100)] def timeit(fun): """这是一个装饰器timeit""" @functools.wraps(fun) def wrapper(*arges, **kwargs): # 接收可变参数和关键字参数 """这是一个wrpper函数""" # args:元组 kwargs:字典 # 函数执行之前 start_time = time.time() # 执行函数 res = fun(*arges, **kwargs) # fun_list(50000) # 函数执行之后 end_time = time.time() print '运行时间为:%.6f' % (end_time - start_time) return res return wrapper @timeit def fun_list(n): """这是fun_list函数,被timeit装饰""" return [2 * i for i in range(n)] @timeit def fun_map(n): """这是fun_map函数""" return list(map(lambda x: x * 2, range(n))) print fun_list(50000) print fun_map(50000) print fun_map.__name__ print fun_map.__doc__ print fun_list.__name__ print fun_list.__doc__
带有参数的装饰器
import functools import time def log(kind): # kind = 'debug' def add_log(fun): @functools.wraps(fun) def wrapper(*args, **kwargs): start_time = time.time() res = fun(*args, **kwargs) end_time = time.time() print '<%s> [%s] 函数名:%s,运行时间:%.5f,运行的返回值结果%d' \ % (kind, time.ctime(), fun.__name__, end_time - start_time, res) return res return wrapper return add_log # log('debug') 返回值:add_log # add = add_log(add) @log('debug') def add(x, y): time.sleep(1) return x + y print add(1, 2)
<debug> [Thu Sep 6 12:45:45 2018] 函数名:add,运行时间:1.00109,运行的返回值结果3
3
带有多个装饰器的函数
# 需求: 用户登陆验证的装饰器is_login
# 1). 如果用户登陆成功, 则执行被装饰的函数;
# 2). 如果用户登陆不成功, 则执行登陆函数
#需求: 判断登陆用户是否未管理员is_admin(此处管理员只有一个为:admin用户)
# 1).如果用户为管理员, 则执行被装饰的函数;
# 2).如果用户不是管理员, 则报错;
import functools login_users = ['admin', 'root'] def is_admin(fun): @functools.wraps(fun) def wrapper(*args, **kwargs): if kwargs.get('name') == 'admin': res = fun(*args, **kwargs) return res else: return 'Error:您没有权限访问该网站' return wrapper def is_login(fun): @functools.wraps(fun) def wrapper(*args, **kwargs): # 判断要写博客的这个用户是否登陆成功 if kwargs.get('name') in login_users: res = fun(*args, **kwargs) return res else: res = login() return res return wrapper @is_admin @is_login def writeBlog(name): return '编写博客' def login(): return '登陆。。。' print(writeBlog(name='admin'))
编写博客
map():python内置函数,接收两个参数,一个是函数,一个是序列
map依次将序列传递给函数,并把结果作为新的列表返回
匿名函数:lambda x: x * x
def f(x): return x * x print map(f, [1, 2, 3, 4, 5]) print map(lambda x: x * x, [1, 2, 3, 4, 5])
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
模块
import time time.sleep(2) a = time.time() print a
1536209716.11
import os print os.listdir('/var/log')
['tallylog', 'glusterfs', 'lastlog', 'wtmp', 'samba', 'libvirt', 'pluto', 'audit', 'chrony', 'ppp', 'rhsm', 'gdm', 'speech-dispatcher', 'sa', 'tuned', 'yum.log', 'anaconda', 'secure-20180820', 'secure', 'dmesg.old', 'Xorg.0.log.old', 'wpa_supplicant.log-20180821', 'spooler', 'cron-20180826', 'maillog-20180826', 'messages-20180826', 'cron-20180904', 'cron-20180814', 'maillog-20180814', 'messages-20180814', 'spooler-20180826', 'cron', 'messages-20180904', 'firewalld', 'wpa_supplicant.log-20180816', 'cron-20180820', 'maillog-20180820', 'messages-20180820', 'spooler-20180820', 'httpd', 'messages', 'wpa_supplicant.log-20180827', 'maillog', 'Xorg.1.log', 'dmesg', 'spooler-20180814', 'mariadb', 'secure-20180826', 'spooler-20180904', 'wpa_supplicant.log-20180904', 'wpa_supplicant.log', 'btmp-20180904', 'btmp', 'boot.log', 'Xorg.0.log', 'maillog-20180904', 'secure-20180814', 'secure-20180904']
import random import string print random.random() print random.randint(1, 4) print random.choice('hello') # 从序列中拿出一个值来 print random.sample(string.ascii_letters, 4) # 从序列中拿出指定个数的值来
0.896805226067
1
l
['o', 'x', 'V', 'Z']
生成二维码
import qrcode img = qrcode.make('http://www.baidu.com') img.save('hello.png')
itchat
# 1.给手机助手发送消息
import itchat import random import time itchat.auto_login(hotReload=True) while True: time.sleep(random.randint(1, 3)) itchat.send('hello', toUserName='filehelper') itchat.send_file('/etc/passwd', toUserName='filehelper')
# 2.统计你的好友的男女比例
import itchat import random import time itchat.auto_login(hotReload=True) fd = itchat.get_friends() info = {} for f in fd[1:]: if f['Sex'] == 1: info['male'] = info.get('male', 0) + 1 elif f['Sex'] == 2: info['female'] = info.get('female', 0) + 1 else: info['other'] = info.get('other', 0) + 1 print(info)
{'male': 48, 'other': 7, 'female': 29}
# 在python中执行shell命令
# 1.可以判断命令是否执行成功;如果返回值为0,则执行成功 如果不为0 则执行不成功
# res = os.system('hostname')
# print(res)
# 2.保存命令的执行结果
# res = os.popen('hostname').read()
# print(res)
import os import itchat @itchat.msg_register(itchat.content.TEXT) def text_reply(msg): """ 需求:当文件助手发送消息的时候,执行发送的内容 1.如果执行成功,显示执行成功:执行结果 2.反之,则显示失败 """ print(msg) if msg['ToUserName'] == 'filehelper': # 获取要执行命令的内容 command = msg['Content'] # 让电脑执行命令代码 # 如果执行成功,返回值是0 if os.system(command) == 0: res = os.popen(command).read() result = '[返回值] - 命令执行成功,执行结果:\n' + res itchat.send(result, 'filehelper') # 命令执行失败,请重新输入命令 else: result = '[返回值] - 命令%s执行失败,请重试' % (command) itchat.send(result, 'filehelper') itchat.auto_login(hotReload=True) itchat.run()
{'MsgId': '8228046106704419388', 'FromUserName': '@a163546c548b1dd0ea9a8f2b31a60c6db403b00dec7ed870d1b1a4ecf4753d38', 'ToUserName': 'filehelper', 'MsgType': 1, 'Content': 'pwd', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1536210656, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 8228046106704419388, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'UserName': 'filehelper', 'MemberList': <ContactList: []>}>, 'Type': 'Text', 'Text': 'pwd'}
/home/kiosk/PycharmProjects/python/day03
import itchat import requests import time def get_tuling_reponse(_info): print(_info) api_url = 'http://www.tuling123.com/openapi/api' data = { 'key': 'd08ab24c85de412a86fb9e9e0fa98d27', 'info': _info, 'userif': 'happy' } # 发送数据到指定的网址,获取网址返回的数据(字典数据类型) res = requests.post(api_url, data).json() # 返回的内容 print(res['text']) return res['text'] get_tuling_reponse('给我讲过笑话吧') get_tuling_reponse('不好笑') get_tuling_reponse('给我讲个故事吧')
给我讲过笑话吧
老公问你说以后孩子跟你亲还是跟我亲?我说,当然跟你亲啦!问我为啥,我说,以后你将会为他洗衣服做饭送他上学,给他玩具-老公说,别客气了,还是让他跟你亲吧!
不好笑
你笑点不行呢,明明很好笑
给我讲个故事吧
小母牛看见公牛在辛苦地干活,十分可怜他。可是祭祀时,主人家不用公牛,却捉住小母牛去宰杀。这时,公牛笑着对她说:“喂,小母牛,正因为你要作祭品,所以你就什么活都不必干。”
这说明,危险等着那些游手好闲的人。
import itchat import requests import time def get_tuling_reponse(_info): print(_info) api_url = 'http://www.tuling123.com/openapi/api' data = { 'key': 'd08ab24c85de412a86fb9e9e0fa98d27', 'info': _info, 'userif': 'happy' } # 发送数据到指定的网址,获取网址返回的数据(字典数据类型) res = requests.post(api_url, data).json() # 返回的内容 print(res['text']) return res['text'] # 时刻监控好友发送的文本信息,并且给予一个回复 @itchat.msg_register(itchat.content.TEXT, isFriendChat=True) def text_reply(msg): content = msg['Content'] returnContent = get_tuling_reponse(content) return returnContent itchat.auto_login(hotReload=True) itchat.run()
hello
你好
你好
嘿嘿,你也好啦~