質問

私は読書について多くの閉鎖と思いその内容を理解した上で、曇りのために自分自身と他人としたいと思っていて説明できる閉鎖として簡潔に表現、できるだけ具体的に述べる。私の簡単な説明がなかった理由を使いたいと思っていられています。

役に立ちましたか?

解決

休止

対象データと方法 付属し、クロージャ機能 データは付属します。

def make_counter():
    i = 0
    def counter(): # counter() is a closure
        nonlocal i
        i += 1
        return i
    return counter

c1 = make_counter()
c2 = make_counter()

print (c1(), c1(), c2(), c2())
# -> 1 2 1 2

他のヒント

このシンプルです:る機能を参照変数からを含む範囲における後流の制御に残さい。その際は修正いたしは非常に有:

>>> def makeConstantAdder(x):
...     constant = x
...     def adder(y):
...         return y + constant
...     return adder
... 
>>> f = makeConstantAdder(12)
>>> f(3)
15
>>> g = makeConstantAdder(4)
>>> g(3)
7

注12 4ついて"失踪"内のfおよびgにそれぞれこの機能はしないのでfとgの適正を抑止するためには、必要か

私のように この、簡潔な定義:

る機能を参照することができる環境がなくなります。

思追加

閉鎖で結合する変数への機能 なっているだけで楽しいパラメータとして.

デコレータをパラメータは一般的な使用を抑止するためには、必要か閉鎖は一般的な実施機構をう"機能の工場".ということでしょうを選ぶ閉鎖の 戦略パターン の戦略により変更されたデータで実行します。

言語ることで匿名のブロック定義--例えば、ルビー、C#--閉鎖の実装で使用できます(金額)に新制御構造です。が匿名のブロックの間で 制限の閉鎖にPython.

正直、理解してい閉鎖アメリカを除くんについて明らかになったい何のことは、"閉鎖"という"閉鎖"です。私のおすすめしておく必要がありまものプロセスの選択。

とにかく、ここでの私の説明:

def foo():
   x = 3
   def bar():
      print x
   x = 5
   return bar

bar = foo()
bar()   # print 5

鍵うことは、関数から返されるオブジェクトはfooを持つフックのvar'x'では'x'ではなくなってしまったの範囲は消滅してしまっている。このフックは、varそのものだけでなく、価値のvarた時にでもバー"と呼ばれるもので版画5、3.

することも明らかにPython2.x限定休業:ができまmodify'x'内部'bar'を書き込みがx=blaものを宣言する地域の"x"のバー、譲渡してはならないもの'x'foo.この結果はPythonの配=宣言です。この、Python3.0を紹介する非局所的キーワード:

def foo():
   x = 3
   def bar():
      print x
   def ack():
      nonlocal x
      x = 7
   x = 5
   return (bar, ack)

bar, ack = foo()
ack()   # modify x of the call to foo
bar()   # print 7

んになっていることの取引で使用される同一コンテキストを説明するなどの閉鎖は、あな取引を意味す。

もと呼ばれる閉鎖で"閉じる"の外部変数(定常)、すなわち単なる機能はエンクロージャー"とも呼ばれ、環境の機能を作成します。

以下の例では、呼び出しを閉鎖gを変更した後、xもの値を変更するx内のg、gが閉じ過x:

x = 0

def f():
    def g(): 
        return x * 2
    return g


closure = f()
print(closure()) # 0
x = 2
print(closure()) # 4

ここでの典型的な使用例クロージャ-コールバックのためのGUIの要素のことを知る必要があり替わる場合は、サブクラスのボタンを行っています。-例えば、を構築することが可能呼び出される関数への対応ボタンを押し、"閉じる"に関連する変数の範囲に必要な処理をクリックします。このようにでき線写複雑な面からの同一の初期化機能のビルのすべての依存関係にあります。

Pythonでは、閉鎖がインスタンスの機能を変数にすimmutably.

実際には、 データモデルを説明するこ その説明の機能 __closure__ 属性:

はなや タプルの細胞 が含まれるバインディングの機能の変数.読み取り専用

この点を明らかにするため:

def enclosure(foo):
    def closure(bar):
        print(foo, bar)
    return closure

closure_instance = enclosure('foo')

を明確にしていったのかという関数を指摘から変数名 closure_instance.ご了承お願の場合ますと、オブジェクト bar, で印刷文字列の 'foo' ものの文字列表現 bar です。

この文字列'foo' 行きのインスタンスの機能までを直接読んでここでは、アクセスすることにより、 cell_contents 属性の初で唯一の細胞にタプルの __closure__ 属性:

>>> closure_instance.__closure__[0].cell_contents
'foo'

ちなみに、セルオブジェクトに記述したC APIドキュメンテーション

"細胞"オブジェクトを実装するのに使われている変数を参照する複数の スコープ

とを示すことができるし当社の閉鎖を用いると考え、 'foo' はにこだわったのと変わりません:

