装饰器

递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

 

#递归
def calc(n):
    if n>1:
        print(n)
        return calc(n/2)
calc(10)

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 

匿名函数

匿名函数就是不需要显式的指定函数

#匿名函数
m=lambda x:x**4
print(m(3))

 

 

装饰器本质是函数,为其它函数添加附加功能

原则

1 不能修改被修饰函数的源代码

2 不能修改被装饰函数的的调用方式

装饰器储备

1 函数即“变量”

2 高阶函数

3 嵌套函数

高阶函数 +嵌套函数===》装饰器

变量或者函数只要解释到内存就可以被调用

 

高阶函数:就是把函数当成参数传递的一种函数;

把一个函数名,以实参的形式,传给这个函数的形参,这个函数就称为高阶函数
1、把一个函数名当做一个实参,传给另外一个函数
2、返回值中包含函数名(不修改函数的调用方式)
def add(a,b,c):
    print(a+b+c(-10))
    return (a,b,c(-10))
print(add(2,2,abs))

 

嵌套函数

在一个函数体内,用def重新定义新的函数,才叫嵌套函数


被装饰器有参数
def timer(func):   #被装饰函数有参数
    def deco(name):
        start_time=time.time()
        func(name)
        stop_time=time.time()
        all_time=stop_time-start_time
        print all_time
    return deco
@timer
def atest(name):
    print name
    time.sleep(2)
    print "\n这个是test"
atest("walkerone")

 

装饰器和被装饰器都有参数

def timers(size):
    print size
    def timer(func):   #被装饰函数有参数
        def deco(name):
            start_time=time.time()
            func(name)
            stop_time=time.time()
            all_time=stop_time-start_time
            print all_time
        return deco
    return timer
@timers(100)
def atest(name):
    print name
    time.sleep(2)
    print "\n这个是test"
atest("walker1206")

 

posted @ 2018-12-02 22:27  binghex  阅读(158)  评论(0编辑  收藏  举报