python装饰器

# 装饰器:
# "在不改变原函数的基础上,给函数增加功能"
# 把一个函数当作参数,返回一个替代版的函数
# 本质上:返回函数的函数

 

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
你好
你好
嘿嘿,你也好啦~

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值