>>> closure_instance('bar')
foo bar
>>> closure_instance('baz')
foo baz
>>> closure_instance('quux')
foo quux

いることで変更することが可能で:

>>> closure_instance.__closure__ = None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: readonly attribute

一部の機能

の例では、閉山として一部機能が私の目標は、同じ目標が達成できると functools.partial

>>> from __future__ import print_function # use this if you're in Python 2.
>>> partial_function = functools.partial(print, 'foo')
>>> partial_function('bar')
foo bar
>>> partial_function('baz')
foo baz
>>> partial_function('quux')
foo quux

が複雑に閉鎖にともない、一部機能の例では、そもそもの私の回答を発揮してさらに時間が適用されるものとする。

ここでは一例ですのPython3閉鎖

def closure(x):
    def counter():
        nonlocal x
        x += 1
        return x
    return counter;

counter1 = closure(100);
counter2 = closure(200);

print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 2 " + str(counter2()))
print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 1 " + str(counter1()))
print("i from closure 2 " + str(counter2()))

# result

i from closure 1 101
i from closure 1 102
i from closure 2 201
i from closure 1 103
i from closure 1 104
i from closure 1 105
i from closure 2 202
# A Closure is a function object that remembers values in enclosing scopes even if they are not present in memory.

# Defining a closure

# This is an outer function.
def outer_function(message):
    # This is an inner nested function.
    def inner_function():
        print(message)
    return inner_function

# Now lets call the outer function and return value bound to name 'temp'
temp = outer_function("Hello")
# On calling temp, 'message' will be still be remembered although we had finished executing outer_function()
temp()
# Technique by which some data('message') that remembers values in enclosing scopes 
# even if they are not present in memory is called closures

# Output: Hello

基準を満たクロージャ:

  1. もしなければいけ入れ子の機能です。
  2. 入れ子の機能として使いこなせなければならな価値の定義に囲ます。
  3. を封入しないことが証明され返すメソッドは、入れ子の機能です。

# Example 2
def make_multiplier_of(n): # Outer function
    def multiplier(x): # Inner nested function
        return x * n
    return multiplier
# Multiplier of 3
times3 = make_multiplier_of(3)
# Multiplier of 5
times5 = make_multiplier_of(5)
print(times5(3)) # 15
print(times3(2)) #  6

のために、"閉鎖"の機能に対する記憶する環境になります。この機能を利用できる変数または方法の閉鎖が既に使用できないからさんが存在しないのよ。見てみましょうこのコードをruby

def makefunction (x)
  def multiply (a,b)
    puts a*b
  end
  return lambda {|n| multiply(n,x)} # => returning a closure
end

func = makefunction(2) # => we capture the closure
func.call(6)    # => Result equal "12"  

でも、"増殖方法"および"x"に変はな存在します。すべてが閉鎖機能に覚えておいてください。

して使用 デコレータ python.富良事例かは閉鎖機能エラーになります。

class Test():
    def decorator(func):
        def wrapper(*args):
            b = args[1] + 5
            return func(b)
        return wrapper

@decorator
def foo(val):
    print val + 2

obj = Test()
obj.foo(5)

こちらの最終値は12です

ここで、ラッパー機能でアクセスできfuncオブジェクトがラッパーでは"語彙の閉鎖"でアクセスをその親の属性.そこで、アクセスできfuncオブジェクトです。

たいと思いシェア私の例についての説明を抑止するためには、必要か私はpythonの例では、二つの値をスタックです。

def maker(a, b, n):
    margin_top = 2
    padding = 4
    def message(msg):
        print('\n’ * margin_top, a * n, 
            ' ‘ * padding, msg, ' ‘ * padding, b * n)
    return message

f = maker('*', '#', 5)
g = maker('', '♥’, 3)
…
f('hello')
g(‘good bye!')

このコードを下記のとおりとするこ:

*****      hello      #####

      good bye!    ♥♥♥

ここでは二つの値を示書庫の閉鎖の機能オブジェクトです。

の機能から返されるメーカー

場合に関数が呼び出され、後

場合に関数が呼び出されるまで、よりパラメータまたは非局所変数のコードのニーズをローカル変数のバインディングなどのmargin_top、パディングとa,b,n.を確保するための機能コードのスタックフレームのメーカー機能しなくなり昔はアクセス可能で、バックアップの閉鎖までのメッセージ関数オブジェクトです。

最高の説明があったの閉鎖を説明します。って思ったこと。

想像プログラムがスタックとして退化する場合、各ノードは子の単葉ノードの文脈において、現在実行中の手続き

現在の制約している各ノードのみとなっています。

そうすることができますの構築('利回り"といいます)に復帰できるから手続きを廃棄せずに地元のコンテキスト(すなわちなポップでスタックの時に戻ります).次の手順で呼び出され、呼び出しを拾旧スタック(木)フレーム進行で開かれている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top