可変長パラメータ、関数オブジェクト、ネストされた名前空間と範囲

さあ、来る、それは本当に来て、スーパー台風Lekimaは夕方に、来たTucao、人々は厄介です、外の風と雨に食べて、おいしい夕食を食べていない、またはそれを学ぶされます!

可変長パラメータ、関数オブジェクト、ネストされた名前空間と範囲

可変長パラメータ

1.1の可変長パラメータ*

*受信*、パラメータにコピータプルとして格納された引数でオーバーフロー位置、、、パラメータ名*固定引数

def sum_self(*args):   # 用*接收位置实参1,2,3,4,存储为元组(1,2,3,4),赋值给args
    res=0
    for num in args:
        res+=num
    return res
res = sum_self(1,2,3,4)
print(res)     # 10

1.2の可変長引数*

引数は* *パラメータ値は、位置引数に分け、サイクル後に削除されます

def func(x,y,z,*args):
    print(x,y,z,args)

func(1,*(1,2),3,4)   #  *循环取出(1,2),打散成位置实参,这样位置实参就变成1,1,2,3,4,\
#  形参x,y,z对应的实参就为1,1,2,形参中用*args接收溢出的位置实参3,4,存储为元组(3,4)

1.3の可変長パラメータ**

パラメータ辞書形、に割り当てられ、その後、辞書スピルオーバー-すべてのキー引数、その後、保存のパラメータを。なお:大会後のパラメータ名がkwargsからです**

def func(**kwargs):
    print(kwargs)
func(a=5,b=6)      # 形参中的**接收溢出的两个关键字实参,存储为字典{'a':5,'b':6},并赋值给kwargs

1.4の可変長引数**

引数は**、**サイクルパラメータの値は、キーワード引数に分け、**後に削除されます。**、それはキーの引数である時はいつでもとの接触では、引数の後、すぐに見にキーワード引数に分割する必要があります

ef func(x,y,z,**kwargs):
    print(x,y,z,kwargs)     #  1 3 4 {'a': 1, 'b': 2}
func(1,3,4,**{'a':1,'b':2})

第二に、関数オブジェクト

  • 関数を定義する:関数はファーストクラスのオブジェクトであり、すなわち、データ処理関数として使用することができます
# 把函数当做对象来用
def func():
    print('from func')

print(func)   # 这里函数func就可以当做数据来print,直接print(函数名),会输出函数的内存地址,<function func at 0x000001EBDC641E18>
  • すなわち、同じ関数名を持つ変数名従来の方法、変数名と同じ関数名は、コンテナクラスのデータ要素タイプとして、関数の戻り値として、関数の引数として、参照するために使用することができます
  • 上記で定義された関数funcには、例えば、我々は次の4つの機能があります。

2.1、参照

a = 1
print(a)  # 变量名

b = a  # b =1
# 变量名可以被引用,函数名也可以被引用

f = func  # func可以加()调用,那么f也可以加()调用
print(f)    # 打印func内存地址,<function func at 0x000001EBDC641E18>
f()  # 相当于func() ,打印结果为from func

2.2、引数が仮パラメータパラメータパラメータに渡されます

def f2(name):  # name = func
    name()  # func()   

f2(func)     # 这整个函数就能实现函数func()的调用,输出结果为from func

2.3、データコンテナの要素型として使用することができます

lt = [1, 2, a, func]
lt[-1]()   # 直接实现func调用功能,最后输出结果from func

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

def f3(name):  # name = func
    return name  # name = func

res = f3(func)  # res = func
print(res)    # 打印func的内存地址,<function func at 0x000001EBDC641E18>
res()     # 调用函数func(),打印结果为from func

第三に、ネストされた関数

3.1ネストされた定義機能

  • 内部関数定義された関数は、外部関数で定義された関数内で使用することができません
def f1():
    def f2():
        print('from f2')
    f2()

f2()  # NameError: name 'f2' is not defined,在函数外部就不能使用内部函数f2
  • 正しい入れ子の定義

    def f1():
        def f2():
            print('from f2')
        f2()
    f1()
  • 円形の面積や周囲を通過する関数のパラメータ

from math import pi

def circle(radius, action='area'):   # radius为半径
    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')}")

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

def self_max(x,y):
    if x>y:
        return x
    return y
def self_4_max(x,y,z,a):
    res1=self_max(x,y)     # 在这个函数内调用上面的函数
    res2=self_max(z,a)
    res=self_max(res1,res2)
    return res
res=self_4_max(10,40,20,80)
print(res)             # 80

第四に、名前空間とスコープ

4.1名前空間

変数名や関数名を格納するために使用される名前空間

