python役割ドメイン、変数役割ドメイン

4517 ワード

変数スコープ
1つのプログラムのすべての変数は、どの場所でもアクセスできるわけではありません.アクセス権は、この変数がどこで付与されているかによって異なります.
変数の役割ドメインは、どのプログラムがどの特定の変数名にアクセスできるかを決定します.
次の2つの最も基本的な変数の役割ドメインを示します.
  • グローバル変数
  • ローカル変数
  • 関数の内部に定義された変数には局所的な役割ドメインがあり、関数の外に定義されたグローバルな役割ドメインがあります.
    ローカル変数は宣言された関数の内部にのみアクセスでき、グローバル変数はプログラム全体にアクセスできます.関数を呼び出すと、関数内で宣言されたすべての変数名が役割ドメインに追加されます.
    例:
    num = 0 #    
    def sum(arg1,arg2):
        #        
        num = arg1 + arg2   #num        
        print('    :',num)
        return num
    sum(10,5)
    print('    :',num)

    実行結果:
        : 15
        : 0
    

    pythonにおける役割ドメインが4つに分かれている場合
  • L:local、ローカル役割ドメイン、すなわち関数で定義された変数.
  • E:enclosing、ネストされた親関数のローカル役割ドメイン、すなわち、この関数を含む上位関数のローカル役割ドメインですが、グローバルではありません.
  • G:globa、グローバル変数、モジュールレベル定義の変数です.
  • B:built-in、int、bytearrayなどのシステム固定モジュール内の変数.検索変数の優先順位は、「役割ドメインローカル」>「外層役割ドメイン」>「現在のモジュールのグローバル」>「python内蔵役割ドメイン」>「LEGB」の順です.
  • x = int(3.9)    #int built-inf ,           ;
    g_count = 10    #globa,    ;
    def outer():
        e_count = 1 #enclosing,                ,     ;
        def inner():
            l_count = 2 #local,     ,        ;
            print(o_count)
        inner()
    outer()

    localとenclosingは相対的であり、enclosing変数も上層に対してlocalである.
    アクティブドメイン生成
    Pythonでは、モジュール(module)、クラス(class)、関数(def、lambda)のみが新しい役割ドメインを導入します.他のコードブロック(if、try、forなど)は新しい役割ドメインを導入しません.次のコードです.ifは新しい役割ドメインを導入していません.xは現在の役割ドメインにあります.後のコードは使用できます.
    if 2>1:
        x = 1
    print(x)    #    1

    def、class、lambdaは、新しい役割ドメインを導入できます.
    def test():
        x = 2
    print(x) #NameError: name 'x' is not defined

    globalキーワード
    内部役割ドメインが外部役割ドメインの変数を変更したい場合は、globalとnonlocalのキーワードを使用します.変更した変数がグローバル役割ドメイン(global役割ドメイン)にある場合は、globalを使用して宣言します.コードは次のとおりです.
    count = 20
    def outer():
        global count
        print(count)
        count = 200
        print(count)
    outer()

    実行結果:
    20
    200

    nonlocalキーワード
    globalキーワード宣言の変数は、グローバル役割ドメインでネストできません.ネストされた役割ドメイン(enclosing役割ドメイン、外層非グローバル役割ドメイン)の変数を変更するにはnonlocalキーワードが必要です.
    def outer():
        num = 20
        def inner():
            nonlocal num
            num = 100
            print(num)
        inner()
        print(num)
    outer()

    実行結果:
    100
    100

    まとめ:
    (1)変数の検索順序:LEGB,役割ドメイン局所>外層役割ドメイン>現在のモジュールのグローバル>python内蔵役割ドメイン;
    (2)モジュール、クラス、および関数のみが新しい役割ドメインを導入することができる.
    (3)1つの変数に対して、内部役割ドメインが先に宣言すると外部変数が上書きされ、直接使用を宣言しないで、外部役割ドメインの変数が使用されます.
    (4)内部役割ドメイン外部役割ドメイン変数の値を変更する場合、グローバル変数はglobalキーワード、ネストされた役割ドメイン変数はnonlocalキーワードを使用します.nonlocalはpython 3に追加されたキーワードで、このキーワードがあれば、閉パッケージを完璧に実現できます. 
    高次関数
    変数は関数を指すことができ、関数のパラメータは変数を受信することができ、関数は別の関数をパラメータとして受信することができ、この関数は高次関数と呼ばれている.
    1、           
    2、           

    関数をパラメータとして使用します.
    def fun(f):
        return f()
    def hello():
        return "hello world"
    print(fun(hello))
    hello world

    関数を戻り値として使用します.
    def foo():
        def hello():
            return "hello world"
        return hello
    f = foo()
    print(f())
    hello world

    システム内蔵高次関数
    1、map関数:2つのパラメータを受信し、1つは関数で、1つはシーケンスで、mapは入力した関数をシーケンスの各要素に順次作用し、結果を新しいリストとして返す
    def f(x):
        return x**2
    ty = map(f,(1,2,3,4))
    li = list(ty)
    print(ty)
    print(li)
    

    実行結果
    
    [1, 4, 9, 16]
    

    2、reduce関数:1つの関数を1つのシーケンスに作用し、この関数は2つのパラメータを受信しなければならない.reduceは結果とシーケンスの次の要素を蓄積計算する.
    from functools import reduce
    def add(x, y):
        return x + y
    print(reduce(add,range(1,5)))   #   1+2+3+4
    print(reduce(add, range(1, 10)))  ## 4950 ( :1+2+...+9)
    print(reduce(add, range(1, 10), 20))  ## 4970 ( :1+2+...+9+20)

    実行結果:
    10
    45
    65
    

    3、filter関数:1つの関数と1つのシーケンスも受信し、map関数とは異なり、filter関数は入力した関数を各要素に順次作用させ、戻り値がTrueの要素であることを返す.
    例1:
    str = ['a','b','c','d']
    def fun(s):
        if s != 'a':
            return s
    ret = filter(fun,str)
    print(list(ret))
    
    ['b', 'c', 'd']
    

    例2:
    def str(k):
        if k % 2 == 0:
            return True
        else:
            return False
    ret = filter(str,range(1,11))
    print(list(ret))

    印刷結果:
    [2, 4, 6, 8, 10]

     
    参照先:https://www.cnblogs.com/yuanchenqi/articles/5828233.html