Python関数パラメータ
13832 ワード
簡単に述べる
Pythonでは、関数の定義が非常に簡単で、対応する構文フォーマットの要求を満たすことができます.呼び出し者にとって、正しいパラメータの伝達方法に注目し、対応する戻り値を取得するだけで十分です.関数の内部実装を理解する必要はありません(ソースコードを学習し、追跡しない限り).
とはいえ,関数の定義には柔軟性が非常に高い.通常定義されている必須パラメータに加えて、デフォルトパラメータ、可変パラメータ、キーワードパラメータもサポートされています.これにより,複雑なパラメータを処理できるだけでなく,呼び出し者のコードを簡略化することができる.概要 形パラメータと実パラメータ 定数パラメータの関数 デフォルトパラメータ キーワードパラメータ 可変パラメータ 任意キーワードパラメータ パラメータをデパッケージ 一去丶二三里,转载请注明出典:http://blog.csdn.net/liang19890820
パラメータと実パラメータ
Pythonだけでなく、ほとんどのプログラミング言語にはparameterとargumentの2つの用語が含まれています.では、それらの間にはいったいどんな違いがあるのでしょうか. parameterは関数定義のパラメータを指し、argumentは関数呼び出し時の実際のパラメータを指す. 簡単な説明:parameter=パラメータ、argument=実パラメータ.
たとえば、単純な関数を定義します.
ここで、param 1およびparam 2は関数のパラメータであり、関数greet()が呼び出されると、入力される(
定数パラメータの関数
これまで,関数については固定数のパラメータを紹介してきた.簡単な例を見てみましょう.
ここで、関数greet()には2つのパラメータがあり、2つのパラメータでこの関数を呼び出すと、スムーズに動作し、エラーはありません.
パラメータの個数が一致しない場合、何が起こりますか?
明らかに、解釈器は愚痴をこぼす.しかし、Pythonにとって、この問題を解決するのはまるで手のひらを返すように簡単で、下を見続けます!
既定のパラメータ
関数を定義するときに、パラメータにデフォルト値を指定するには、付与演算子(
注:パラメータにデフォルト値がない場合は、呼び出し時に値を指定する必要があります.パラメータにデフォルト値がある場合は、呼び出し時に値はオプションで、値が指定されている場合はデフォルト値が上書きされます.
sayにはデフォルト値がないため、指定する必要があります.name、msgにはデフォルト値があるので、値はオプションです.
関数内のすべてのパラメータにはデフォルト値がありますが、デフォルトパラメータが存在する場合は、右側のすべてのパラメータにもデフォルト値が必要です.すなわち、非デフォルトパラメータは、デフォルトパラメータの後にはできません.
たとえば、上記の関数を次のように定義します.
エラーが発生します.
SyntaxError: non-default argument follows default argument
キーワードパラメータ
いくつかの値を使用して関数を呼び出すと、これらの値はその位置に基づいてパラメータに割り当てられます.
例えば、上記関数greet()では、
Pythonでは、
このように関数を呼び出す場合、キーワードパラメータは位置パラメータの後に、伝達されたすべてのキーワードパラメータが関数が受け入れるパラメータと一致しなければならず、それらの順序は重要ではありません.
たとえば、次のように呼び出すと、エラーが発生します.
可変パラメータ
可変パラメータは不定長パラメータとも呼ばれ、その名の通り、伝達されるパラメータの個数は可変であり、任意の(0、1、2...N)であってもよい.
可変パラメータを定義するには、パラメータ名の前にアスタリスク(
注意:この
場合によっては、関数定義で位置パラメータおよび可変パラメータを使用する必要がありますが、位置パラメータは常に可変パラメータの前に使用する必要があります.
通常、変数パラメータは、関数に渡される残りの入力パラメータをすべて収集するため、パラメータリストの最後に表示されます.可変パラメータの後に表示されるパラメータはすべて「キーワードの強制」パラメータです.これは、位置パラメータではなくキーワードパラメータとしてのみ使用できることを意味します.
任意のキーワードパラメータ
任意の数のキーワードパラメータに使用するメカニズムもあります.これを行うには、双星号(
最後の形式が
たとえば、次のような関数を定義します.
注:コンテンツを印刷する前に、msgs辞書のkeys()メソッドの結果をソートしてキーワードパラメータ名リストを作成します.そうでない場合、印刷パラメータの順序は定義されていません.
パラメータのパッケージ解除
「可変パラメータ」のように、
もう一つの方法は、ほとんど言及する必要はありません.ここでもくどくど言います.
この呼び出し方式は、パケットを解くよりも明らかに不快である.また、一般的には、長さが未知であるため、呼び出し
同様に、辞書は
Pythonでは、関数の定義が非常に簡単で、対応する構文フォーマットの要求を満たすことができます.呼び出し者にとって、正しいパラメータの伝達方法に注目し、対応する戻り値を取得するだけで十分です.関数の内部実装を理解する必要はありません(ソースコードを学習し、追跡しない限り).
とはいえ,関数の定義には柔軟性が非常に高い.通常定義されている必須パラメータに加えて、デフォルトパラメータ、可変パラメータ、キーワードパラメータもサポートされています.これにより,複雑なパラメータを処理できるだけでなく,呼び出し者のコードを簡略化することができる.
パラメータと実パラメータ
Pythonだけでなく、ほとんどのプログラミング言語にはparameterとargumentの2つの用語が含まれています.では、それらの間にはいったいどんな違いがあるのでしょうか.
たとえば、単純な関数を定義します.
>>> 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