9、Python学习笔记--函数递归、装饰器

函数的对象属性:

(函数也是一种对象。函数本身也可以作为参数进行传递)

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')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值