递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
#递归 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 " 这个是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 " 这个是test" atest("walker1206")