第八篇、递归、装饰器

一、递归函数

概念:递归算法是一种直接或者间接的调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的。

特点:

①递归就是在过程或者函数里调用自身。

②在使用递归策略时,必须有一个明确的递归条件,称为递归出口。

③递归算法解题通常显得很简洁,但递归算法解题的效率较低。所以一般不倡导使用递归算法设计程序。

④在递归调用的过程当中系统的每一层的返回点、局部变量等开辟了栈来存储。递归函数次数过多容易造成栈溢出等。

所以一般不倡导用递归算法设计程序。

递归的思想代码如下:
‘‘‘
"""
def f4(a1,a2):
    if a1>10000:
        return
    a3 = a1 + a2
    f4(a2,a3)
f4(0,1)

‘‘‘
斐波那契数列:每个数都是前两个数相加的和
要求找出第十次的数是多少
‘‘‘
def f5(depth,a1,a2):
    ‘‘‘
    每次循环都进行判断次数是否为10,如果不满足,则继续循环,直到满足条件
    :param depth: 次数
    :param a1: 第一个数
    :param a2: 第二个数
    :return:  下面是打印出两个内容1、打印出斐波那契数列、2、打印出第十次的数
    ‘‘‘
    if depth == 10:
        return a1
    a3 = a1 + a2
    print a3
    r = f5(depth +1,a2,a3)
    return r
r = f5(1,0,1)
print (r)

斐波那契数列

图解递归流程

二、装饰器

1、

 1 def outer(func):    #这里的参数是要装饰的值
 2     ‘‘‘
 3     装饰器两大知识点:@outer的作用如下:
 4     1、执行outer函数,并且将其下面的函数名,当作参数传递
 5     2、将outer函数的返回值重新赋值给f1函数 f1 = outer的返回值
 6     函数名的内存地址是print,函数方法的结果是返回值return
 7     :param func:
 8     :return:
 9     ‘‘‘
10     def inner():
11         print ("hello")
12         print ("hello")
13         print ("hello")
14         r = func()  #这里r=None也就是func()的返回值
15         print ("end")
16         print ("end")
17         return r
18     return inner
19 @outer
20 def f1():
21     ‘‘‘
22     因为装饰器原因,下面的f1()=outer(f1)
23     :return:
24     ‘‘‘
25     print ("f1")
26     return "000"
27 f1()
28 f2 = outer(f1)
29 result = f2()
30 print result

2、装饰器作用:

让一个函数附带自己功能的时候在不改变原函数的基础之上增加新的功能

如上,就是让f1增加hello和end的两个功能的同时,再保持自己的新功能

流程如下:

 1 下面的流程:首先执行@outher 之后把index作为参数传入到outher函数里面,执行inner方法,   之后打印123,然后执行func方法,打印非常复杂,最后打印456
 2 ‘‘‘
 3 def outer(func):
 4     def inner():
 5         print ("123")
 6         ret = func()
 7         print ("456")
 8         return ret
 9     return inner
10 @outer
11 def index():
12     print ("非常复杂")
13     return True
14 index()

总结:

只要函数应用上装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数

 1 def outer(func):
 2     ‘‘‘
 3     装饰器装饰含n个参数的函数
 4 并且多个装饰器装饰同一个函数:
 5     相当于
 6     @outer_0
 7     def inner(*args,**kwargs):
 8     ...
 9     也就相当于执行inner1函数,所以会先执行print(3.5)
10     :param func:
11     :return:
12     ‘‘‘
13     def inner(*args,**kwargs):
14         print ("123")
15         ret = func(*args,**kwargs)
16         print ("456")
17         return ret  #这个是用来结束的
18     return inner
19 def outer_0(func):
20     def inner1(*args,**kwargs):
21         print ("3.5")
22         ret = func(*args,**kwargs)
23         return ret
24     return inner1
25 @outer_0
26 @outer
27 def index(a1,a2):
28     print ("非常复杂")
29     return a1 + a2
30 index(1,2)
31 @outer
32 def f1(a):
33     print "a"
34 f1(1)

装饰器的作用是改写原来的函数,那么多个装饰器就是改写多个函数的

时间: 2024-12-18 11:28:43

第八篇、递归、装饰器的相关文章

ZMAN的学习笔记之Python篇:装饰器

年前工作事务比较繁琐,我只能用零碎的时间继续学习Python,决定开一个系列的博文,作为自己深入学习Python的记录吧.名字也取好了,就叫<ZMAN的学习笔记之Python篇>~开篇是关于装饰器的,春节假期码的字哈哈~就让我们开始吧! 本文的例子都是自己想的,如果不是很合适,请大家提出宝贵意见哈~谢谢啦! 一.为什么要用“装饰器” 比如我们写了如下一段代码: # 打印0~99 def func(): for i in range(100): print(i) 我们想要监测执行这个函数花费了多

递归&amp;装饰器&amp;正则运算&amp;模块

递归: def f(a): if a < 10: print(a) a+=1 b = a f(b) return a else: return a a = f(5) a等于6 a等于6 只执行一次 注意 怎么正确取值 ? def f(a): if a < 10: print(a) a+=1 b = f(a) f(b) return b else: return a 返回值是一个函数就可以啦 装饰器 : def outer(func): def inner(*arg, **kwargs): pr

第十五篇:装饰器

要想理解装饰器,先理解几个内容:作用域.函数即"对象".嵌套函数和闭包 作用域 全局变量 1.在一个模块中最高级别的变量有全局作用域 2.全局变量的一个特征是除非被删除掉,否则它们的存活到脚本运行结束,且对于所有的函数,他们的值都是可以被访问的 例子1: # 定义全局变量 a = 100 def test1(): print(a) def test2(): print(a) # 调用函数 test1() test2() 执行结果: 100 100 局部变量 1.定义在函数内的变量有局部

Python全栈开发记录_第五篇(装饰器)

单独记录装饰器这个知识点是因为这个知识点是非常重要的,必须掌握的. 了解装饰器之前要知道三个知识点 作用域,上一篇讲到过顺序是L->E->G->B 高阶函数: 满足下列其中一种即可称之为高阶函数: a.把一个函数名当做实参传递给另一个函数 b.返回值中包含函数名 3.闭包 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境),通俗讲法是:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用.这样就构成了一个闭包.,具体看下面

第十篇:装饰器

三.装饰器 1.装饰器是在函数调用之上的修饰 2.这些修饰仅是当声明一个函数或者方法的时候,才会应用的额外调用 3.使用装饰器的情形有: 3.1引入日志 3.2 增加计时逻辑来检测性能 3.3 给函数加入事务的能力 装饰器基础: 1.装饰是为函数和类指定管理代码的一种方式. 2.装饰器本身的形式是处理其他的可调用对象的可调用的对象( 如函数) Python装饰器以两种相关的形式呈现 1.函数装饰器在函数定义的时候进行名称重绑定, 提供一个逻辑层来管理函数和方法或随后对它们的调用. 2.类装饰器在

设计模式篇——初探装饰器模式

文章目录 1.装饰器模式介绍 2.装饰器模式类图 3.装饰器模式Demo实现(一个小镇的拉面馆) 4.装饰器模式总结 装饰器模式介绍:装饰器模式可以在不修改任何底层代码的情况下,给对象赋予新的职责(程序运行时的扩展,动态的将责任附加到对象上).属于结构型设计模式. 类图: 我们来看下装饰器模式的类图: 一个简单的Demo(故乡小镇的一个面馆): 在故乡的一个小镇上面,有一家面馆,主营拉面.在这里你可以只点清汤面(SoupNoodle),也可以往里面加佐料,佐料有牛肉(Beef),鱼丸(FishB

Python进阶【第九篇】装饰器

什么是装饰器 装饰器本身就是函数,并且为其他函数添加附加功能 装饰器的原则:1.不修改被装饰对象的源代码  2.不修改被装饰对象的调用方式装饰器=高阶函数+函数嵌套+闭包 # res=timmer(test)  #返回的是wrapper的地址 # res()  #执行的是wrapper() # test=timmer(test)  #返回的是wrapper的地址 # test()  #执行的是wrapper() #  @timmer  就相当于 test=timmer(test) # #搭一个高

python 基础篇 12 装饰器进阶

本节主要内容:1. 通?装饰器回顾2. 函数的有?信息3. 带参数的装饰器4. 多个装饰器同时装饰?个函数 ?. 通?装饰器的回顾开闭原则: 对增加功能开放. 对修改代码封闭装饰器的作?: 在不改变原有代码的基础上给?个函数增加功能通?装饰器的写法: 执行过程: 其实执行  target_func()就是执行inner函数.  inner函数会先执行目标函数之前的代码,然后执行目标函数,之后再执行目标函数之后的代码. 如何获取函数的有用信息: 函数名.__name__可以查看函数名字 函数名._

Python开发【第十四篇】装饰器

装饰器 什么是装饰器? ? 装饰器是一个函数,主要作用是用来给包装另一个函数或者类 包装的目的是不改变原函数名(或类名)的情况下改变或添加被包装对象的功能 函数装饰器 是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数 语法: def 装饰器函数名(参数): 语句块 return 函数对象 @张诗琪函数名 def 函数名(形参列表): 语句块 示例: # 此示例示意装饰器函数的定义方式及装饰器来装饰另一个函数 # 的语法 def mydeco(fn): def fx(): print("

由浅入深,走进Python装饰器-----第二篇:进阶--函数装饰函数

上一篇:由浅入深,走进Python装饰器-----第一篇:基础 装饰器的使用种类: # 第一种 @函数 被装饰函数 # 第二种 @函数 被装饰类 # 第三种 @类 被装饰类 # 第四种 @函数 被装饰函数 本篇介绍第一种 @函数 被装饰函数 1.1 对带参数的原函数进行修饰 # 默认将old函数的参数传给outer里面的第一层函数 def outer(f): def inner(var): print("1 我是outer函数,接收外部传进来的old :",f) print("