必须有边界条件,递归前进段和递归返回段
python中递归有层次限制
递归函数实现阶乘
def fact(n): if n <= 1: return 1 else: return n * fact(n-1)
调用:fact(3)=3fact(2)=32fact(1)=32*1
fact(3)
6
实现斐波拉契数列
def fib1(n): if n <= 1: return 1 else: return(fib1(n-1)+fib1(n-2))
for i in range(10): print(fib1(i))
1 1 2 3 5 8 13 21 34 55
普通函数遇到return返回函数结束,再次执行又从第一条语句开始
生成器遇到yield返回函数被挂起,再次执行则从上一次返回yield语句的地方继续执行
定义一个生成器函数
def gen(): print(‘step 1‘) yield 1 print(‘step 2‘) yield 2 print(‘step 3‘) yield 3
a=gen()next(a)
step 1
1
next(a)
step 2
2
典型应用:插入日志、测试性能、事物处理
给foo函数计算运行时间
import time def foo(): print(‘in foo()‘) # 定义一个计时器,传入一个函数,并返回另一个附加了计时功能的方法def timeit(func): # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装 def wrapper(): start = time.clock() func() end =time.clock() print(‘used:‘, end - start) # 将包装后的函数返回 return wrapper foo = timeit(foo)foo()
in foo() used: 0.0018359999999972842
python装饰器提供的语法糖效果,下面的@timeit跟上面的foo = timeit(foo)是完全等价的
import timedef timeit(func): # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装 def wrapper(): start = time.clock() func() end =time.clock() print(‘used:‘, end - start) # 将包装后的函数返回 return wrapper@timeitdef foo(): print(‘in foo()‘) foo()
in foo() used: 0.0013369999999994775
本文出自 “左手右手” 博客,请务必保留此出处http://mofeihu.blog.51cto.com/1825994/1877144
原文地址:http://mofeihu.blog.51cto.com/1825994/1877144