python関数のデフォルトパラメータ、可変パラメータ、キーワードパラメータについて


python関数を呼び出すときに、デフォルトのパラメータを使用します.注意すべき点は、次のとおりです.
定義された関数は次のとおりです.
    def enroll(name, gender, age=6, city='shanghai'):
複数のデフォルトパラメータがある場合、呼び出すときに、enroll('Bob','M',7)を呼び出すなどのデフォルトパラメータを順番に提供することもできます.これは、name、genderの2つのパラメータを除いて、最後の1つのパラメータがパラメータageに適用されることを意味します.cityパラメータは提供されていないため、デフォルト値が使用されます.
デフォルトのパラメータの一部を順番に指定しないこともできます.一部のデフォルトパラメータを順番に指定しない場合は、パラメータ名を書き込む必要があります.たとえばenroll('Adam','M',city='Tianjin')を呼び出すと、cityパラメータは転送された値で、他のデフォルトパラメータはデフォルト値を使用し続けます.
Python関数が定義されると、デフォルトパラメータLの値が算出されます.すなわち[]、デフォルトパラメータLも変数であるため、対象を指す[]、その関数を呼び出すたびにLの内容が変更されると、次回呼び出されると、デフォルトパラメータの内容が変わります.もはや関数定義時の[]ではありません.
したがって、デフォルトパラメータを定義するには、デフォルトパラメータが不変のオブジェクトを指す必要があります.
なぜ設計strNoneという不変の対象となるのでしょうか?不変オブジェクトが作成されると、オブジェクト内部のデータは変更できないため、データの変更によるエラーが減少します.また、オブジェクトが変わらないため、マルチタスク環境で同時にオブジェクトを読み取るにはロックをかける必要はなく、同時に読むのに問題はありません.プログラムを作成するときに、不変オブジェクトを設計できれば、できるだけ不変オブジェクトに設計します.
関数のパラメータを可変パラメータに変更します.
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n    
    return sum
可変パラメータを定義するのはlistまたはtupleパラメータを定義するのと比較して、パラメータの前に*番号を1つ追加しただけです.関数内部ではパラメータnumberstupleを受信しているため、関数コードは全く変わらない.ただし、この関数を呼び出すと、0個のパラメータを含む任意のパラメータを入力できます.
>>> calc(1, 2)
5

>>> calc()
0
Pythonではlistまたはtupleの前に*号を付けてlistまたはtupleの要素を可変パラメータにして渡すことができます
nums = [1, 2, 3]
calc(*nums)
キーワードパラメータ
可変パラメータを使用すると、0つまたは任意のパラメータを入力できます.これらの可変パラメータは、関数呼び出し時に自動的にtupleに組み込まれます.キーワードパラメータを使用すると、0つまたは任意のパラメータ名を含むパラメータを入力できます.これらのキーワードパラメータは、関数内で自動的にdictに組み立てられます.
def person(name, age, **kw):
    print("name:", name, "age:", age, "other:", kw)
person("zhangsan", 15, city='shanghai')
name:zhangsan age: 15 other: {'city': 'shanghai'}
person("zhangsan", 15, gender='F', city='shanghai')
name:zhangsan age: 15 other: {'gender': 'F','city': 'shanghai'}
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
キーワードパラメータの命名
def person(name, age, *, city, job):
    print(name, age, city, job)
キーワードパラメータ**kwとは異なり、ネーミングキーワードパラメータには特殊区切り記号**以降のパラメータがネーミングキーワードパラメータとして扱われる.
名前付きキーワードパラメータは、位置パラメータとは異なり、パラメータ名を入力する必要があります.
名前付きキーワードパラメータを使用する場合は、特に注意してください.*パラメータではなく、特殊区切り記号です.不足している場合*Pythonインタプリタは、位置パラメータと名前付きキーワードパラメータを認識できません.