函数(三)
递归函数
• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题(递归简单理解就是自己调用自己)
• 递归式函数有2个条件:
- 基线条件 - 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
- 递归条件 - 可以将问题继续分解的条件
# 求任意数的阶乘
def fun(x):
if x == 1: # 基线条件
return 1
return fun(x-1)*x # 递归条件
print(fun(5)) # 得 120
高阶函数
- 接收函数作为参数,或者将别的函数对象作为返回值返回的函数就是高阶函数
def fun0(x,y,fun): # 函数作为参数
return fun(x)*fun(y) # 函数作为返回值
print(fun0(-9,-10,abs))
匿名函数
- 定义一个匿名函数并调用,定义格式如–>lambda arg1,arg2…:表达式
- 防止重名,不用再去定义函数,使用方便,可以作为一个传参的工具
- lambda函数就是匿名函数
list = [1,2,3,4,5,6,7,8]
# 语法: lambda 参数 :表达式
print(lambda a,b: a+b)(1,2) # 前面形参,后面实参
s = lambda a : a % 2 == 0
# filter() 有两个参数,第一个参数(函数)是过滤规则,第二个是过滤的数据
print(list(filter(s,list1)))
闭包
-
闭包的定义?闭包本质上就是一个函数
如何创建闭包?- 函数要嵌套(有内外部函数)
- 内部函数使用外部函数的变量
- 外部函数返回内部函数的名称
-
如何使用闭包?典型的使用场景是装饰器的使用。
global与nonlocal的区别:- global可以改变全局变量,同时可以定义新的全局变量;
- nonlocal只能改变外层函数变量,不能定义新的外层函数变量,并且nonlocal也不能改变全局变量。
- global关键字可以用在任何地方,包括最上层函数中和嵌套函数中;
- nonlocal关键字只能用于嵌套函数中,并且外层函数中必须定义了相应的局部变量,否则会发生错误。
-
闭包的好处
• 通过闭包可以创建一些只有当前函数能访问的变量
• 可以将一些私有数据藏到闭包中
• 行成闭包的条件 -
特性:可以保证外部函数变量不被销毁
def outFun(arg1):
def inFun(arg2):
nonlocal arg1#nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
arg1+=200
return arg1*arg2
return inFun
infun=outFun(100) #调用外部函数,传入参数,返回是内部函数
result=infun(300) #调用内部函数,传入参数
print("the result is:",result)
#使用闭包求给function计算耗时(上面的内容已经提到)代码如下:
import time
def waste_time(func): #用于计算函数执行的耗时
def function(*args,**kwargs):
start_time=time.time()
result=func(*args,**kwargs)
end_time=time.time()
spend=end_time-start_time
print("函数%s 总共耗时%.3f秒:"%(func.__name__,spend))
return result
return function
作业
- 猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def fun(x):
if x == 10 :
return 1
return 2*(fun(x + 1) + 1)
print(fun(1)) # 得 1534 第一天共摘了1534个桃子
声明:本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。
仅是个人意见,如有不足之处或者侵权,请留言