一、递归函数
1.1什么是递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
示例
1、求阶乘
>>> def get_factorial(n): # 定义阶乘函数
... if n == 1: # 退出递归的分支
... return 1
... return n * get_factorial(n-1) # 递归调用
... # 阶乘函数定义结束
>>> get_factorial(3) # 求3的阶乘
6
>>> get_factorial(10) # 求10的阶乘
3628800
• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题
• 递归式函数有2个条件
- 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
- 递归条件 可以将问题继续分解的条件
二、高阶函数
接收函数作为参数,或者将函数作为返回值返回的函数就是高阶函数
示例
def fun2(i):
if i % 2 == 0:
return True
def fun(fn): # fn是函数的参数(形参) 形参等于实参 fn = fun2 a
list1 = []
for i in range(101):
if fn(i): # fn(i) = fun2(i)
list1.append(i)
return list1
print(fun(fun2)) # 1
def fun3(a, b): # 这是位置传参 a = 1 , b = 2
pass
fun3(1, 2)
三、匿名函数
1.防止重名
2. 不用再去定义函数,使用方便
3. 可以作为一个传参的工具
lambda 函数就是匿名函数
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
语法: lambda 参数:表达式
print((lambda a, b: a + b)(1, 2)) # 同下
# def fun(a, b):
# print(a + b)
#
#
# fun(1, 2)
# print((lambda a : a % 2 == 0)(list1))
# # filter() 有两个参数,第一个参数(函数)是过滤规则,第二个是过滤的数据
# s = lambda a: a % 2 == 0
# print(list(filter(s, list1)))
四、闭包
将函数作为返回值也是高阶函数我们也称为闭包
闭包的好处
- 通过闭包可以创建一些只有当前函数能访问的变量
- 可以将一些私有数据藏到闭包中
行成闭包的条件
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须要使用到外部函数的变量
函数嵌套
# 将内部函数对象作为返回值返回
# 内部函数必须要使用到外部函数的变量或参数
# 保证被内部使用的外部变量不被销毁
# 定义一个外部函数
# def fun_out(num1):
#
# # 定义一个内部函数
# def fun_inner(num2):
# res = num1 + num2
# # print(res)
# return res
#
# return fun_inner
#
#
# # 函数的调用等于函数的返回值
# f = fun_out(1) # fun_out(1)() = fun_inner() = f()
# # 内部函数的调用 fun_inner()
# print(f(2))
# print(f(3))
# 修改外部函数的变量
def fun_out(num1):
# 定义一个内部函数
def fun_inner(num2):
# global num1
nonlocal num1 # 告诉解释器,这里使用的不是本地的num1, 是外部变量的num1
num1 = 10
res = num1 + num2
# print(res)
return res
print(num1)
fun_inner(1)
print(num1)
return fun_inner
# 函数的调用等于函数的返回值
f = fun_out(1) # fun_out(1)() = fun_inner() = f()
# 内部函数的调用 fun_inner()
# print(f(2))
# print(f(3))
# b = 1
#
# def fun(a): # a = b
# a = 0
# print(a)
#
#
# fun(b)
# print(b)
作业练习
- 猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def func(n):
if n==10:
return 1
return (func(n+1)+1)*2
print(func(1))
结果
1534