这节的主要内容是函数的几个用法闭包,调用、递归。
一.函数闭包
对闭包更好的理解请看:https://www.cnblogs.com/Lin-Yi/p/7305364.html
我们来看一个简单的例子:
1 #闭包 两个函数 嵌套 2 def Test1(): 3 a=1 4 print('局部外层:',a) 5 def test2(): 6 b=2 7 nonlocal a 8 a+=1 9 print('局部里层',a,b) 10 return test2 #返回函数体 11 12 a=Test1() 13 print(a)
根据上面例子我们可以这样定义闭包:
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的函数体,这样就构成了一个闭包。
闭包在装饰器的时候会用到。
二.调用
调用就是把定义过的函数的函数体当做参数来用。
1 def Test1(): 2 a=1 3 print('局部外层:',a) 4 def test2(): 5 b=2 6 nonlocal a 7 a+=1 8 print('局部里层',a,b) 9 return test2 #返回函数体 10 14 15 16 ##回调函数 两个函数 嵌套 17 def test3(a): 18 a() 19 20 test3(Test1) #Test1函数体
20行中Test1被test3调用,注意是函数体调用。
三.递归
递归就是函数自己调用自己。
递归需要注意的地方:
1.推倒式
2.终止条件
1 #例子1 2 # 阶乘 3 def JiChen(n): 4 if n==1: 5 return(1) 6 else: 7 return(n*JiChen(n-1)) 8 9 10 print(JiChen(8))
1 #例子2 2 ''' 3 猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。 4 以后每天都吃前一天剩下的一半零一个。 5 到第10天在想吃的时候就剩一个桃子了, 6 问第一天共摘下来多少个桃子? 7 8 ''' 9 # 递归:1.自己调用自己 10 # 2.写终止条件 11 # 3.推倒式 12 13 def TaoZi(n): 14 if n==1: 15 return 1 16 else: 17 return(2*(TaoZi(n-1)+1)) 18 19 ##P1=TaoZi(10) 20 ##print(P1)
补充一点:
可变的数据类型,可以直接在函数里面进行修改 list set dict
1 n=1 2 li=['a','b','c'] 3 li2=li.copy() #要保留原始数据,需要先复制一份.赋值id变了 4 di={'name':'方方'} 5 print(n,li,di) 6 def test(n,lis,dic): 7 n+=1 8 lis.append('haha') 9 dic['name']='frl' 10 print(n,lis,dic) 11 12 13 test(n,li,di)