首页 > 编程语言 >python函数装饰器篇

python函数装饰器篇

时间:2022-08-23 15:22:26浏览次数:51  
标签:func3 return python 装饰 time print my 器篇 def

python装饰器专栏

1.了解装饰器

1. 函数装饰器,函数的简单功能的增强
2. 类装饰器,复杂功能的增强

2.闭包

1.简单讲就是在函数内在嵌套一个函数,就变成了闭包

// 闭包的结构
def outer():
    def inter():
        print("这是内部函数")
    return inter
    
// 闭包传参
def outer(x):
    def inter(y):
        print(x)
    return inter

outer(1)(6)

@语法糖

1. @标识符:在函数上面加上@另一个函数名,的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入

例子-原函数

def my_func1(x, y):
    print(x + y)
    time.sleep(1)
    return x + y


def my_func2(x, y):
    print(x * y)
    time.sleep(1)
    return x * y


def my_func3(x, y):
    print(x - y)
    time.sleep(1)
    return x - y
    
my_func3(500, 300)
my_func2(500, 300)
my_func1(500, 300)

需求: 统计每个函数的运行时间

第一种解法: #1 在每个函数体运行之前,以及运行之后+统计时间

'''第一种解法'''

def my_func1(x, y):
    # 1 解法1
    t1 = time.time()
    print(x + y)
    time.sleep(1)
    # 1 解法1
    t2 = time.time()
    print("执行时间==", t2 - t1)
    return x + y


def my_func2(x, y):
    # 1 解法1
    t1 = time.time()
    print(x * y)
    time.sleep(1)
    # 1 解法1
    t2 = time.time()
    print("执行时间==", t2 - t1)
    return x * y


def my_func3(x, y):
    # 1 解法1
    t1 = time.time()
    print(x - y)
    time.sleep(1)
    # 1 解法1
    t2 = time.time()
    print("执行时间==", t2 - t1)

    return x - y

my_func3(500, 300)
my_func2(500, 300)
my_func1(500, 300)

第二种解法: :函数装饰器

说明: 在使用装饰器前,需要了解知道
1. func 这个是指向的地址值
2. func() 加上括号才是真正实行函数

解法如下

'''
第二种解法:函数装饰器
优点: 
1. 可以不修改原函数(修改原函数容易出问题)
2. 使用装饰器增强函数功能,打个补丁过去 即装饰器
装饰器原理:
1. 语法糖执行fucs,将函数名字传入
2. 执行return wrapper
3. 执行内部函数wrapper(*args, **kwargs):
4. 然后执行传入过来的fucn()
'''


def fucs(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()
        # 执行传过来的函数
        res = func(*args, *kwargs)
        t2 = time.time()
        print(t2 - t1)
        return res
    # 返回
    return wrapper


@fucs
def my_func1(x, y):
    print(x + y)
    time.sleep(1)
    return x + y


@fucs
def my_func2(x, y):
    print(x * y)
    time.sleep(1)
    return x * y


@fucs
def my_func3(x, y):
    print(x - y)
    time.sleep(1)
    return x - y


my_func3(500, 300)
my_func2(500, 300)
my_func1(500, 300)

以上看似没有改变函数名字实际我来看下

# @fucs
def my_func3(x, y):
    print(x - y)
    time.sleep(1)
    return x - y

print(my_func3.__name__)
my_func3(500, 300)
print(my_func3.__name__)

'''
没有加装饰器时输出显示的原函数名字
'''
my_func3
200
my_func3

'''
加上装饰器显示的是装饰器内部名字
'''
@fucs
def my_func3(x, y):
    print(x - y)
    time.sleep(1)
    return x - y

print(my_func3.__name__)
my_func3(500, 300)
print(my_func3.__name__)
 
# 输出结果
wrapper
200
1.0079624652862549
wrapper

备注: 以上仍然是悄悄的改变了函数的名字,装饰器的原则是不改变任何原函数,故需要加上

解决方案:加上系统的不修改原函数名字的装饰器

from functools import wraps

def fucs(func):
	# 加上系统不修改原函数的装饰器
    @wraps(func)
    def wrapper(*args, **kwargs):
        t1 = time.time()
        # 执行传过来的函数
        res = func(*args, *kwargs)
        t2 = time.time()
        print(t2 - t1)
        return res
    # 返回
    return wrapper
    
  # 输出结果:(保留了原函数的名字)
my_func3
200
1.002612829208374
my_func3

标签:func3,return,python,装饰,time,print,my,器篇,def
From: https://www.cnblogs.com/jiyanjiao-702521/p/16616297.html

相关文章

  • ubuntu16.04安装python3.5
    今天用了下阿里云的云服务器,装个python3真是各种踩坑。记录下吧:ubuntu自带了2.7。想要装3.5并设置为默认python版本。安装python3.5  sudoadd-apt-repository......
  • ubuntu18.04如何安装python3.5及其pip安装
    安装python3.5,ubuntu18.04默认python3.6,该版本部分库没有资源无法安装,所以更换为python3.5参考原文链接:http://blog.itpub.net/69989353/viewspace-2738095/sudoapt-get......
  • Python小程序(三):自动读取secure文件,并封禁异常IP地址
    Python小程序(三):自动读取secure文件,并封禁异常IP地址Python小白编写的内容。欢迎大家指正。#!python#-*-coding:utf-8-*-#时间:20220812#作者:ColoFly#转载请注......
  • python基础——数据转换与运算符
    数据转换转换数据类型的作用input()接收用户输入的数据都是字符串类型,想得到整型该如何操作?转换数据类型即可,即将字符串类型转换成整型转换数据类型的函数函数说......
  • python yield的返回值
    初识yield表达式是在生成器学习中,只要函数中出现yield表达式,那么这个函数就是生成器函数。当函数执行到yield那一行时,yield就会返回后面的值,然后冻结当前函数状态,下行代码......
  • 基础之 - python数字转换为字符串
     问题:当需要将数字和字符串相加时,会报如下  解决:#1、数字转字符串a=12b='13'#1.1字符串格式化运算符#c='%d'%(a)+b#1.2使用str()函数#......
  • python综合训练二 图书管理系统
    宝安小学图书馆开馆了,准备开发一个图书管理系用json模拟数据库的方式完成下列业务:1、用户登录2、显示图书列表3、图书上架4、图书下架5、借书6、还书7.退出a.使用......
  • Ubuntu16.04安装python3.5并设置为默认版本
    综述:ubuntu16.04版本之后,系统会自带python2.7版本,如果需要下载新版本的python3.5,需要进行更新安装一、下载python3.5 首先在ubuntu的终端ternimal输入命令:sudoapt-get......
  • python函数及内置函数__init__自己的见解!!
    函数的定义方式(常见的三种)第一种,无参数defhanshu():  print("hanshu")hanshu()  #调用函数第二种,有参数,并把值传递给两个参数defhanshu(a,b):  print(......
  • c++和python混合编程,调用了CTP的附加库 (windows)(应该是全网第一篇)
    这是一个连接券商的代码,simnow提供的包,windows版,linux的话,下一篇文章介绍听起来就很复杂,所以需要大家有点功底,不懂的东西,多多百度,因为很多细节,我不可能还教怎么使用visual......