函数扩展

python基础——函数(function)扩展

1. 高阶函数

  • 接收函数作为参数,或者将函数作为返回值返回的函数就是高阶函数
  • 例如:
"""
高级函数:
1.接收一个或多个函数作为参数
2.将函数作为返回值返回
"""

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]


def fn2(i):
    if i % 2 == 0:
        return True
    return False


def fn3(i):
    if i > 5:
        return True
    return False


def fn4(i):
    if i % 3 == 0:
        return True
    return False


def fn(func, lst):
    new_lst = []
    for n in lst:
        if func(n):
            new_lst.append(n)
    return new_lst


print(fn(fn4, lst))
print(fn(fn3, lst))
print(fn(fn2, lst))

2. 闭包

  • 将函数作为返回值也是高阶函数我们也称为闭包
  • 闭包的好处
  • 通过闭包可以创建一些只有当前函数能访问的变量
  • 可以将一些私有数据藏到闭包中
  • 行成闭包的条件
  • 函数嵌套
  • 将内部函数作为返回值返回
  • 内部函数必须要使用到外部函数的变量
  • 例如 :
"""
闭包:
将函数作为返回值返回,称为闭包
通过闭包可以创建一些只有当前函数能访问的变量
可以将一些私有数据藏到闭包中
"""


def fn():
    a = 10

    def fn2():
        print('I love You', a)

    return fn2


r = fn()  # r是一个函数  是调用fn()后返回的参数 这个函数是fn内部定义 并不是全局函数
print(r())


"""
形成闭包的条件:
1.函数嵌套
2.将内部函数作为返回值返回
3.内部函数必须要使用到外部函数的变量
"""

3. 装饰器的引入

  • 我们可以直接通过修改函数中的代码来完成需求,但是会产生以下一些问题
    如果修改的函数多,修改起来会比较麻烦
    不方便后期的维护
    这样做会违反开闭原则 (ocp)
    程序的设计,要求开发对程序的扩展,要关闭对程序的修改

4. 装饰器的使用

  • 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
    在开发中,我们都是通过装饰器来扩展函数的功能的
  • 例如:
"""
装饰器的引入:
我们可以直接通过修改函数中的代码来完成需求,但是会产生一些问题
1.如果要修改的函数比较多,修改起来比较麻烦
2.不方便后期维护
3.违反 开闭原则(OCP) 程序的设计 要求开发对程序的扩展,要关闭对程序的修改
"""


def fn():
    print('我是fn函数')


def add(a, b):
    return a + b


def start_end(old):
    """
    用来对其他的函数进行扩展 扩展函数的执行的时候  打印 开始执行 执行后 打印执行结束
    :param old: 要扩展的函数
    :return:
    """
    def new_function(*args, **kwargs):
        print('开始执行')
        # 要调用被扩展的函数
        result = old(*args, **kwargs)

        print('执行结束')
        return result
    return new_function


f = start_end(add)
# f = start_end(fn)
r = f(555, 890)
print(r)

#  类似于start_end(old)的函数 称之为装饰器

"""
亦可如此调用
"""
@start_end
def speak():
    print('大家加油')

speak()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值