Python函数3

1.装饰器

  • 软件开发有一条重要的规则:对修改封闭,对扩展开放。对于一个现有函数,如向增强此函数功能,不允许修改函数源代码时候,使用装饰器解决这个问题。
  • 本质:就是一个闭包,还是一个返回函数的高阶函数
  • 好处:就是在不用修改原函数代码的前提下给函数增加新的功能

1.1 装饰器初步

# 要增强功能的函数
def demo1(name):
    print(f"{name},加油") 

# 装饰器
def wrapper(func):      # 1 参数是要增强的函数
    def inner(name):
        func(name)      # 2.调用原函数
        print("岂曰无衣,与子同袍")
    return inner        # 3 外部函数返回内部函数的函数名
    
# 用法:
demo1 = wrapper(demo1)  # 把inner赋值给demo1
print(demo1)
demo1("武汉")           # 调用的是inner

1.2 语法糖@

  • 使用@时候,如果装饰器和需要被装饰的在同一个.py文件中的时候,装饰器一定要出现在被装饰函数的前面【Python中的代码时从上往下依次执行】
# 装饰器
def wrapper(func):  # 1 参数是要增强的函数
    def inner(name):
        func(name)  # 2.调用原函数
        print("岂曰无衣,与子同袍")
        print("青青子衿,悠悠我心")
    return inner      # 3 外部函数返回内部函数的函数名

# 用法
@wrapper    # 语法 demo2 = wrapper(demo2)
def demo2(name):
    print("{},风月同天".format(name))

print(demo2)

1.3 带任意参数的装饰器

def wrapper(func):  # 1 参数是要增强的函数
    def inner(*args,**kwargs):
        func(*args,**kwargs)  # 2.调用原函数
        print("岂曰无衣,与子同袍")
    return inner      # 3 外部函数返回内部函数的函数名

@wrapper
def hello():
    print("门前大桥下,游过一群鸭")

hello()

1.4 多个装饰器装饰同一个函数

  • 多个装饰器同时作用于一个函数的时候,注意一下装饰器的顺序
# 装饰器1
def wrapper1(func):  # 1 参数是要增强的函数
    print("装饰器1的外部函数")
    def inner(*args,**kwargs):
        func(*args,**kwargs)  # 2.调用原函数
        print("装饰器1的内部函数")
        print("岂曰无衣,与子同袍")
    return inner      # 3 外部函数返回内部函数的函数名


def wrapper2(func):  # 1 参数是要增强的函数
    print("装饰器2--外不函数")
    def inner(*args,**kwargs):
        func(*args,**kwargs)  # 2.调用原函数
        print("装饰器2的内部函数")
        print("岂曰无衣,与子同袍")
    return inner      # 3 外部函数返回内部函数的函数名

@wrapper1
@wrapper2
def demo2():
    print("我是被装饰的函数")

demo2()

2.递归函数

  • 一个问题规模缩减后,求解方式和原来一样,小规模问题解决后导致问题的最终解决,则可适用递归
  • 形式时递归的阶乘和斐波那契数列;结构时递归的列表遍历;解决时递归的汉诺塔
  • 递归程序必须包含两部分;递归终止条件;递归调用自己
def demoA():
    print("A")
    print("------")

def demoB():
    print("B")
    demoA()
    print("*****")

def demoC():
    print("C")
    demoB()
    print("=====")
# 函数嵌套调用的原理
# demoC()

# 函数自己调用自己
"""
n! = (n-1)!*n
5! = 4! * 5
4! = 3! * 4
3! = 2! * 3
2! = 1! * 2
1! = 0! * 1
0! = 1
"""
# 递归适用的场景:问题规模缩减,解法一样
def fac(n):
    if n == 0:  # 1. 递归终止条件
        return 1
    return fac(n-1) * n   # 2. 递归
    
print(fac(10))   # 输出:3628800


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值