就像坐在最后一排想要第一排妹子的电话 一个一个拍过去问 直到拍到第一排要到电话 最后一层层返回
def di(n): print(n) if n 0: di(n-1) print(n) di(3) di(3) 3 di(3-1) 2 di(2-1) 1 di(1-1) 0 di(0) 0 di(1) 1 di(2) 2 di(3) 3练习题-斐波那契数列
def feibo(x): if x 1 or x 2: return 1 else: print(x-1,x-2) s feibo(x - 1) feibo(x - 2) return s print(feibo(1)) print(feibo(6))练习题-阶乘
def jie(n): if n 1: return 1 else: return n*jie(n-1) s jie(9) print(s)递归函数效率并不高 能不用就不用一个函数调用后若没有结束 在栈空间就一直存在 直到函数运算结束才销毁 10.5 高阶函数
1.回调函数 闭包函数 匿名函数 迭代器
10.5.1 回调函数
函数调用的参数为函数
//如果将函数指针作为参数被传递到函数中 当这个函数指针被用于调用其指向的函数时 我们就称这个函数为回调函数
回调函数的主要优势是解耦 即调用者和被调用者被分开 调用者无需了解谁是被调用者 它只需知道如果满足某条件之后 函数将被调用
def func(x, y, f): 当前函数接受两个数值 并把这两个数值传递给第三个参数进行运算 x,y, int ; f, function :param x: :param y: :param f: :return: #print(f([x,y])) print(f(x, y)) func(1,2,sum) #sum计算一个容器 func(2,2,pow) 幂函数
10.5.2 闭包函数
函数内返回一个内函数 且内函数中使用了外函数的局部变量
特点
def person(): money 0 def work(): nonlocal money money 100 print(money) #在外函数中返回内函数 闭包 return work res person() res() # work() res() res()work()中是print不是return 此时不能在全局中对money进行任何此操作
如何检测是否为闭包函数
函数名.__closure__如果是闭包函数返回cell
print(res.closure)
10.5.3 匿名函数 lambda表达式
可以不使用def定义 且函数没有名字
注意 lambda表达式仅仅是一个一行代码 不是代码块 又称为一行代码的函数
不能访问除了自己形参外的数据包含全局变量
#lambda 参数列表 返回值 def add(x, y): return x y print(add(3,4)) res lambda a,b:a b print(res(4,4)) # lambda是一个表达式 不能写太复杂的逻辑 功能相对单一 # 可以使用分支结构 def func(sex): if sex male : return handsome else: return beauty res func( male ) print(res) # lambda 参数列表 真区间 if 表达式判断 else 假区间 ret lambda sex: nicce if sex male else good print(ret( man ))
10.5.4 迭代器
python中最具特色的功能之一 是访问集合元素的一种方式
迭代器是一个可以记住访问遍历的位置的对象
从集合第一个元素开始到左右元素被访问完毕
只能从前往后一个一个的遍历 不能后退
能被next()函数调用 并不断放回下一个值的对象称为iterator
迭代器
range(10,3,-1) #返回一个可迭代对象 for i in range(10,2,-1): print(i) arr [99,8, yy ,1] for i in arr: print(i)
iter()
功能 把可迭代的对象 转为一个迭代器对象
参数 可迭代的对象 str list tuple dict set range...
返回值 迭代器对象
注意 迭代器一定是一个可迭代的对象 但是可迭代对象不一定是迭代器
f4 [ one , two , three , four ] # 可以使用for循环来遍历数据、 # 可以把可迭代对象转为迭代器使用 res iter(f4) print(res,type(res))
迭代器的取值方案
next 调用一次获取一次 直到数据被取完list 直接取出所有的数据for 使用for循环遍历迭代器的数据# 1. 使用next 函数去调用迭代器对象 r next(res) print(r) print(list(res)) #2.list r next(res) #超出可迭代的范围 StopIteration print(r) # print(next(res)) # print(next(res)) # print(next(res)) #超出可迭代的范围 StopIteration # 3. for 循环 for i in res: print(i) # print(next(res)) #超出可迭代的范围 StopIteration
迭代器取值特点
取出一个少一个 直到取完检测迭代器和可迭代对象的方法
from collections.abc import Iterator,Iterablefrom collections.abc import Iterator,Iterable varstr 12345 res iter(varstr) # type()函数返回当前数据的类型 # isinstance()检测一个数据是不是一个指定的类型 r1 isinstance(varstr, Iterable) r2 isinstance(varstr, Iterator) r3 isinstance(res, Iterable) r4 isinstance(res, Iterator) print(r1,r2,r3,r4) #迭代器一定是一个可迭代对象 可迭代对象不一定是一个迭代器
2.next()函数检测
next(varstr) #TypeError: str object is not an iterator



