一、函数递归
- 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
- 递归式函数有2个条件
- 1. 递归条件 可以将问题继续分解的条件
- 2.基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
#范例:求n的阶乘
def fun(n):
if n==1:
return 1
else:
return n*fun(n-1)
print(fun(3))
二、匿名函数
- 匿名函数:没有名字,使用lambda关键字去创建函数
- 语法:lambda 参数1[,参数2,参数3]:表达式
- 特点:匿名函数冒号后面的表达式有且只有一个、匿名函数自带return,而这个return的结果就是表达式计算后的结果
- 缺点:lambda只能是单个表达式,不是一个代码块,仅仅能封装有限的逻辑
- 匿名函数作用:
防止重名
不用再去定义函数,使用方便
可以作为传参的工具
范例:
s=lambda x,y:x+y
print(s(10,20))
#30
print((lambda x,y:x+y)(10,20))
#30
'''
filter ()有两个参数,第一个参数或函数是过滤规则,第二个是过滤的数据
返回的是一个容器,直接打印打不出来
'''
list1=[1,2,56,89,44]
s= lambda a: a %2==0
print(list(filter(s,list1)))
#[2, 56, 44]
注:lambda函数自带return
三、高阶函数
- 接收函数作为参数,或者将函数作为返回值返回的函数就是高阶函数
#第一种高阶函数范例:
#把ff函数对象传给f ,即f==ff
def fun(f):
for i in range(10):
if f(i):
print(i)
def ff(num):
if num%2==0:
return True
fun(ff)
0
2
4
6
8
四、闭包
(保证外部函数的参数或变量中被内部函数引用的不销毁)
- 将内部函数作为返回值也是高阶函数,我们也称为闭包
- 好处:
- 通过闭包可以创建一些只有当前函数能访问的变量
- 可以将一些私有数据藏到闭包中 - 形成闭包的条件:
函数嵌套
内部函数必须要使用到外部函数的变量
将内部函数作为返回值返回
注:nonlocal num1 告诉解释器,这里使用的不是本地的num1,是外部变量的num1
详见Vamei的博客
附:第十讲作业
猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def fun(day):
if day==1:
return 1
return 2*(fun(day-1)+1)
print(fun(10))
结果
1534