目录
一、递归函数
递归:如果一个函数内部调用了自己那么就叫递归。
def f(): print("你好,我叫aa") f() f()
1.如果要定义递归函数,必须要有出口,因为无限递归会导致内存溢出
2.设计一个出口,不断的向出口接近
def f(x): print("你好,我叫aa") if x == 10: return # 结束函数 f(x + 1) f(1)
案例:求987654321 的结果,就是9的阶乘
n! = n * (n-1)! 9的阶乘 = 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 9的阶乘 = 9 * 8! 8的阶乘 = 8 * 7! 7的阶乘 = 7 * 6! 6的阶乘 = 6 * 5! 5的阶乘 = 5 * 4! 4的阶乘 = 4 * 3! 3的阶乘 = 3 * 2! 2的阶乘 = 2 * 1! f(x) = x * f(x-1) # 阶乘公式 def f(x): if x == 1: return 1 return x * f(x - 1) print(f(5)) f(5) = 5 * f(4) 5 * 4 * f(3) 5 * 4 * 3 * f(2) 5 * 4 * 3 * 2 * f(1) # f(1) = 1
二、生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next () 方法时从当前位置继续运行。
生成器:相当于存储一种厨师
# s = [x for x in range(10000000)] f = (x for x in range(10)) print(next(f)) # 输出f的第1个值 print(next(f)) # 输出f的第2个值 print(next(f)) # 输出f的第3个值 ....
一次性做出所有菜
for i in f: print(i) def f(): print("f1") yield 1 # 挂起 print("f2") yield 2 # 挂起 def g(): print("g1") yield 1 print("g2") yield 2
可以使用生成器 多个任务 交叉执行
g1 = f() g2 = g() next(g1) next(g2) next(g1) next(g2) # f1 g1 f2 g2
生成器的两种创建方式
1.(i for i in range(1,10))
2.yiled 关键字实现
def f(): print("f1") yield 1 # 挂起 print("f2") yield 2 # 挂起 print("f3") yield 3 g = f()
迭代遍历的本质:
不断通过 i = next(g)
for i in g: print(i)
for i in 可迭代对象
从现象来说,只要是可以for循环的都是可迭代对象
从本质来说,是内置有iter方法的是可迭代对象
能for循环是因为有一个__iter__()
方法
可迭代对象:对象拥有iter方法的
三、迭代器
在Python中,迭代器是遵循迭代协议的对象。 使用iter ()从任何序列对象中得到迭代器(如
list, tuple, dictionary, set
等)。
生成器就是迭代器
迭代器需要满足两个条件:
1.有iter方法
2.有next方法
l = [1,2,3,4] l.__iter__() iter(l) # 本质上就是 l.__iter__() iter : 返回一个迭代器对象
for循环内部本质3个事情
1.调用可迭代对象的iter方法返回一个迭代器
2.不断调用迭代器的next方法
3.处理异常