zoukankan      html  css  js  c++  java
  • Python的闭包和装饰器

    什么是闭包

      python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用。

      闭包的作用就是让一个变量能够常驻内存。

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

    装饰器(decorator)

    装饰器就是为了不修改原函数的定义,并使原函数在运行时动态增加功能的方式,一般来说装饰器是一个返回函数的高阶函数。

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

    装饰器使用时要借助@语法:

    @log
    def now():
        print('2019-3-25')

    @语法相当于执行了语句:

    now = log(now)

    注意:

    为了使加过装饰器的函数仍然就有原函数相同的__name__等属性,可以使用以下方法:

    import functools
    
    def log(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    
    带参数:
    import functools
    
    def log(text):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kw):
                print('%s %s():' % (text, func.__name__))
                return func(*args, **kw)
            return wrapper
        return decorator
  • 相关阅读:
    iOS自动布局框架-Masonry详解
    iOS设置圆角的三种方式
    iOS9 App Thinning(应用瘦身)功能介绍
    以无线方式安装企业内部应用
    Xcode 9 Analyzing Crash Reports
    IQKeyboardManager 问题锦集
    列表
    字符串索引,切片,步长及方法详解
    while循环语句、格式化输出、常用运算符、字符编码
    if语句简单练习
  • 原文地址:https://www.cnblogs.com/heshike/p/10497933.html
Copyright © 2011-2022 走看看