Hello,大家好。本期来和大家一起系统学习一下函数、类的相关知识。
函数部分
相信小伙伴们对python函数的基础已经非常牢固了,我们就学习一下函数进阶部分。
递归函数
概念
函数的递归调用(函数嵌套调用)是的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用。
递归函数的特性
1.必须有一个明确的结束条件
2.每一次递归都必须离“结果”更近一步
递归函数执行过程
递推:一层一层往下推导答案,每一次推导必须离结果更近。
回溯:依据递推的结论往回推导最初要求的答案,前一次的输出作为了后一次的输入。
示例代码:
def main(n):
if n == 1:
return 1
else:
return n + normal_recursion(n-1)
main(5)
执行过程:
5 + main(4)
5 + 4 + main(3)
5 + 4 + 3 + main(2)
5 + 4 + 3 + 2 + main(1)
5 + 4 + 3 + 3
5 + 4 + 6
5 + 10
15
题目练习:
1.求100的前n项和,用for循环和递归函数实现?
sum_num = 0
for i in range(101):
sum_num += i
print(sum_num) # 结果5050
def total_num(n):
if n >0:
return n+total_num(n-1)
else:
return 0
print(total_num(100)) # 结果5050
2.求6的阶乘,for循环和递归函数实现?
for i in range(1,n):
if i ==1:
continue
else:
n = n*i
print(n) # 结果720
def get_num(n):
if n == 1:
return n
return get_num(n-1)*n
print(get_num(6)) # 结果720
3.打印出列表中每一个元素(列表除外),for循环和递归函数实现?
# for循环实现
l = [1,[2,[3]]]
for i in l:
if type(i) is int:
print(i)
else:
for j in i:
if type(j) is int:
print(j)
else:
for k in j:
if type(k) is int:
print(k)
#结果
1
2
3
# 递归函数实现
l = [1,[2,[3]]]
def get_num(n):
for i in n:
if type(i) is int:
print(i)
else:
# 获取剩下的列表
get_num(i)
get_num(l)
#结果
1
2
3
闭包函数
概念
当我们在外部函数中定义了一个内部函数,并且内部函数能够读取到外部函数内的变量,这种函数我们就称为闭包。简单来说,闭包就是能够读取外部函数内的变量的函数。
示例:
def outer(a):
b = 10
def inner():
print(a + b)
return inner
demo = outer(5)
demo() # 15
示例讲解:
# outer是外部函数 a和b都是外函数的临时变量
def outer(a):
b = 10
# inner是内函数
def inner():
# 在内函数中 用到了外函数的临时变量
print(a + b)
# 外函数的返回值是内函数的引用
return inner
'''
在这里我们调用外函数传入参数5,
此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo,
外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
'''
demo = outer(5)
# 我们调用内部函数,发现内部函数能使用外部函数的临时变量
# demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
demo() # 15
闭包中内函数修改外函数局部变量
在闭包内函数中,我们可以随意使用外函数绑定来的临时变量,但是如果我们想修改外函数临时变量数值的时候发现出问题了!
在基本的python语法当中,一个函数可以随意读取全局数据,但是要修改全局数据的时候有两种方法:
global 声明全局变量
全局变量是可变类型数据
在闭包内函数也是类似的情况。在内函数中想修改闭包变量(外函数绑定给内函数