Functionオブジェクト、スコープと名前空間

Functionオブジェクト

機能が処理可能なデータとしてファーストクラスのオブジェクト、すなわち関数です。

def func():
    print('from func')


print(func())
from func
None

4つの関数の関数オブジェクト

1.参照

x = 'hello william'
y = x

f = func()
print(f)
from func
None

関数に渡されるパラメータとして2。

z = len(x)


def foo(m):
    m()


foo(func)

3.戻り値の関数として使用することができます

def foo(x):
    return x


res = foo(func)
print(res)
res()

前記要素のタイプは、容器として使用することができます

l = [x]

function_list = [func]
print(function_list[0]())
from func

練習

def pay():
    print('支付1e成功')


def withdraw():
    print('提现2e成功')


dic = {
    '1': pay,
    '2': withdraw
}

while True:
    msg = """
    '1':支付,
    '2':提现,
    '3':退出,
    """

    print(msg)
    choice = input('>>:').strip()
    if choice == '3':
        break
    elif choice in dic:
        dic[choice]()
    '1':支付,
    '2':提现,
    '3':退出,
    
>>:1
支付1e成功

    '1':支付,
    '2':提现,
    '3':退出,
    
>>:2
提现2e成功

    '1':支付,
    '2':提现,
    '3':退出,
    
>>:3

ネストされた関数

ネストされた関数の定義

内部関数定義された関数は、外部関数で定義された関数内で使用することができません。

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


f1()
# f2()   # name 'f2' is not defined
from f2

今、機能によって需要を有する円の面積や周囲長を得るためにパラメータを渡します。これは、ツールボックス内のツールの山に投げ込まれ、その後、ライン上のツールボックスから直接利用できるツールを、取得したいです。

from math import pi


def circle(radius, action='area'):
    def area():
        return pi*(radius**2)

    def perimeter():
        return 2*pi*radius

    if action == 'area':
        return area()
    else:
        return perimeter()


print(f'circle(10):{circle(10)}')
print(f"circle(10,action='perimeter'):{circle(10,action='perimeter')}")
circle(10):314.1592653589793
circle(10,action='perimeter'):62.83185307179586

ネストされた関数の呼び出し

def max2(x, y):
    if x > y:
        return x
    else:
        return y


def max4(a, b, c, d):
    res1 = max2(a, b)
    res2 = max2(res1, c)
    res3 = max2(res2, d)
    return res3


print(max4(2, 3, 4, 1))
4

名前空間とスコープ

関数は、関数内のみの関数呼び出しの内部で、あなたは、私たちがなぜこのような状況を知っている、関数の外で呼び出すことはできません。

名前空間

名前空間(ネームスペース):私たちは、変数を作成することを学んだ前には、実際にメモリに新たなスペースを開いています。しかし、我々は、ストレージ変数名を避け、実際には、そこにメモリ内の変数名と変数のメモリストレージとの間の結合関係の余地があり、この空間は、名前空間と呼ばれています。

ビルトイン名前空間

ビルトイン名前空間:店舗Pythonインタプリタの名前が付いています、などint、float、len

ライフサイクル:インタプリタを有効にするために始めたとき、近いインタプリタで期限切れになります。

グローバル・ネームスペース

グローバル名前空間:ビルトインとローカル名に加えて、残りは、次のコードとして、グローバル名前空間に格納されていますx、func、1、z

ライフサイクル:ファイルが有効に実行された場合、ファイルの実行後に期限切れになります。

x = 1


def func():
    pass


l = [1, 2]

if 3 > 2:
    if 4 > 3:
        z = 3

ローカル名前空間

ローカル名前空間:ファンクション・コールの間に生成記憶する機能本体の名称、例えば次のコードとしてf2

ライフサイクル:ファイルが実行されると、関数呼び出しの際に有効になる機能の実行後に期限切れになります。

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


f1()

ロード順

Pythonインタプリタでの名前空間のロードが完了した後に、それが構築されなければならないので、の.pyファイルは、Pythonインタプリタによって開かれているので、ファイルを開くために始めた、この時間は、グローバルな名前空間を演出しますが、特定の関数がファイルにあり - >グローバル - >ローカル建て:呼び出されたときに、それがロード順序のローカル名前空間、名前空間を生成するために開始されます。

順序を探します

名前空間は、変数名と値の間の結合関係を格納するために使用されているので、あなたが名前を見つけたい時はいつでも、それは3のいずれかに見つけなければならないとして、次の順序を探します。

ローカル--->グローバル--->建て:現在の場所は、ローカル名前空間、検索順序にある​​場合に現在の場所、場所を検索します。

x = 1
y = 2
len = 100


def func():
    y = 3
    len = 1000
    print(f'y:{y}')
    print(f'len:{len}')
    # print(a)  # NameError: name 'a' is not defined


func()
y:3
len:1000
x = 1


def func():
    print(x)


x = 10
func()
10

スコープ

ドメインは、すなわち作用領域範囲領域を指します。

グローバルスコープ

グローバルスコープ:グローバル・効果的な、世界的な生存、組み込みの名前空間とグローバル名前空間を含みます。

# 全局作用域
x = 1


def bar():
    print(x)


bar()
1

ローカルスコープ

ローカルスコープ:部分的に有効な、一時的な記憶、唯一のローカルな名前空間を含みます。

# 局部作用域
def f1():
    def f2():
        def f3():
            print(x)
        x = 2
        f3()
    x = 3
    f2()


f1()
2

注意点

なお:関数定義ステージ固定金型との間の関係の範囲に関係なく、関数の呼ばれました。

# 作用域注意点
x = 1


def f1():  # 定义阶段 x = 1
    print(x)


def f2():
    x = 2
    f1()


f2()
1

アプリケーション機能オブジェクトのスコープ+

# 作用域应用
def f1():
    def inner():
        print('from inner')
    return inner


f = f1()  # 把局部定义的函数放在全局之中


def bar():
    f()


bar()
from inner

補足知識

グローバルキーワード

グローバルスコープ内の変数を変更します。

x = 1


def f1():
    x = 2

    def f2():
        global x  # 修改全局变量
        x = 3
    f2()


f1()
print(x)
3

ローカル以外のキーワード

変数にローカルスコープを変更します。

x = 1


def f1():
    x = 2

    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)


f1()
3

注意点

  1. ローカルはグローバル変数の型を変更するには、任意の文を直接変更することができます必要はありません。
  2. あなたは、グローバルステートメントを使用する必要性をグローバル変更したい場合は、グローバル変数を直接変更することができるよう地元の不変のタイプでは、宣言しました。
lis = []


def f1():
    lis.append(1)


print(f"调用函数前:{lis}")
f1()
print(f'调动函数后:{lis}')
调用函数前:[]
调动函数后:[1]

おすすめ

転載: www.cnblogs.com/WilliamKong94/p/10961925.html
おすすめ