Python関数パラメータ


簡単に述べる
Pythonでは、関数の定義が非常に簡単で、対応する構文フォーマットの要求を満たすことができます.呼び出し者にとって、正しいパラメータの伝達方法に注目し、対応する戻り値を取得するだけで十分です.関数の内部実装を理解する必要はありません(ソースコードを学習し、追跡しない限り).
とはいえ,関数の定義には柔軟性が非常に高い.通常定義されている必須パラメータに加えて、デフォルトパラメータ、可変パラメータ、キーワードパラメータもサポートされています.これにより,複雑なパラメータを処理できるだけでなく,呼び出し者のコードを簡略化することができる.
  • 概要
  • 形パラメータと実パラメータ
  • 定数パラメータの関数
  • デフォルトパラメータ
  • キーワードパラメータ
  • 可変パラメータ
  • 任意キーワードパラメータ
  • パラメータをデパッケージ
  • 一去丶二三里,转载请注明出典:http://blog.csdn.net/liang19890820
    パラメータと実パラメータ
    Pythonだけでなく、ほとんどのプログラミング言語にはparameterとargumentの2つの用語が含まれています.では、それらの間にはいったいどんな違いがあるのでしょうか.
  • parameterは関数定義のパラメータを指し、argumentは関数呼び出し時の実際のパラメータを指す.
  • 簡単な説明:parameter=パラメータ、argument=実パラメータ.

  • たとえば、単純な関数を定義します.
    >>> def greet(param1, param2):
    ...     pass
    ... 
    >>> 
    >>> greet('Hello', 'Python')

    ここで、param 1およびparam 2は関数のパラメータであり、関数greet()が呼び出されると、入力される('Hello'および'Python')は実パラメータである.
    定数パラメータの関数
    これまで,関数については固定数のパラメータを紹介してきた.簡単な例を見てみましょう.
    >>> def greet(say, msg):
    ...     print(say, msg)
    ... 
    >>> 
    >>> greet('Hello', 'Python')
    Hello Python

    ここで、関数greet()には2つのパラメータがあり、2つのパラメータでこの関数を呼び出すと、スムーズに動作し、エラーはありません.
    パラメータの個数が一致しない場合、何が起こりますか?
    >>> greet()  #     
    ...
    TypeError: greet() missing 2 required positional arguments: 'say' and 'msg'
    >>> 
    >>> greet('Hi')  #       
    ...
    TypeError: greet() missing 1 required positional argument: 'msg'

    明らかに、解釈器は愚痴をこぼす.しかし、Pythonにとって、この問題を解決するのはまるで手のひらを返すように簡単で、下を見続けます!
    既定のパラメータ
    関数を定義するときに、パラメータにデフォルト値を指定するには、付与演算子(=)を使用します.
    注:パラメータにデフォルト値がない場合は、呼び出し時に値を指定する必要があります.パラメータにデフォルト値がある場合は、呼び出し時に値はオプションで、値が指定されている場合はデフォルト値が上書きされます.
    >>> def greet(say, name = 'James', msg = 'I am your biggest fan!'):
    ...     print(say, ',', name, ',', msg)
    ... 
    >>> greet('Hi')  #          
    Hi , James , I am your biggest fan!
    >>> 
    >>> greet('Hi', 'Kobe')  #         
    Hi , Kobe , I am your biggest fan!
    >>> 
    >>> greet('Hi', 'Kobe', 'I want to challenge you!')  #       
    Hi , Kobe , I want to challenge you!

    sayにはデフォルト値がないため、指定する必要があります.name、msgにはデフォルト値があるので、値はオプションです.
    関数内のすべてのパラメータにはデフォルト値がありますが、デフォルトパラメータが存在する場合は、右側のすべてのパラメータにもデフォルト値が必要です.すなわち、非デフォルトパラメータは、デフォルトパラメータの後にはできません.
    たとえば、上記の関数を次のように定義します.
    def greet(name = 'James', say):

    エラーが発生します.
    SyntaxError: non-default argument follows default argument
    キーワードパラメータ
    いくつかの値を使用して関数を呼び出すと、これらの値はその位置に基づいてパラメータに割り当てられます.
    例えば、上記関数greet()では、greet('Hi', 'Kobe')を用いて呼び出されると、'Hi'がパラメータsayに割り当てられ、同様に'Kobe'がnameに割り当てられる.
    Pythonでは、kwarg = value形式のキーワードパラメータを使用して関数を呼び出すことができます.
    >>> def greet(say, name = 'James'):
    ...     print(say, ',', name)
    ... 
    >>> 
    >>> greet(say = 'Hi', name = 'Kobe')  # 2       
    Hi , Kobe
    >>> 
    >>> greet(name = 'Kobe', say = 'Hi')  # 2       (    )
    Hi , Kobe
    >>> 
    >>> greet('Hi', name = 'Kobe')  #               
    Hi , Kobe

    このように関数を呼び出す場合、キーワードパラメータは位置パラメータの後に、伝達されたすべてのキーワードパラメータが関数が受け入れるパラメータと一致しなければならず、それらの順序は重要ではありません.
    たとえば、次のように呼び出すと、エラーが発生します.
    >>> greet(name = 'Kobe', 'Hi')  #             
    ...
    SyntaxError: positional argument follows keyword argument
    >>>
    >>> greet('Hi', na = 'Kobe')  # na    
    ...
    TypeError: greet() got an unexpected keyword argument 'na'

    可変パラメータ
    可変パラメータは不定長パラメータとも呼ばれ、その名の通り、伝達されるパラメータの個数は可変であり、任意の(0、1、2...N)であってもよい.
    可変パラメータを定義するには、パラメータ名の前にアスタリスク(*)を追加します.関数内部では,これらのパラメータをtupleとしてパッケージした.
    注意:この*は彼*ではなく、C/C++のポインタと勘違いしないでください.
    >>> def greet(*names):
    ...     print(names)
    ... 
    >>> 
    >>> greet()  #     ,     
    ()
    >>>
    >>> greet('Jordan', 'James', 'Kobe')
    ('Jordan', 'James', 'Kobe')

    場合によっては、関数定義で位置パラメータおよび可変パラメータを使用する必要がありますが、位置パラメータは常に可変パラメータの前に使用する必要があります.
    >>> def greet(say, *names):
    ...     print(say, names)
    ... 
    >>> 
    >>> greet('Hi')
    Hi ()
    >>> 
    >>> greet('Hi', 'Jordan', 'James', 'Kobe')
    Hi ('Jordan', 'James', 'Kobe')

    通常、変数パラメータは、関数に渡される残りの入力パラメータをすべて収集するため、パラメータリストの最後に表示されます.可変パラメータの後に表示されるパラメータはすべて「キーワードの強制」パラメータです.これは、位置パラメータではなくキーワードパラメータとしてのみ使用できることを意味します.
    >>> def greet(*names, sep = ','):
    ...     return sep.join(names)
    ... 
    >>> 
    >>> greet('Jordan', 'James', 'Kobe')
    'Jordan,James,Kobe'
    >>> 
    >>> greet('Jordan', 'James', 'Kobe', sep = '/')  #         
    'Jordan/James/Kobe'
    >>>
    >>> greet('Jordan', 'James', 'Kobe', '/')  #        
    'Jordan,James,Kobe,/'

    任意のキーワードパラメータ
    任意の数のキーワードパラメータに使用するメカニズムもあります.これを行うには、双星号(**)を使用します.
    >>> def greet(**all_star):
    ...     print(all_star)
    ... 
    >>> greet()  #     ,     
    {}
    >>> 
    >>> greet(name = 'James', age = 18)
    {'name': 'James', 'age': 18}

    最後の形式が**msgsのパラメータが表示されると、パラメータに対応するキーワードパラメータ以外のすべてのキーワードパラメータを含む辞書が受信されます.*namesのパラメータと組み合わせることもできる(*names**msgsの前に現れる必要がある).
    たとえば、次のような関数を定義します.
    >>> def greet(say, *names, **msgs):
    ...     print('--', say)
    ...     for name in names:
    ...         print(name)
    ...     print('-' * 40)
    ...     keys = sorted(msgs.keys())
    ...     for key in keys:
    ...         print(key, ':', msgs[key])
    ... 
    >>> 
    >>> greet('Hi', 'Jordan', 'James', 'Kobe', msg = 'I want to challenge you!', challenger = 'Waleon')
    -- Hi
    Jordan
    James
    Kobe
    ----------------------------------------
    challenger : Waleon
    msg : I want to challenge you!

    注:コンテンツを印刷する前に、msgs辞書のkeys()メソッドの結果をソートしてキーワードパラメータ名リストを作成します.そうでない場合、印刷パラメータの順序は定義されていません.
    パラメータのパッケージ解除
    「可変パラメータ」のように、*オペレータを関数呼び出しに使用することもできます.ただし、この場合、パラメータは、関数定義における*の意味とは逆に、パッケージ化ではなくパケット化される.
    >>> def greet(name, age):
    ...     print(name, age)
    ... 
    >>> 
    >>> t = ('James', 18)
    >>> greet(*t)
    James 18

    もう一つの方法は、ほとんど言及する必要はありません.ここでもくどくど言います.
    >>> greet(t[0], t[1])
    James 18

    この呼び出し方式は、パケットを解くよりも明らかに不快である.また、一般的には、長さが未知であるため、呼び出しgreet(t[0], t[1])はほとんど無駄である.「不明」とは、スクリプトの作成時に知るのではなく、実行時にのみ長さがわかります.
    同様に、辞書は**オペレータでキーワードパラメータを渡すこともできる.
    >>> def greet(name, age = 18):
    ...     print(name, age)
    ... 
    >>> 
    >>> d = {'name':'James', 'age':32}
    >>> greet(**d)
    James 32