ブログの仕上げday11

仕上げ知識のpython 11日

可変長パラメータ

*の可変長パラメータ

#形参中的\*会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给\*后的参数。
#需要注意的是:\*后的参数名约定俗成为args。
def sum_self(*args):
    res = 0
    for num in args:
        res += num
    return res


res = sum_self(1, 2, 3, 4)
print(res)

*の可変長引数

#实参中的*,*会将*后参数的值循环取出,打散成位置实参。
#以后但凡碰到实参中带*的,它就是位置实参,应该马上打散成位置实参去看。
def func(x, y, z, *args):
    print(x, y, z, args)


func(1, *(1, 2), 3, 4)

可変長パラメータ**

#形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的参数。
#需要注意的是:**后的参数名约定俗成为kwargs。
def func(**kwargw):
    print(kwargw)

func(a=5)

可変長引数**

#实参中的**,**会将**后参数的值循环取出,打散成关键字实参。
#以后但凡碰到实参中带**的,它就是关键字实参,应该马上打散成关键字实参去看。
def func(x, y, z, **kwargs):
    print(x, y, z, kwargs)

func(1, 3, 4, **{'a': 1, 'b': 2})

可変長パラメータが適用されます

def index(name, age, sex):
    print(f"name: {name}, age: {age}, sex: {sex}")

def wrapper(*args, **kwargs):
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")
    index(*args, **kwargs)


wrapper(name='simple', sex='male', age=19)

名前付きパラメータのキーワード

def register(x, y, **kwargs):
    if 'name' not in kwargs or 'age' not in kwargs:
        print('用户名和年龄必须使用关键字的形式传值')
        return
    print(kwargs['name'])
    print(kwargs['age'])

register(1, 2, name='simple', age=19)

パラメータは、* keyパラメータにちなんで命名され、関数定義の段階:キーワードパラメータに名前を付けます。

特徴:パス値ではキー=値方式とキーの値に応じて渡す必要がありますが、パラメータ名を指定したキーワード引数を名前を付ける必要があります。

def register(x, y, *, name, gender='male', age):
    print(x)
    print(age)

register(1, 2, x='simple', age=19)  # TypeError: register() got multiple values for argument 'x'

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

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

  1. 引用文

    x = 'hello nick'
    y = x
    
    f = func
    print(f)
  2. 関数の引数として

    len(x)
    
    def foo(m):
        m()
    
    foo(func)
  3. これは、関数の戻り値として使用することができます

    def foo(x):
        return x
    
    res = foo(func)
    print(res)
    res()
  4. 要素は、コンテナタイプであってもよいです

    l = [x]
    
    function_list = [func]
    function_list[0]()

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

ネストされた関数の定義

#函数内部定义的函数,无法在函数外部使用内部定义的函数。
def f1():
    def f2():
        print('from f2')
    f2()


f2()  # NameError: name 'f2' is not defined

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

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(1, 2, 3, 4))

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

名前空間

ビルトイン名前空間

ビルトイン名前空間:ストアPyhtonインタプリタ名が付いています、などint、float、len

ライフサイクル:インタプリタを有効にするために始めたとき、インタプリタが閉じているときに、失敗

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

グローバル名前空間:ビルトインとローカル名に加えて、残りは、次のコードとして、グローバル名前空間に格納されていますx、func、l、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の1に記載されていなければなりませんよう:
現在の場所ならば、現在の場所から見始めます場所は、次の順序を探し、ローカルのネームスペースです:ローカル- 「世界- 」に構築します。

スコープ

グローバルスコープ

グローバルスコープ:グローバル・効果的な、世界的な生存、および組み込みの名前空間のグローバルネームスペース。

# 全局作用域
x = 1

def bar():
    print(x)

bar()

ローカルスコープ

ローカルスコープ:ローカル小さな、一時保管、唯一のローカルな名前空間を含みます。

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

f1()

注意点

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

# 作用域注意点
x = 1

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

def f2():
    x = 2
    f1()

f2()

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

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

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

def bar():
    f()

bar()

追加の知識

グローバルキーワード

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

x = 1

def f1():
    x = 2

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

f1()
print(x)

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

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

x = 1

def f1():
    x = 2

    def f2():
        #         nonlocal x
        x = 3

    f2()
    print(x)

f1()

注意点

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

def f1():
    lis.append(1)

print(f"调用函数前: {lis}")
f1()
print(f"调用函数后: {lis}")

おすすめ

転載: www.cnblogs.com/samoo/p/11566789.html