関数オブジェクトから名前空間とスコープへ

Functionオブジェクト

プログラミング言語機能(関数)の不可欠な部分として。

すべての例外ではない変数の関数は、オブジェクトに割り当てることができるように、オブジェクト要素としてコレクションに追加することができるPythonオブジェクト関数であり、他の関数へのパラメータ値として渡すことができ、関数の戻り値としても使用することができる、これらの特性ファーストクラスのオブジェクトはユニークです。

値、ID、タイプ:オブジェクト関数は、次の3つの共通の属性を持っています

def pr_Hi():
    print('Hello World!')

print(id(foo))  # 21301264
print(type(foo))  # <class 'function'>
print(foo)  # <function pr_Hi at 0x01450810>

関数を参照することができます

def pr_Hi():
    print('Hello World!')

pr_Hi2 = pr_Hi    #引用,赋值
print(pr_Hi2)  # <function pr_Hi at 0x03020810>
print(pr_Hi)  #<function pr_Hi at 0x03020810>
pr_Hi2()  # Hello World!

関数は、コンテナクラスのデータ型に入れることができます

コンテナオブジェクト(リスト、辞書、集合など)が、任意のオブジェクトに格納することができ、機能もコンテナオブジェクトに格納することができます

def pr_Hi():
    print('from pr_Hi')
dic={'func':pr_Hi}

pr_Hi()  # from pr_Hi

print(dic['func'])  # <function pr_Hi at 0x00BE0810>

dic['func']()  # from pr_Hi

また、パラメータとして機能することができます

def pr_Hi():
    print('from pr_Hi')  # from pr_Hi

def bar(func):  ##执行函数
    print(func)  # <function pr_Hi at 0x014E0810>
    func()  ##调用上面地址的函数

bar(pr_Hi)  ##第一步,先调用bar()函数

これは、戻り値として機能することができ

def pr_Hi():
    print('from pr_Hi')

def bar(func):
    return func     

f=bar(pr_Hi)

print(f)  # <function pr_Hi at 0x00CA0810>

f()  # from pr_Hi

機能も入れ子にすることができます

def f1():
    def f2():
        print('from f2')
    return f2

abc = f1()  # f1()拿到函数的返回值,函数的返回值是f2, abc就相当于f2
abc()  # from f2

ファンクションスペースとスコープ

不随意サイド追跡範囲および機能空間を引っ張る開始するための機能をネスト。

ファンクションスペース:正確な名前空間であるためには、名前を格納する場所は、変数バインディング関係の名前と値を格納する場所です

  • ビルトイン名前空間:Pythonインタプリタで、自分の名前をPythonの生産を開始し、内蔵の名前いくつかのpythonを保存
  • グローバル・ネームスペース:ファイルは、ファイルレベル定義された名前で保存されています
  • ローカル名前空間:関数が呼び出された場合、文書の履行の過程で、それはコールの失敗の終了後に、関数が呼び出されたときに有効になります関数名内に定義されて格納するために使用される関数空間の名前を生成します

注文の名前空間

  • ロード順:組み込みの名前空間 - >グローバル名前空間 - >ローカル名前空間
  • 検索順序:ローカル名前空間 - >グローバル名前空間 - >内蔵の名前空間

スコープ:生成されたアクションのスコープ

  • グローバルスコープ:グローバル生存、世界的に効果的
  • ローカルスコープ:ローカル生存、ローカル効果
x = 1

def f2():
    x = 2  # x=2只能在f2中使用
    print(x)
    
print(x)  # 1
f2()  # 2

あなたは本当にグローバル変数またはローカル変数を変更したい場合

グローバル変更の名前
x = 1
def f1():
    global x
    x = 2
f1()
print(x)  # 2
ローカル名を変更します
x = 0
def f1():
    x = 1
    def f2():
        x = 2
        def f3():
            nonlocal x #改的是函数正上方的值
            x = 3
            print('f3',x)  # f3 3
        f3()
        print('f2',x)  # f2 3
    f2()
    print('f1',x)  # f1 1
print(x)  # 0
f1()
推奨参照型
lt = [1,2,3]  # 作用域关系仅适用不可变数据类型,不适用于可变数据类型
def f1():
    lt.append(4)
print(lt)  # [1, 2, 3]
f1()
print(lt)  # [1, 2, 3, 4]

おすすめ

転載: www.cnblogs.com/Gredae/p/11329301.html
おすすめ