python高阶函数(2)

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

前言

上次总结了python高阶函数, 函数作为参数的情况, 这次总结一下函数作为结果返回

举例,在函数a里面定义了一个计算整数列表求和的函数,该求和函数作为a函数的结果返回

def  a(int_list1):

    def sum_list():

        cal = 0

        for i in int_list1:

            cal+=i

        return cal

    return sum_list
复制代码

我们去使用它

f = a([1,2,3,4,5])
print(f)
print(f())
复制代码

执行结果

# print(f), f是一个函数对象
<function a.<locals>.sum_list at 0x022DB858>
# print(f()), f()是函数调用,执行了sum_list
15
复制代码

在这个例子中,我们在函数a中又定义了函数sum_list,并且,内部函数sum_list可以引用外部函数a的参数int_list1和局部变量,当a返回函数sum_list时,相关参数和变量都保存在返回的函数中,这就是闭包。

请再注意一点,当我们调用a时,每次调用都会返回一个新的函数,即使传入相同的参数

闭包

内部函数可以引用外部函数的局部变量和参数, 返回的内部函数没有被立即执行,直到调用了才会被执行 有一个经典的例子,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了


def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

复制代码

我们去调用这三个函数的时候,并不是我们认为的结果1, 4, 9,而是全都是9, 那是因为内部函数f调用了外部函数的变量i, 因为没有被立即执行,那么等到三个函数全部都创建好之后,变量i变成了3, 那么你去调用这三个函数的时候,都是用的3,所以最终结果都是9.

装饰器

如果不想影响原来函数的功能,而是在代码运行期间动态的额外增加一些功能的方式被成为装饰器, 这个装饰器其实跟闭包的写法一样,也是在函数里面嵌套一个函数,返回内部函数

定义一个装饰器

def log(func):
   def wrapper(*args, **kw):
       print('call %s():' % func.__name__)
       return func(*args, **kw)
   return wrapper
复制代码

使用装饰器

@log
def dest_func():
    # write some code
复制代码

执行结果

dest_func()

图片.png

@log相当于log(dest_func)

Guess you like

Origin juejin.im/post/7068555243381850142