编程语言
首页 > 编程语言> > python装饰器&函数递归&栈和队列

python装饰器&函数递归&栈和队列

作者:互联网

一、装饰器【掌握】

1.案例

代码演示:

def test():
    print("你好啊!")
# test()

# 需求: 给上面的函数test增加一个功能, 输出 我很好
# 第一种方式:  修改了原来的函数

'''
def test():
    print("你好啊!")
    print("我很好")
test()

# 第二种方式: 定义一个新函数,在新函数中调用原函数,然后追加功能
def test1():
    test()
    print("我很好")
test1()
'''

在代码运行期间,可以动态增加函数功能的方式,被称为装饰器【Decorator】 通过闭包函数实现

也就是说,在不修改原函数的基础上,给原函数增加功能

好处:在团队开发中,如果两个或者两个以上的程序员会用到相同的功能,但是功能又有细微的差别,采用装饰器:相互不影响,代码简化

2.使用

2.1简单装饰器

代码演示:

# 原函数
def test():
    print("你好啊!")
# 需求: 给上面的函数test增加一个功能, 输出 我很好
# 第三种方式: 通过装饰器的方式给函数追加功能   装饰器使用闭包实现
'''
闭包函数:
1.函数嵌套函数
2.内部函数使用外部函数的变量
3.外部函数中返回内部函数
'''

#a.书写闭包函数    此处的outer函数就是装饰器函数
def outer(fn):  #b. fn表示形参,  实际调用的时候传递的是原函数的名字
    def inner():
        fn()  #c.调用原函数
        #d. 给原函数添加功能,   注意:添加的功能可以写在原函数的上面也可以写在原函数的下面
        print("我很好")
    return inner
print("添加装饰器之前:",test,__name__)   #<function test at 0x00000223ED1DC268>
test = outer(test)
print("添加装饰器之后:",test,__name__) # <function outer.<locals>.inner at 0x00000223ED793510>
test()
总结:
    1.在装饰器中,给原函数添加的功能,可以写在原函数的上面,也可以写在原函数的下面
    2.outer 函数就是我们的装饰器函数

2.2系统的简写

代码演示:

#a.书写闭包函数    此处的outer函数就是装饰器函数
def outer(fn):  #b. fn表示形参,  实际调用的时候传递的是原函数的名字
    def inner():
        fn()  #c.调用原函数
           #d. 给原函数添加功能,   注意:添加的功能可以写在原函数的上面也可以写在原函数的下面
           print("我很好")
       return inner
   
   # test = outer(test)

# 装饰器的简写方式 @ + 装饰器名称
@outer    # 等价于  =====>test = outer(test)
def test():
       print("你好啊!")
test()

'''
注意:
    1.在使用装饰器的简写方式的时候,原函数必须在装饰器函数的下面
    2.outer就是装饰器函数.  @outer等价于  test = outer(test)
'''

2.3不定长参数的装饰器(通用装饰器)

代码演示:

# 同一个装饰器装饰多个函数
def jisuan(fn):
    def inner(*args):
           print("数学运算的结果是:",end=" ")
           fn(*args)
       return inner
   
@jisuan
def add(a,b):
    print(a+b)
   add(12,34)

@jisuan
def cha(a,b,c):
    print(a-b-c)
cha(100,23,26)

2.4带返回值的装饰器

def outer(fn):
    def inner():
        print("我的爱好是:",end = " ")
        return fn()    # fn() ===> swim() ===> "i like swimming(这句话返回到了第4行)
    return inner

@outer
def swim():
    return "i like swimming!"
love = swim()
print(love)

2.5 多个装饰器作用同一个函数

# 多个装饰器作用域一个函数
def outer1(fn):
    def inner():
        print("~~~~~~~1111")
        fn()
    return inner

def outer2(fn):
    def inner():
        print("~~~~~~~2222")
        fn()
    return inner

# 原函数
@outer2
@outer1
def show():
    print("今晚我的好基友从广州过来了,好开心!....")
show()

'''
当多个装饰器修饰一个函数的时候,装饰器从上往下依次执行. 并且原函数只执行一次.
'''

二、函数递归【掌握】

1.概念

1.概念

递归函数:一个会调用自身的函数【在一个函数的内部,自己调用自己】

递归调用

递归中包含了一种隐式的循环,他会重复指定某段代码【函数体】,但这种循环不需要条件控制

使用递归解决问题思路:

​ a.找到一个临界条件【临界值】

​ b.找到相邻两次循环之间的关系

​ c.一般情况下,会找到一个规律【公式】

2.使用

代码演示:

# 函数自己调用自己就是递归
# 需求:通过递归的方式,封装一个函数,计算 n! (n是传入的数字)


# 5! ===> 5*4*3*2*1==>5 * 4!
# 4! ===> 4*3*2*1 ===>4 * 3!
# 3! ===> 3*2*1====>  3 * 2!
# 2! ===> 2*1  ===>   2 * 1!
# 1! ===> 1

#总结如下:
# n! = n * (n-1)!
'''
a.找到一个临界值(临界条件)   1! = 1
b.找到两个循环之间的关系
c.总结规律: n! = n * (n-1)!
'''
def digui(n):
    if n == 1:
        return 1
    return n * digui(n-1)
print(digui(6))


# 通过递归封装一个函数,传入一个数字m,得到第m个斐波那契数列
# 1 1 2 3 5 8 13 21 34 55 89
def fn(m):
    if m < 3:
        return 1
    return fn(m-1) + fn(m-2)
print(fn(8))

注意:以后在实际项目中尽量少用递归,如果隐式循环的次数太多,会导致内存泄漏【栈溢出】 python默认的递归次数限制为1000次左右.以免耗尽计算机的内存.

优点:简化代码,逻辑清晰

三、栈和队列【了解】

用于存储数据的线性表

栈:在表的一端进行插入和删除

队列:在表的一端进行插入,在表的另一端进行数据的删除

1.栈

Stack

开口向上的容器:先进后出,后进先出

代码演示:

#栈
#list底层维护了一个栈的线性表
myStack = []
#插入数据
#数据入栈  (压栈)
myStack.append(1)
print(myStack)
myStack.append(2)
print(myStack)
myStack.append(3)
print(myStack)
myStack.append(4)
print(myStack)   #[1,2,3,4]

print("============")
#出栈
myStack.pop()
print(myStack)
myStack.pop()
print(myStack)
myStack.pop()
print(myStack)
myStack.pop()
print(myStack)

2.队列

queue

水平放置的水管:先进先出,后进后出

代码演示:

#队列  queque
import collections  #数据结构的集合
queue = collections.deque([11,22,33,44])
print(queue)

#入队 (存储数据)
queue.append(55)
print(queue)
queue.append(66)
print(queue)
queue.append(77)
print(queue)

#出队(获取数据)
queue.popleft()
print(queue)
queue.popleft()
print(queue)
queue.popleft()
print(queue)
queue.popleft()
print(queue)

标签:原函数,函数,递归,python,队列,test,fn,print,def
来源: https://blog.csdn.net/kk_12345z/article/details/119080490