12日:クロージャとデコレータ

閉鎖機能

クロージャの機能は何ですか

組み込み関数、参照される外部変数の関数、インライン関数は、閉鎖機能になることでした

外部関数の定義と呼ばれているが、可変内部リファレンス機能自由変数

クロージャネストされた関数は、少なくともの関数であり、

def f1(x):
    def f2():
        print(x)
    return f2
num = f1(2)
num()
def outer(x,y):
    def inner():
         nonlocal x ,y
         x += 1
         y += 2
         print(f'x:{x},y:{y}')
    return inner
test = outer(2,5)
test()
test()

グローバル変数、関数内でカプセル化された内側と外側の機能ではなく、外部コールを使用してクロージャを削除する機能を使用しました。

実行が完了外側の関数、そのパラメータxであるとき、彼らは閉鎖されているので、yが残って、それが回復することはありません。

デコレーター

デコレータパラメータは伝達関数であるアドバンストアプリケーションデコレータ閉鎖機能に対応する、クロージャの伝達関数パラメータは、可変です。デコレーションは、ソースコードを変更するために使用されていないと機能は、元の関数に追加する方法を呼び出します。

  1. デコレータ自体は関数であるが、それは装飾的な機能で飾らなければ使用しました
  2. 装飾的な装飾的な関数は、関数を装飾するためにソースコードを変更しません
  3. 装飾された機能を変更しないデコレータ装飾関数が呼び出されます
import time


def index():
    """被装饰的函数"""
    print('index')
    time.sleep(1)


# time_count装饰器:对被装饰函数计时
def time_count(func):  # func才是真正的index
    """装饰器"""

    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print(end - start)

    return wrapper


index = time_count(index)  # index == wrapper
index()  # wrapper()

デコレータの戻り値

import time


def index():
    """被装饰的函数"""
    print('x',x)
    print('index')
    time.sleep(1)

    return 'index'


# time_count装饰器:对被装饰函数计时
def time_count(func):  # func才是真正的index
    """装饰器"""
    def wrapper():
        start = time.time()
        res = func()  # index()
        end = time.time()
        print(end - start)
        return res

    return wrapper


index = time_count(index)  # index == wrapper
res = index()  # wrapper()
print(res)

関数の戻り値については、我々は戻り値を受け取る変数名を取ることができます

RESの= funcを()その後、RESを返します

引数デコレータがあります。

import time


def index(x,y,z=10):
    """被装饰的函数"""
    print('x',x)
    print('index')
    time.sleep(1)

    return 'index'


# time_count装饰器:对被装饰函数计时
def time_count(func):  # func才是真正的index
    """装饰器"""

    def wrapper(*args,**kwargs):  # (10, 20)  # *args和**kwargs接收了所有的参数
        start = time.time()
        res = func(*args,**kwargs)  # index()  # *(10,20)  # *args和**kwargs打散参数传给真正的index
        end = time.time()
        print(end - start)

        return res

    return wrapper


index = time_count(index)  # index == wrapper
res = index(10,20,320)  # wrapper()
print(res)

私たちは、元の関数のパラメータの何がわからない場合、我々は、可変長のパラメータのデコレータを使用することができます

デフラッパー(* argsを、** kwargsから):

RESの= funcを(* argsを、** kwargsから)

使用に値の最後に、再送信

デコレータのシンタックスシュガー

@デコレータ関数名

インデックス= time_count(インデックス)== @time_count

装飾的な機能の上に書き込むためのデコレータ機能、@以下飾ら関数を記述します。

装飾的なテンプレート

要約すると、我々は直接使用適用されたときのようなテンプレートデコレータを得ることができます

def deco(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        pass
        return res
    return wrapper

    @decp
    def show(name, age):
        print(name,age)

    show('ly',10)

おすすめ

転載: www.cnblogs.com/lyyblog0715/p/11574951.html