函数的对象属性:
(函数也是一种对象。函数本身也可以作为参数进行传递)
def callback(*args):
return sum(args)
def sum2(*args,c=callback):#回调函数
result = []
for x in args:
if type(x) == type(int) or type(x) ==tpye(1.2):
result.append(x)
return c(*result)
递归:
(函数内部逻辑中调用自身的形式的函数我们称之为递归函数,
递归问题绝大多数情况下都可以转换为迭代问题,递归主要用来解决知道结果的前一个状态)
在定义递归函数时,关于退出条件必须明确。
def fun_n(n):
if n == 1:
return 1
else:
print(n,n-1)
return fun_n(n-1)*n #阶乘
print(fun_n(10))
尾部递归优化版本
def fun_n2(n,m):
if n == 1:
return m
else:
return fun_n2(n-1,n*m)
print(fun_n2(10,1))
在python中递归有最大递归深度限制,不同环境最大限制不同.参考值为1000
def fun_n2(n,m):
if n == 1:
return m
else:
return fun_n2(n-1,n+m)
print(fun_n2(900,0))
猴子吃桃
#分析问题得到公式f(n) = (f(n-1)+1)*2 f(1) = 1
def monkey(n):
if n==1:
return 1
else:
return (monkey(n-1)+1)*2
print(monkey(10))
兔子问题:
递归公式f(n) = f(n-2)+f(n-1) 当月份小于2 都返回2
def fun3(n):
if n <= 2:
return 1
else:
return fun3(n-2)+fun3(n-1)
print(fun3(10))
闭包函数:函数内部的局部作用域的函数使用了其外部E作用域的变量,而函数的返回值为 函数内部函数本身
其目的为延长函数E作用域的生存周期.
def outer():
var = 123
def inner():
return var
return inner
装饰器:
在不破坏程序原始结构的情况下,给函数增加新的功能
第一个推导过程
import time #导入时间模块
def fun.opt(f):
'''
功能一
'''
start = time.time()
print('我是在函数执行之前必须执行的代码')
result = f()
'''
功能二
'''
pritn('我是在函数执行之后必须执行的代码')
end = time.time()
print('共计执行时间为%s'%(end-start))
return result
def f():
print('我是被装饰函数')
fun.opt(f)
装饰器语法糖
在函数之前 写上@符号后面紧跟一个函数名其意义为将@符号的下一行的函数本身作为参数传入@后面的函数中并执行,其结果赋值给下一行函数的名字
如下代码:
def warpper(fun):
print('我是在函数执行之前必须执行的代码')
result = fun()
print('执行之后的代码')
return result
@warpper
def f():
print('我是被装饰函数')
print (f)
#以上等价于 f =warpper(f)
装饰器形态基本形式
def warpper(fun):
def inner():
print('我是在函数执行之前必须执行的代码')
result = fun()
print('执行之后的代码')
return result
return result
@warpper #等价于f =warpper(f)
def f():
print('我是被装饰函数')
print (f)
#以上代码等价与 warpper(f)
@warpper
def f2():
c = 0
for x in range(10001):
c +=x
return c
print(f())
print(f2())
装饰器第一个固定形态 (示例:统计被装饰函数的执行时间)
def warpper(fun):
def inner(*args,**kwargs):#用可变参数(任意参数形式)接受被装饰函数的所需参数
'''
附加功能逻辑区
'''
start = time.time()
print('执行前代码')
#=====被装饰函数执行区
result = fun(*args,**kwargs) #被装饰函数所需参数传入、
#==============
'''
附加功能逻辑区
'''
print('我是执行后的代码')
end = time.time()
print('所需时间为%s'%(end-start))
return reselt #返回被执行函数的执行结果
return inner
@warpper
def f2(n):
c = 0
for x in range(n+1):
c +=x
return c
print(f2(100),'result')
print(f2(180000),'result')
装饰器固定形态二
def show_time(flag=True):
'''
@flag:标记是否打印时间
'''
def wapper(fun): #接收被装饰函数
def inner(*args,**kwargs):
'''
附加功能逻辑区
'''
start = time.time()
print('执行前代码')
#=====被装饰函数执行区
result = fun(*args,**kwargs)
#==============
'''
附加功能逻辑区
'''
print('我是执行后的代码')
end = time.time()
if flag:#根据传入的标记决定是否统计
print('所需时间为%s'%(end-start))
return reselt
return inner
return warpper
@show_time(True) #等价于 show_time(True)(f2)
def f2(n):
c = 0
for x in range(n+1):
c +=x
return c
@warpper#示例:掩饰多重装饰的顺序
@show_time(False)
def f3(n):
c = 0
for x in range(n+1):
c +=x
return c
#以上代码等价于 f(3)= warpper(show_time(False)(f3))
print(f2(100),'result')
print(f3(3000),'result')