目录:
一、递归函数
二、闭包的深入讲解
三、装饰器的使用
一、 递归函数
递归函数recursion
1.什么是递归函数
函数直接或间接的调用自己本身
可有解决循环上的问题
importtime
defstory():
time.sleep(2)
print('从前有座山')
print('山上座庙')
print("庙里有个老和尚在讲故事")
story()
story()
间接性的调用自己
deffa():
fb()
deffb():
fa()
fa()
递归说明
递归一定要控制递归的层数,当符合某一条件时要终止递归,几乎所有的递归都能用while循环来代替。
递归的优缺点:
优点:
递归可以把问题简单化,让思路更加清晰,代码更加简洁。
缺点:
递归因系统环境影响大,当递归过深,可能会得到不可预知的结果。
#求和1+2+3+......+98+99+100
#如果说100,它是不是就相关于1+99的结果
defmysum(x):
ifx<=1:
return1
returnx+mysum(x-1)
v =mysum(100)
print(v)
在函数内部,可以调用其他函数。如果一个函数在内部调用自己本身,这个函数就是递归函数,递归会形成一个深度循环!
2、 递归函数的使用
举个例子:
我们来计算阶乘 n! = 1 * 2 * 3 * ... * n
什么是阶乘呢?
4!= 4*3*2*1
5! =5*4*3*2*1
n! = 1 * 2 * 3 * ... * n
while解决方案:
n =int(input('请输入一个数:'))
result =1
i =1
whilei<=n:
result =result*i
i +=1
print(result)
紧接着我们看下阶乘的规律:
1! = 1
2! = 2 × 1 = 2 × 1!
3! = 3 × 2 × 1 = 3 × 2!
4! = 4 × 3 × 2 × 1 = 4 × 3! ...
n! = n × (n-1)!
defgetNum(num):
ifnum>1:
returnnum*getNum(num-1)
else:
returnnum
print(getNum(5))
3、递归函数经典案例(面试):
题目:斐波那契数列,该数列中有n个数字,1 1 2 3 5 8
分析:该数列中,从第三个数字开始:数值 = 前一个数字 + 前 前面一个数字
方法1:
deffeibo(n):
a,b =0,1
c =[]
whilen>0:
c.append(b)
a,b =b,a+b
n-=1
print(c)
feibo(12)
递归版:
deffeibo(n):
ifn==1 or n==2:
return1
elifn==2:
return1
return(feibo(n-1)+feibo(n-2))
n =int(input('请输入:'))
a =[feibo(i) fori inrange(1,n+1)]
print(a)
扩充面试题目:
如何获取计算机当中的最大的递归层数?
import sys
查看递归深度
sys.getrecursionlimit()
3000
设置递归深度
sys.setrecursionlimit(500)
sys.getrecursionlimit()
500
二、闭包 closure
闭包定义:
将内嵌函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包(closure)
闭包满足的三个条件:
1.必须有内嵌函数;
2.内嵌函数必须引用外部函数中的变量
3.外部函数返回值必须是内嵌函数
通过这三点,就可以创建一个闭包,提别注意:Python装饰器就是使用了闭包。
defmake_power(y):
deffx(arg):
returnarg**y
returnfx
闭包的好处:
使代码变得简洁;提高代码的拓展性;
defmake_power(y):
deffx(arg):
returnarg**y
returnfx
pow2 =make_power(2)
print('3的平方 是',pow2(3))
defwrapperfun(strname):
defrecoder(age):
print('姓名',strname,'年龄',age)
returnrecoder
#将strname设置为If
fun =wrapperfun('if')
#将age赋值 ,输出
fun(28)
装饰器 decorators(专业提高篇)
装饰器的定义
装饰器是程序开发中经常会用到的一个功能,用来在原有的函数上增添新的代码需求。
‘开发封装’
语法 :
def装饰器函数名(参数):
语句块
return函数对象
被装饰函数的语法:
@装饰器的函数名
def函数名(形参列表):
语句块
#定义一个装饰器
defmydeo(fn):
deffx():
print('......................')
fn()
print('***********************')
returnfx
@mydeo
defmyfunc():
print('myfunc被调用')
myfunc()
应用场景:
1、当我们已经写好一个函数时,项目也已经上线了,突然客户想要增添一个需求,让这个函数处理的更加细致,这个就可以用到装饰器了;
案例:
#装饰器快速入门假如现在我们定义了两个函数,分别来打印他们的名字。
defouter(func):
definner():
func()
print('come from hebei')
returninner
@outer
deffunc1():
print('this is python1)
@outer
deffunc2():
print('this is python2')
func1()
func2()