坚持原创输出,点击蓝字关注我吧
作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ⭐,你就可以第一时间接收到本公众号的推送!
目录一、往期回顾
1.生成器代码详解
2.生成器的三个方法
二、递归函数
1.什么是递归函数
2.递归函数调用原理图
3.递归边界
4.通过递归函数实现的任意数的阶乘
5.这个递归函数的递归临界点在哪?
6.斐波那契数列
三、系列推荐
一、往期回顾 1.生成器代码详解 def gen(): for i in range(5): j = yield i print(j) # send:与生成器进行交互 g = gen() print(next(g)) print(next(g))第一个print(next(g))打印的 0,就是生成器生成的元素。第二个print(next(g))打印的 1 也是生成器生成的元素,None 是print(j)打印的j。
通过生成器获取元素的时候,首先生成器进去的话,当调用生成器获取里面的值,它会从上往下走,走到j = yield i这里,把yield这里的i这个值返回出来,调用完gen()返回一个生成器g。
通过这个生成器next(g)去拿值的时候,然后它从上往下执行代码,走到j = yield i这里,yield相当于把i,通过yield返回出去。
从生成器里面返回出来,就生成一个数据。生成这个i,到第一个print(next(g))这里,打印的就是i。
第二个print(next(g)),再用next()调用生成器的时候,那么这个生成器会从yield之后继续往下执行。
通过next()去触发生成器的时候,yield之后是没有内容的,j接收的就是空的,所以打印j的时候,打印出来的是个None。
2.生成器的三个方法 # 生成器的三个方法: send close throw def gen(): for i in range(5): j = yield i print(j) # send:与生成器进行交互 g = gen() print(g.send(100)) print(next(g)) print(next(g))运行后报错:
生成器的send()方法,它运行的时候会从上一个yield结束的地方来进行运行。
在这里只创建了gen()这个生成器,这个生成器还没有生成过任何数据,这个时候生成器就暂停在函数最开始的地方def gen():这里。
这里send(100)这个值进去的话,在这里运行,直接运行for i in range(5):这个语句,send(100)生成进去的这个值没有地方接收,所以报错了。
send()必须在调用了一次next()之后才调用。可以和next()一样,去获取生成器里面的内容。
2.1next()获取生成器里面的内容: # 生成器的三个方法: send close throw def gen(): for i in range(5): j = yield i print(j) # send:与生成器进行交互 g = gen() print(next(g)) print(next(g)) # print(g.send(100)) 2.2send()在调用了一次next()之后调用,获取生成器里面的内容: # 生成器的三个方法: send close throw def gen(): for i in range(5): j = yield i print(j) # send:与生成器进行交互 g = gen() print(next(g)) print(g.send(100)) # print(next(g))yield只能在函数里面用。yield关键字是用在创建生成器的时候,只要函数里面使用了yield关键字,在调用函数的时候,函数不会立马被执行。
因为这个函数不是简单的函数了,它是个生成器。
在函数外面,是没办法用yield关键字的。
2.3close():关闭生成器 def gen(): for i in range(5): j = yield i print(j) yield 100 # send:与生成器进行交互 g = gen() print(next(g)) # print(next(g)) # print(g.send(100)) # close:关闭生成器 g.close() print(next(g)) 2.4throw()方法:在生成器内部主动引发一个异常。参数:1.异常类型。2.异常信息。这个方法可以接收 2 个参数,第一个参数:Exception 异常类型。第二个参数:传入异常的信息。
Exception 报错:
g.throw(Exception,"Method throw called!")
ValueError:
g.throw(ValueError,"清菡,大事不好,报错了,嘤嘤嘤~")
二、递归函数 1.什么是递归函数在函数中调用函数自身,我们把这样的函数叫做递归函数。
2.递归函数调用原理图 3.递归边界递归边界:退出递归的终止条件。
def func(): print('99999') func() func()在外面调用函数,直接陷入一个死循环。在函数内部调用func()这个函数,又到def func():这里来执行,然后print('99999'),又func()调用。
不断得自身调用,这样就造成了死循环。