测开之函数进阶· 第1篇《递归函数》

坚持原创输出,点击蓝字关注我吧

 测开之函数进阶· 第1篇《递归函数》

作者:清菡
博客: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))

 测开之函数进阶· 第1篇《递归函数》

第一个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))

运行后报错:

 测开之函数进阶· 第1篇《递归函数》

生成器的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))

 测开之函数进阶· 第1篇《递归函数》

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))

 测开之函数进阶· 第1篇《递归函数》

yield只能在函数里面用。yield关键字是用在创建生成器的时候,只要函数里面使用了yield关键字,在调用函数的时候,函数不会立马被执行。

因为这个函数不是简单的函数了,它是个生成器。

在函数外面,是没办法用yield关键字的。

 测开之函数进阶· 第1篇《递归函数》

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))

 测开之函数进阶· 第1篇《递归函数》

2.4throw()方法:在生成器内部主动引发一个异常。参数:1.异常类型。2.异常信息。

这个方法可以接收 2 个参数,第一个参数:Exception 异常类型。第二个参数:传入异常的信息。

Exception 报错:

g.throw(Exception,"Method throw called!")

 测开之函数进阶· 第1篇《递归函数》

ValueError:

g.throw(ValueError,"清菡,大事不好,报错了,嘤嘤嘤~")

 测开之函数进阶· 第1篇《递归函数》

二、递归函数 1.什么是递归函数

在函数中调用函数自身,我们把这样的函数叫做递归函数。

2.递归函数调用原理图

递归函数调用自身的图,图片来自网络

3.递归边界

递归边界:退出递归的终止条件。

def func(): print('99999') func() func()

 测开之函数进阶· 第1篇《递归函数》

在外面调用函数,直接陷入一个死循环。在函数内部调用func()这个函数,又到def func():这里来执行,然后print('99999'),又func()调用。

不断得自身调用,这样就造成了死循环。

 测开之函数进阶· 第1篇《递归函数》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfjg.html