递归函数生成器装饰器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归函数生成器装饰器相关的知识,希望对你有一定的参考价值。

递归函数、生成器、装饰器

递归:  在函数执行中调用自身

  • 必须有边界条件,递归前进段和递归返回段

  • 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 [email protected] foo():
    print(‘in foo()‘)
    foo()
in foo()
used: 0.0013369999999994775


本文出自 “左手右手” 博客,请务必保留此出处http://mofeihu.blog.51cto.com/1825994/1877144

以上是关于递归函数生成器装饰器的主要内容,如果未能解决你的问题,请参考以下文章

模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器

第四课 函数补充--装饰器迭代器生成器匿名函数递归函数

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

Python学习笔记(yield与装饰器)

第四天 内置函数2 随机码 装饰器 迭代器生成器 递归 冒泡算法 JSON

叠加多个装饰器yield表达式三元表达式生成式函数的递归