深入理解python函数递归和生成器
一、什么是递归
如果函数包含了对其自身的调用,该函数就是递归的。递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。例如,要计算1-9的9位数字的乘积,直观的算法是1*2*3*4*5*6*7*8*9,如果要计算1-10000的乘积,直观的算法就难于实现出,而递归就可以很简单的实现。请看示例:
deffact(n):#计算给定数字到一的乘积 ifn<=1: return1 else: returnn*fact(n-1) print(fact(7))
结果为:5040
下面我们用示例来看看递归的执行过程:
defcalc(n): print(n) ifn/2>1: res=calc(n/2) returnn calc(8)
结果为:
8 4.0 2.0
再看这一个示例:
defcalc(n): print(n) ifn/2>1: res=calc(n/2) print('res:',res) print("N:",n) returnn calc(8)
结果为:
8 4.0 2.0 N:2.0 res:2.0 N:4.0 res:4.0 N:8
二、生成器
生成器是一个带yield语句的函数。一个函数或者子程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果,返回一个值给调用者并暂停执行。当生成器的next()方法被调用的时候,它会准确地从离开地方继续
下面看示例:
deffunc(): print('11111111') yield[1] print(2222222222) yield2 print(3333333333) yield3 ret=func() r1=ret.__next__() print(r1) r2=ret.__next__() print(r2) r3=ret.__next__() print(r3)
结果为:
11111111 [1] 2222222222 2 3333333333 3
由于python的for循环有next()调用和对StopIteration的处理,使用一个for循环而不是手动迭代穿过一个生成器(或者那种事物的迭代器)总是要简洁漂亮得多。例:
deffunc(): print('11111111') yield[1] print(2222222222) yield2 print(3333333333) yield3 ret=func() foriinret: print(i)
结果同前面相同。
这些简单的例子应该让你有点明白生成器是如何工作的。除了next()来获得下个生成的值,用户可以将值回送给生成器[send()],在生成器中抛出异常,以及要求生成器退出[close()]
下面是一个展示了这些特性的,简单的例子。
defcounter(start_at=0): count=start_at whileTrue: val=(yieldcount)ifvalisnotNone: count=val else: count+=1
生成器带有一个初始化的值,对每次对生成器[next()]调用以1累加计数。用户已可以选择重置这个值,如果他们非常想要用新的值来调用send()不是调用next()。这个生成器是永远运行的,所以如果你想要终结它,调用close()方法。如果我们交互的运行这段代码,会得到如下输出:
>>>count=counter(5) >>>count.next() 5 >>>count.next() 6 >>>count.send(9) 9 >>>count.next() 10 >>>count.close() >>>count.next() Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> StopIteration
以上这篇深入理解python函数递归和生成器就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。