4.1.1組み込みの名前空間

  • Pythonインタプリタは名前が付属して、ストレージPythonインタプリタなど、ユニークですint、float、len

  • 関数呼び出しは、定義する必要が定義されていない。説明を停止した後、内蔵これらの組み込みのpythonの名前、Pythonインタプリタのためのスペースを開くためのpythonを破壊する際にPythonインタプリタが自動的に起動します

  • インタプリタを有効にするために開始するとインタプリタが閉じているときに、失敗

    len([1, 2, 3])
    int('10')

グローバル名前空間を4.1.2

  • グローバル名前空間:ビルトインとローカル名に加えて、残りは、次のコードとして、グローバル名前空間に格納されていますx、func、l、z
  • グローバルは、独自の定義を必要とするPythonのファイルが実行された後、ファイルの末尾が破壊された後、それは、グローバルネームスペースを有していても良いです
x = 1   #  全局名称空间

def func():
    pass

l = [1, 2]    # 内置名称空间
if 3 > 2:
    if 4 > 3:
        z = 3

4.1.3ローカル名前空間

  • ローカル名前空間:変数と関数名の関数定義では、ローカルの名前空間に格納されています
  • 現地では、関数の呼び出し後に有効にする必要があり、通話が終了後に破棄されます、独自の定義を必要とします
def f1():
    def f2():    # f2为局部名称空间
        print('from f2')
    f2()

f1()

4.1.4 3種類の名前空間の実行順序

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

4.1.5 3種類の名前空間の検索順序

名前空間は、変数名と値の間の結合関係を格納するために使用されているので、あなたが名前を見つけたい時はいつでも、次の順序を探し、3の1に記載されていなければなりませんよう:
現在の場所ならば、現在の場所から見始めますローカル名前空間==ための場所検索順序は次のとおりです。ローカル- 「世界- 」建て ==。

x = 1
y = 2
len = 100  # 为内置名称空间

def func():
    y = 3
    len = 1000    
    print(f"y: {y}")     # 先在局部内找到y,所以y=3,输出为3
    print(f"len: {len}")   # 先局部内找到len,就不需要再到全局和内置找,因此输出为1000
    # print(a)  # NameError: name 'a' is not defined ,从当前位置到局部再到全局再到内置都没有找到a,所以报错

func()

46A ????ć§℃、©ºé?? ??'Aä½??ç?? A ????  - 。?C®??å???? PNG X-OSSプロセス=スタイル/透かし

4.2適用範囲

4.2.1グローバルスコープ

グローバルスコープ:グローバル・効果的な、世界的な生存、および組み込みのグローバル名前空間変数、グローバルスコープ内の変数は、大きな画像でのみを使用することができます

# 全局作用域
x = 1

def bar():
    print(x)

bar()

4.2.2ローカルスコープ

ローカルスコープ:ローカル名前空間変数はローカルでのみ使用することができ、地元の効果的な、一時的な記憶は、唯一のローカル名スペースが含まれています、

# 局部作用域
x = 1
def f1():
   
    print(x)  # f1中的局部
f1()
def f2():
    x = 2  # x=2只能在f2中使用
    f1()

f2()  # f1中的局部和f2中的局部互不干涉 
# 最终输出结果为1

4.2.3 注意点

==関数内のスコープ定義の位相関係は、死ん同定されているにかかわらず、呼び出し元の関数の==

# 作用域注意点
x = 1

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

def f2():
    x = 2
    f1()

f2()

出力は1であります

lt = [1,2,3]  # 作用域关系仅适用不可变数据类型,不适用于可变数据类型

def f1():
   lt.append(4)

f1()

print(lt)    # [1,2,3,4]

4.2.4アプリケーションスコープと関数オブジェクト

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

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

def bar():
    f()   # 起到调用函数f1的作用

bar()
-------------------------------------------------------------------------------
输出结果为from inner

4.3補足知識

4.3.1グローバルキーワード

修正変数グローバルスコープ

x = 1

def f1():
    x = 2

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

f1()
print(x)
---------------------------------------------------------------------------------

输出为1
x = 1

def f1():
    x = 2

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

f1()
print(x)
---------------------------------------------------------------------------------
输出为3

4.3.2非ローカルキーワード

変更した変数ローカルスコープ

x = 1

def f1():
    x = 2

    def f2():
        #         nonlocal x
        x = 3

    f2()
    print(x)

f1()

2

x = 1

def f1():
    x = 2

    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)

f1()

3

4.3.3 注意点

  1. ローカルはグローバル変数の型を変更するには、任意の文を直接変更することができます必要はありません。

  2. あなたは、グローバルステートメントを使用する必要性をグローバル変更したい場合は、グローバル変数を直接変更することができるよう地元の不変のタイプでは、宣言しました。

    lis = []
    
    
    def f1():
        lis.append(1)
    
    
    print(f"调用函数前: {lis}")
    f1()
    print(f"调用函数后: {lis}")

    関数を呼び出す前:[]
    関数を呼び出した後:[1]

おすすめ

転載: www.cnblogs.com/zhuangyl23/p/11329829.html