python 函数与装饰器

 

Python装饰器深度解析

函数

形参实参

  • 定义函数时创建形参
def add(a: int, b: int, c: int, d: int)-> int:
    return a + b + c + d
  • 调用函数时使用实参
add(1, 2, 3, 4)

变长参数

*args

将参数打包成 tuple 调用

def fun(*args: tuple)->None:
    print(args)
    print(type(args))

fun(1)
fun(1, 'A')

**kwargs

将参数打包成 dict 给函数调用, 参数位置必须是*args, **kwargs顺序, 否则程序报错

def fun(**kwargs: dict)->None:
    print(kwargs)
    print(type(kwargs))

fun(name = 'WANG')
fun(num = '20209902', name = 'TI', age = 18)

参数解包

*实参

在序列类型参数前添加*, 会将序列中元素依次作为参数传递

def func(a, b):
    print(a, b)

p1 = (1, 2)
p2 = [4, 5]

func(*p1)
func(*p2)

**实参

对一个字典进行解包操作, 键对应函数形参, 值对应实参

def func(a, b):
    print(a, b)

p = {'a': 11, 'b': 22}

func(**p)

装饰器

概念

装饰器函数可在不影响原有函数结构上, 给函数添加额外功能

def timer(func):
    def wrapper(*args, **kwargs):
        ...
        func(*args, **kwargs)
        ...
    # 返回内层函数引用
    return wrapper

@timer
def add(a, b):
    print(a + b)

高阶函数

接受函数为入参, 或者把函数作为结果返回的函数. 后者称之为嵌套函数

闭包

指延伸作用域函数, 其中包含函数定义体中引用、但是不在定义体中定义的非全局变量. 简单来说就是嵌套函数引用外层函数变量

@

python语法糖, 作用类似

# 返回timer.<locals>.wrapper函数引用
add = timer(add)
add(1, 2)
  • 显示每个函数运行时间
import time

def runtime(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time - start_time)
    return wrapper

@runtime
def func():
    num = 0
    for i in range(1234356):
        num += i
    print(num)

func()

  • 显示当前运行函数函数名
def defname(func):
    def wrapper(*args, **kwargs):
        print("def name is :%s" % func.__name__)
        return func(*args, **kwargs)
    return wrapper

@defname
def func_a():
    print("aaaaaaa")

@defname
def func_b():
    print("bbbbbbb")

func_a()
func_b()