Pythonの関数パラメータタイプ

5864 ワード

技術交流QQ群:1027579432、あなたの参加を歓迎します!
  • 1.パラメータ命名規則の経験:ほとんどの関数は一定数のパラメータを受信し、実際の呼び出し時に提供されるパラメータの値に応じて異なる結果を出力します.前に述べたように,関数内部のパラメータ名を外部変数の名前と同じように定義するのはよくない習慣であり,思考を混同しやすく,誤りさえ生じる.
  • 2.位置パラメータ(必須パラメータ/位置パラメータ)
  • は、関数を呼び出すときに明確に提供されるパラメータを必要とします.位置パラメータは前後順に、一つ一つ対応しなければなりません.個数は多くありません.
    x, y, z = 1, 2, 3
    
    def add(a, b, c):
    
        return a+b+c
    
    add(x, y, x)        #     ,    
    add(4, 5, 6)        #           
    
  • 上記の例のa,b,cは位置パラメータであり、add(4,5,6)呼び出しを使用すると、4をa,5をb,6をcに伝える一対一対応伝達である.add(4,5,6,7)、add(4)、add(5,4,6)のような「蛇を描いて足を添える」、「腕が欠けて足が少ない」、「嫁入り間違い」のような呼び出しは間違っている.ここでadd(5,4,6)の呼び出しは構文的には問題ありませんが、出力結果は予想と一致しない可能性があります.注意:Pythonは関数パラメータを渡すときにデータ型を検査しません.理論的にはどんなタイプを伝えてもいいです.

  • 3.既定のパラメータ
  • 関数定義時に、あるパラメータにデフォルト値を指定すると、このパラメータはデフォルトパラメータとなり、位置パラメータではありません.関数を呼び出すときに、デフォルトパラメータにカスタム値を渡すか、デフォルト値を使用します.
    def power(x, n = 2):
        return x**n
    
    ret1 = power(10)   #         n=2
    ret2 = power(10, 4)  #  4  n,    10**4  
    
  • の上記の例のnはデフォルトパラメータである.デフォルトのパラメータは、関数の呼び出しを簡略化し、最も一般的な場合に簡単な呼び出しを提供すると同時に、特別な場合に新しい値を渡すことができます.ただし、デフォルトのパラメータを設定する場合は、次の点に注意してください.
  • デフォルトパラメータは位置パラメータの後ろにある必要があります!
  • 複数のデフォルトパラメータがある場合、通常はより一般的に前に配置され、変化の少ない後に配置されます.
  • 関数を呼び出すときは、できるだけ実際のパラメータにデフォルトのパラメータ名を指定します.
  • パラメータ名を使用してパラメータを渡す
  • 通常、関数を呼び出すとき、位置パラメータは順番に前後して入力され、デフォルトのパラメータの前にある必要があります.ただし、位置パラメータが渡されるときに、実パラメータに位置パラメータのパラメータ名を指定すると、位置パラメータは、例えば、
        def student(name, age, classroom, tel, address="..."):
            pass
        
        student(classroom=101, name="Jack", tel=66666666, age=20)
    
  • のように順次呼び出されなくてもよい.
  • デフォルトパラメータは、できるだけ変わらないオブジェクトを指します!
    def func(a=[]):
    a.append("A")
    return a
    
    print(func())
    print(func())
    print(func())
    #     :
    ['A']
    ['A', 'A']
    ['A', 'A', 'A']
    
  • 原因分析:Python関数体がメモリに読み込まれると、デフォルトパラメータaが指す空のリストオブジェクトが作成され、メモリに格納されるからです.デフォルトパラメータa自体も変数であるため、オブジェクト[]へのアドレスが保存される.この関数を呼び出すたびに、aが指すリストにAを追加します.aは変わらず、常にリストへのアドレスを保存し、リスト内のデータに変わります!解決策は、デフォルト値として可変のデータ型を使用します.デフォルトパラメータaは、None、数値、文字列などの可変オブジェクトに設定されます.関数の内部では、空のリストなどの可変タイプに変換します.これで何度呼び出しても実行結果は['A']になります.
    def func(a=None):
        #      if  
        if a is None:
            a = []
        a.append("A")
        return a
    
    print(func())
    print(func())
    print(func())
    



  • 4.ダイナミックパラメータ
  • 動的パラメータは、入力されたパラメータの個数が動的であり、1個、2個から任意個であってもよく、0個であってもよい.不要な場合は、動的関数を完全に無視して、値を渡す必要はありません.
  • Pythonのダイナミックパラメータには、*argsと*kwargsの2種類があります.この中の鍵は、argsとkwargsの名前の違いではなく、2つの星番号の違いです.実際には*anyや*whateverの方法を使用することができます.しかしselfのように、デフォルトでは*argsと*kwargsが使用されます.
  • 注意:ダイナミックパラメータは、すべての位置パラメータとデフォルトパラメータの後ろに置く必要があります.
    def func(name, age, sex='male', *args, **kwargs):
    pass
    
  • 4.1 *args
  • アスタリスクは、任意のパラメータを受信することを示す.呼び出すと、実際のパラメータはメタグループの入力形式パラメータにパッケージされます.パラメータがリストの場合、リスト全体がパラメータとして入力されます.例:
    def func(*args):
        for arg in args:
            print(arg)
    
    func('a', 'b', 'c')
    
    li = [1, 2, 3]
    func(li)
    
  • はargsを循環することによって,伝達された各パラメータを得ることができる.しかしliというリストは,内部の1,2,3をそれぞれパラメータとして渡すことを意図しているが,実際にはリスト自体が全体として渡されている.どうしようかな?アスタリスクを使用!関数を呼び出し、実パラメータを渡すと、リストの前にアスタリスクを追加すると目的を達成できます.実際には、リストだけでなく、文字列やメタグループなどのシーケンスタイプのデータオブジェクトも、内部要素をパラメータとして関数に渡すことができます.辞書は、すべてのkeyを逐一伝えます.
    def func(*args):
        for arg in args:
            print(arg)
    
    li = [1, 2, 3]
    func(*li)
    

  • 4.2 **kwargs
  • の2つの星は、キー値ペアを受け入れる動的パラメータを表し、数は任意です.呼び出すと実際のパラメータが辞書にパッケージされます.例:
    def func(**kwargs):
        for kwg in kwargs:
            print(kwg, kwargs[kwg])
            print(type(kwg))
    
    func(k1='v1', k2=[0, 1, 2])
    
  • で辞書dicを渡したら?辞書内のキー値ペアが上のように逐一伝わることを望んでいます.2つのアスタリスクを使用!
    def func(**kwargs):
        for kwg in kwargs:
            print(kwg, kwargs[kwg])
    
    dic = {
        'k1': 'v1',
        'k2': 'v2'
    }
    
    func(**dic)
    

  • 4.3「万能」パラメータ
  • *argsと*kwargsを組み合わせて使用すると、理論的には任意の形式と任意の数のパラメータを受け入れることができ、多くのコードでこの定義方法を見ることができます.*argsは*kwargsの前に表示されなければならないことに注意してください.
    def func(*args, **kwargs):
    
        for arg in args:
            print(arg)
    
        for kwg in kwargs:
            print(kwg, kwargs[kwg])
    
    
    lis = [1, 2, 3]
    dic = {
        'k1': 'v1',
        'k2': 'v2'
    }
    
    func(*lis, **dic)
    

  • 4.4キーワードパラメータ
  • *argsパラメータおよび*kwargsパラメータについて、関数の呼び出し元は、制限されない任意のパラメータを入力することができる.例えば、
    def func(*args):
        pass
    
    func("haha", 1, [], {})
    func(1,2,3,4,5,6)
    
  • このようなパラメータ伝達方式については,柔軟性は大きいがリスクも大きく,制御性が悪く,自分でパラメータをフィルタリングし判定しなければならない.例えば、次は名前、年齢、性別だけがほしいので、自分でコードチェックを書きます.
    def student(name, age, **kwargs):
        if 'sex' in kwargs:
            student_sex = kwargs['sex']
    
  • しかし、実際には、student(「jack」,18,xxx='male」)などの関数を任意に呼び出すことができ、エラーは発生しません.実際にはstudent(「jack」,18,sex='male')のような呼び出しが望ましい.では、このような考えをどのように実現するのでしょうか.キーワードパラメータを使用できます!キーワードパラメータの前には特殊な区切り記号*が必要です.*位置パラメータとデフォルトパラメータを区切ります.*後のパラメータはキーワードパラメータとみなされます.関数呼び出しでは、キーパラメータがパラメータ名に入力される必要があります.これは、位置パラメータとは異なります.パラメータ名が入力されていない場合、呼び出しはエラーを報告します.デフォルトパラメータとは異なり、キーワードパラメータは渡さなければなりませんが、キーワードパラメータにはデフォルト値がある場合もあります.この場合、渡さずに呼び出しを簡略化できます.
    def student(name, age, *, sex):
        pass
    
    student(name="jack", age=18, sex='male')
    
  • 関数定義に*argsパラメータがすでに存在する場合、後に続く名前付きキーワードパラメータには特別な区切り記号*は必要ありません.
    def student(name, age=10, *args, sex, classroom, **kwargs):
        pass
    
    student(name="jack", age=18, sex='male', classroom="202", k1="v1")
    


  • 5.ブログ
  • ブログ原文