- オブジェクト関数:関数は関数内で定義されてもよい従ってレベル制限機能を破壊する、グローバルな使用に戻ります。
- 名前空間と範囲:関数が死んで固定された範囲の定義の位相関係にかかわらず、呼び出し元の場所に、関数を呼び出すことは行く定義関数に必要があるときに任意の位置にある関係の範囲を見つけます。
def f1():
x = 1
def inner():
print(x)
return inner
func = f1()
x = 2
def f2():
x = 3
func()
f2()
1
閉鎖淀何である
クロージャ:閉鎖は(内部関数の関数)が閉鎖され、それが含むパッケージ(内部関数ではなく、グローバルスコープの変数外側範囲を参照)です。閉鎖手段:外部参照の内部機能の機能、およびグローバルスコープのない範囲です。
ヒント:私たちは、関数に渡される外部パラメータ値を通じてされる前に、クロージャは別のアイデアを提供し、私自身、ヨラップを、それを包む、すごい包みます。
def outter():
x = 1
def inner():
print(x)
return inner
f = outter()
def f2():
x = 2
f()
f2()
1.1関数のパラメータを渡すような方法の二種類
为函数传参的方式一:使用参数的形式
def func(x):
print(x)
func(1)
func(1)
func(1)
1 1 1
次の2つの方法の関数として渡すパラメータ:パケット機能
def outter(x):
x = 1
def inner():
print(x)
return inner
f = outter(1)
f()
f()
f()
# 查看闭包的元素
print(F"f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}")
1 1 1 f.__closure__[0].cell_contents: 1
2つのディアン閉鎖機能の応用
有意閉鎖パッケージ:関数は、関数に関わらず優先外層はその範囲を包んだ場合の呼び出しを行う層に包まれたスコープ機能の外に、オブジェクトだけでなく、関数オブジェクトを返します。
アプリケーション:遅延計算(私たちは質量参加している、そして今、私たちが包まれていることが判明)、爬虫類フィールド。
面倒なコードの閉鎖なし:
import requests
def get(url):
response = requests.get(url)
print(f"done: {url}")
get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.cnblogs.com/linhaifeng')
get('https://www.cnblogs.com/linhaifeng')
get('https://www.cnblogs.com/linhaifeng')
done: https://www.baidu.com done: https://www.baidu.com done: https://www.baidu.com done: https://www.cnblogs.com/linhaifeng done: https://www.cnblogs.com/linhaifeng done: https://www.cnblogs.com/linhaifeng
上記のアプローチは、我々は唯一のURLを解決することができますデフォルトのパラメータを使用している場合、私たちは閉鎖の道の使用を考慮することができ、非常に複雑です。
import requests
def outter(url):
def get():
response = requests.get(url)
print(f"done: {url}")
return get
baidu=outter('https://www.baidu.com')
python = outter('https://www.python.org')
baidu()
baidu()
python()
python()
done: https://www.baidu.com done: https://www.baidu.com done: https://www.python.org done: https://www.python.org