python全栈闯关--11-装饰器初识

1、装饰器形成

当不想修改原函数,未函数前后添加功能时,就可以使用装饰器,在函数前后增加功能。

装饰器的初始形成

import time

def timer(f):
    def inner():
        print("我是装饰器,我来装饰了!!!")
        start = time.time()
        f()
        end = time.time()
        print(start - end)
    return inner  # 返回inner由于f实现了闭包,直接调用了程序

def func():
    time.sleep(1)
    print("我是小鱼,要作作作。。。有本事来装饰我!")

# 通过inner返回,在func前后进行了函数的功能的扩展
t = timer(func)
t()  # 虽然实现了功能,但是函数的调用名修改了

# 为了不改变调用名,可以赋值给func
func = timer(func)
func()  # 通过装饰器,实现了不修改函数名的装饰

语法糖

在函数前面加,加上@函数名,就可以实现装饰器,叫做语法糖

def timer(f):
    def inner():
        print("我是装饰器,我来装饰了!!!")
        start = time.time()
        f()
        end = time.time()
        print(start - end)
    return inner  # 返回inner由于f实现了闭包,直接调用了程序

@timer
def func():
    time.sleep(1)
    print("我是小鱼,要作作作。。。有本事来装饰我!")

2、带参数和返回值的装饰器

import time

def timer(f):
    def inner(a,b):  # inner接收传入的参数
        print("我是装饰器,我来装饰了!!!")
        start = time.time()
        ret = f(a,b)
        end = time.time()
        print(start - end)
        return  ("我是装饰器的返回值!!!",start - end)  # 在闭包内部,实现返回值
    return inner  # 返回inner由于f实现了闭包,直接调用了程序

@timer
def func(a,b):
    time.sleep(1)
    print("我是小鱼,要作作作。。。有本事来装饰我!")
    print("a=%s,b=%s" % (a,b))

ret = func(1,2)  # 参数相当于传递给inner
print(ret)

执行顺序

3、传递任意参数的装饰器

通过*args和**kwargs传递任意参数

def warpper(f):
    def inner(*args, **kwargs):
        ret = f(*args, **kwargs)
        return ret
    return inner

@warpper
def func(*args, **kwargs):  #*和**打散
    print("我是被装饰的函数!")
    print(args)
    print(kwargs)

func()  # 传空参数
func(1,2,3,4,b=1, a=2)  # 传任意参数
dic1 = {"a":1, "b":2}
func(*(1,2,3,4),**dic1)  # 打散传递

4、参数位置随感

个人观察结论:*是按顺序打散,形参位置:*args中,args打散后为1 2 3 4,所以args为(1,2,3,4)

def outer(*args):
    print(args)  # (1, 2, 3, 4)
    print(*args)  # 1 2 3 4  元祖被打散
    def inner(*args):
        print(‘innner‘, args)
    inner(*args)  # 打散传入inner(1,2,3,4)

outer = outer(1,2,3,4)

原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11704879.html

时间: 2024-11-05 20:49:31

python全栈闯关--11-装饰器初识的相关文章

python全栈闯关--12-装饰器进阶

带参数的装饰器 装饰器使用过程中,如果需要一个参数来判断装饰器是否启用时,就需要传入一个参数,来判断是否启用. 目前装饰器,传输函数名给外部函数做参数,内部函数参数用做调用函数的参数,无法实现参数的传递. 因此,需要在加一层嵌套,来实现参数的传入,装饰器最多三层!!! import time from functools import wraps FLAG = True def out_warpper(flag): def warpper(f): @wraps(f) def w_in(): if

16.python全栈之路:装饰器详解

装饰器 一.装饰器的意义 比如:以下函数是供我们调用的,但是我们需要在每个函数中都添加同一个功能,该如何做到呢? 方法一:在每个函数中都加上新加的功能代码块 def f1(): print("新功能") print("F1") def f2(): print("新功能") print("F2") def f3(): print("新功能") print("F3") def f4(): p

python全栈闯关--7-基础数据类型汇总、集合、深浅拷贝

1.str s = ' ' print(s.isspace()) # 如果字符串全是空格返回True 2.在循环一个列表时,最好不要删除列表中的元素 删除列表元素,得到的结果,往往不是预期的 例子1: lis = [11, 22, 33, 44, 55] # 循环开始后,按照索引递增,删除了前面的值,不会处理列表索引的位置 # 虽然没有报错,但是不是想要的结果 for i in lis: print("目前删除元素值为:%d " % i) print("值删除前:"

python全栈闯关--XX-细节总结汇总

1.The start value of slice is less than then end value,and the step is negative print("if the start value less then the end value and the step is negative ! " "No error will be reported and empty will be returned, ") for i in range(0,

python全栈闯关--5-字典

1.数据类型的划分 数据类型分为:可变数据类型,不可变数据类型 不可变数据类型:元祖.bool.int.str                    可哈希 可变数据类型:list,dic,set                                   不可哈希 2.dic的数据结构 dic key:必须为可哈希数据类型,不可以变数据类型 value:任意数据类型 dic 优点:二分查找,存储大量关系型数据 dic特点:3.6以前无序,3.6后有序 3.dic的增.删.改.查 定义

python全栈闯关--6-小知识点总结

1.python2和python3区别常用整理 # python2print 'abc'# 返回一个列表range()# 返回一个生成器值,不是list.每次只生成一个值,避免暂用很大的内存xrange() # 生成器# 输入raw_input(...) # python3print('abc')# 返回一个迭代值,需要生成列表就需要使用list(range(...))range()input(...) 2.复制 == 比较值是否相等 is 比较,比较的是内存地址 id(内容) >>>

python全栈闯关--10-2、函数的嵌套和作用域

1.全局作用域函数嵌套 def three_max(a, b, c): t = two_max(a, b) # 函数嵌套调用two_max return t if t > c else c def two_max(a, b): return a if a > b else b print(three_max(1, 2, 3)) 程序执行,按照从下往下的顺序,把变量.函数名加入到命名空间,如果还未加入到命名空间,就调用了函数,将会报错. 如上程序,如果把three_max的调用,交换到two_m

python全栈闯关--15-内置函数

1.作用域相关 print(locals()) print(globals()) # global 关键字,局部变量可以修改全局变量 # nonlocal 关键字,局部函数中,可以修改上一层函数中的变量 2.迭代器相关 next(迭代器) 等价与迭代器.__next__() 3.内置属相查看 dir 查看函数拥有的方法 4.帮忙 help 返回函数的帮助信息 5.程序调度相关 callable 判断函数是否可以执行,如果是函数返回true,是变量,放回false 6.文件操作相关 open 打开

Python全栈之路8--迭代器(iter)和生成器(yield)

一.生成器( iter ) 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文,如果需要,可立即继续执行. 1.对比 range 和 xrange 的区别 >>> print range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print xrange(10) xrange(10) 如上代码所示,range会在内存