2019建设摩托官方网站,江苏建筑信息平台,国外大气网站欣赏,广州市区自己动手写CPU的源代码#xff0c;一共15章#xff0c;可以完整实现MIPS的指令文件#xff1a;n459.com/file/25127180-476886294以下内容无关#xff1a;-------------------------------------------分割线---------------------------------------------目录一、往期回顾…自己动手写CPU的源代码一共15章可以完整实现MIPS的指令文件n459.com/file/25127180-476886294以下内容无关-------------------------------------------分割线---------------------------------------------目录一、往期回顾1.生成器代码详解2.生成器的三个方法二、递归函数1.什么是递归函数2.递归函数调用原理图3.递归边界4.通过递归函数实现的任意数的阶乘5.这个递归函数的递归临界点在哪6.斐波那契数列三、系列推荐一、往期回顾1.生成器代码详解def gen():for i in range(5):j yield iprint(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 throwdef gen():for i in range(5):j yield iprint(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 throwdef gen():for i in range(5):j yield iprint(j)# send:与生成器进行交互
g gen()print(next(g))
print(next(g))
# print(g.send(100))2.2send()在调用了一次next()之后调用获取生成器里面的内容# 生成器的三个方法 send close throwdef gen():for i in range(5):j yield iprint(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 iprint(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!)ValueErrorg.throw(ValueError,清菡大事不好报错了嘤嘤嘤~)二、递归函数1.什么是递归函数在函数中调用函数自身我们把这样的函数叫做递归函数。2.递归函数调用原理图3.递归边界递归边界退出递归的终止条件。def func():print(99999)func()func()在外面调用函数直接陷入一个死循环。在函数内部调用func()这个函数又到def func():这里来执行然后print(99999)又func()调用。不断得自身调用这样就造成了死循环。Pycharm 有个检测机制 当它内部检测到这个是个无限递归没有递归临界点的一个递归函数那么这个时候它递归多少次之后会自动给终止了。使用递归函数的时候一定要注意一个点就是一定要设置递归的边界。递归的边界就是递归函数的终止条件。如果你不设置递归边界那么你定义的递归函数就是个死循环一直无限得调用自身。4.通过递归函数实现的任意数的阶乘4.1 什么是阶乘1 的阶乘1递归能实现的通过循环都能实现。Python 中递归用得不多不太建议使用递归因为递归不太好用用递归还不如用循环。4.2 怎么去算阶乘呢定义个函数算任意数的阶乘。传 1就算 1 的阶乘传 10 就算 10 的阶乘。可以这样做首先要判断下它传进来的这个参数是不是等于 1如果是等于 1 的话就直接给它return返回出去。然后如果它不等于 1 的话就返回return n * (n-1)*(n-2)。n 传进来是 1那应该返回 1如果传的是 2应该返回return n * (n-1)。如果在这里用递归函数调用func(1)。那么这个时候这个func(1)调用递归函数。这个函数返回的是什么调用这段代码:if n 1:return 1返回的是个 1。将代码修改成如下def fun(n):if n 1:return 1else:return n * fun(n-1)fun(3)如果是fun(3),3 传进来:def fun(n):if n 1:return 1肯定是不成立的。else后面的代码return n * fun(n-1)。这里的 n 是个 3fun(n-1)就是fun(2)那么就是3 * fun(2)。这个时候会再次调用自身这个函数这个时候 n 是什么fun(2)的时候 n 是个 2就是3 *2* fun(1)。 fun(1)再执行下出来的结果是个 1。那这里就是个 1,就是3*2*1。等于 3 的时候返回的结果就是3*2*1。4.3 改成fun(4)看看首先 4 进来n 等于 4fun(n-1)就是fun(3)。调用fun(3)就相当于再次调用fun(n)就是4 *3* fun(2)。再次调用fun(2)再进来前面return n * fun(n-1)这一截得到 2fun(3-1)得到 2所以最终得到4*3*2* fun(1)。fun(1)调用结果出来就是个 1。就是4*3*2*1。def fun(n):if n 1:return 1else:return n * fun(n-1) # 4 *3*2*1fun(4)5.这个递归函数的递归临界点在哪if n 1:return 1当n1的时候就不会调用自身了。当满足某个条件不再调用自身那么这个就被称为递归临界点。例如改成n-1if n -1:return 1这个时候这个函数的递归临界点在哪这个递归临界点就是-1。def fun(n):if n -1:# 递归临界点当达到递归临界点的时候就不再调用自身函数的条件return 1else:return n * fun(n-1) # 4 *3*2*1fun(4)任何递归函数它的原理都是一样的。定义一个递归函数在递归函数里面它其实就是不断得调用自身然后设置递归函数的时候一定不能忘了递归条件。6.斐波那契数列后面的数都是等于前 2 个数相加的结果。斐波那契数列的第一个数值是 1第二个数值也是个 1第三个数等于前两个数相加的结果那就是 2第四个数等于于前两个数相加的结果那就是 3。[1,1,2,3,5]以此类推。