Pythonの閉鎖で

1.関数の参照は
、以下の例を見て、関数参照が理解されます。

def test1():
    print("--- in test1 func----")

# 调用函数
test1()

# 引用函数
ret = test1

print(id(ret))
print(id(test1))

#通过引用调用函数
ret()

結果:

--- in test1 func----
140212571149040
140212571149040
--- in test1 func----

閉鎖は何2.
閉鎖は内部変数関数の他の機能を読むことができるようにすることです。簡単に言えば、閉鎖パッケージのコンセプトは、我々はクロージャを呼んで、私たちは関数内で関数を定義する場合、この関数は外側の関数の内部の一時変数を使用し、外部関数の戻り値は、内部関数への参照であるということである
ようにします我々は容易になります。この概念を理解するために例を組み合わせること:

# 定义一个函数
def test(number):

    # 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包
    def test_in(number_in):
        print("in test_in 函数, number_in is %d" % number_in)
        return number+number_in
    # 其实这里返回的就是闭包的结果
    return test_in


# 给test函数赋值,这个20就是给参数number
ret = test(20)

# 注意这里的100其实给参数number_in
print(ret(100))

#注 意这里的200其实给参数number_in
print(ret(200))

結果:

in test_in 函数, number_in is 100
120

in test_in 函数, number_in is 200
220

3.クロージャ理解
のクロージャをよりよく理解するために閉鎖の本当の例を見てみましょう:

def line_conf(a, b):
    def line(x):
        return a*x + b
    return line

line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5))
print(line2(5))

この例では、機能線と変数bがクロージャを構成しています。クロージャを作成、我々はパラメータでline_conf、Bこれらの二つの変数の値を示しており、私たちは関数(Y = X + 1、Y = 4X + 5)の最終形態を決定しました。私たちは、あなたが一次関数の異なる発現を得ることができ、パラメータに、Bを変更する必要があります。したがって、我々は見ることができ、閉鎖はまた、コードの再利用性を向上させるための役割を担っています。
何の閉鎖が存在しない場合、我々は、B、Xを説明すると同時に、時間の線形関数を毎回作成する必要があります。したがって、我々はより多くの伝送パラメータを必要とするだけでなく、コードの移植性を低減します。
注意:
ローカル変数の外部関数を引用により閉鎖に、ローカル変数は外部関数にリリースされていない、メモリ消費量

4.外部変数の機能を変更するためにどのように
クロージャー機能で、我々は外側の関数バインディングの一時的な変数を使用するのは自由ですが、我々はそれを変更するとき、エラーが見つかります。それはどのように?
pythonの基本的な構文の中で、関数はグローバルデータなしで読むことができますが、次の2つの方法でグローバルデータを変更したいとき:

  • グローバル宣言グローバル変数
  • あなたが変更することができたときにグローバル変数は、変数のデータ型です

どのようにそれは、外部変数の関数にそれを修正することができます。

  • キーワード非ローカルを使用することでのpython3では、この変数は、ローカル変数空間を表現するための変数ではない、我々は変数空間変数の層をルックアップする必要があります。
  • python2、ノーローカル以外のキーワードでは、我々はこのようなリストとして変数データ変更、変数の型の閉鎖を変更することができます。

次のコードを見てください:

中のpython3で:

def counter(start=0):
    def incr():
        nonlocal start
        start += 1
        return start
    return incr

c1 = counter(5)
print(c1())
print(c1())

c2 = counter(50)
print(c2())
print(c2())

print(c1())
print(c1())

print(c2())
print(c2())

結果:

6
7
51
52
8
9
53
54

中python2で:

def counter(start=0):
    count=[start]
    def incr():
        count[0] += 1
        return count[0]
    return incr

c1 = closeure.counter(5)
print(c1())
print(c1())
c2 = closeure.counter(100)
print(c2())
print(c2())

結果:

6
7
101
102

使用しているもの5.クロージャ
あなたはクロージャを使用したくない理由上記のコードは、私たちは、クロージャを達成することができる必要はありません。
実際には、上記の実施例および概要から分かる:クロージャは、コードの再利用性、増加した可搬性、簡略化された手順を向上させることができます。私たちは、直線yを表現する関数を定義したい= KX + B、閉鎖して、我々は時間k、b値を与える必要があり、その後、Xを与える直線を生成します。そして、機能のないすべての定義。閉鎖参照に、外側の関数のローカル変数、外側の関数のローカル変数が時間内に解放することができないため、それはメモリを消費します、ことに留意すべきです。

おすすめ

転載: www.cnblogs.com/lenfoo/p/11233860.html