前回の続きから。
4.7. 関数定義についてもう少し のつづき
4.7.3. 特殊なパラメータ
関数を定義する際、仮引数に特殊なパラメータ(/, *)を使うことで、下記の通り制限をすることができます。
- 位置またはキーワード引数
- 位置引数専用
- キーワード引数専用
1つずつ見ていきます。
4.7.3.1. 位置またはキーワード引数
今まで意識していなかったですが、関数定義に特殊なパラメータ(/, *)を使用しない場合、デフォルトでは位置またはキーワード引数として扱われます。
def <関数名>(<位置またはキーワード引数>): <処理>
4.7.3.2 位置専用引数
位置専用引数は” / “(スラッシュ)の前に配置されます。
” / “(スラッシュ)の後ろは、位置またはキーワード引数となります。
def <関数名>(<位置専用引数>, /, <位置またはキーワード引数>): <処理>
4.7.3.3 キーワード専用引数
キーワード引数は” * “(アスタリスク)の後ろに配置されます。
” * “(アスタリスク)の前は、位置またはキーワード引数となります。
def <関数名>(<位置またはキーワード引数>, *, <キーワード専用引数>): <処理>
4.7.3.4 関数の例
こちらはPythonチュートリアルを参照してください。
4.7.3.5 要約
こちらはPythonチュートリアルを参照してください。
4.7.4. 任意引数リスト
関数を定義する際、可変個の引数を定義することも可能です。
可変個の引数の前には、ゼロ個もしくは、それ以上の引数があってもOKです。
def <関数名>(arg1, arg2, *args): <処理>
上記の場合、3つ以上の引数が指定された場合、3つ目以降は” *args “がタプルとしてすくい取るので、仮引数リストの最後に置く必要があります。例えば、
def test(arg1, arg2, *args): print(arg1) print(arg2) print(*args) test('a', 'b', 'c', 'd', 'e')
a b c d e
ただし、キーワード引数であれば、” *args “の後に置くことができます。
つまりは、キーワード専用引数ということになります。
def concat(*args, sep="/"): return sep.join(args) print(concat("earth", "mars", "venus")) print(concat("earth", "mars", "venus", sep="."))
earth/mars/venus earth.mars.venus
4.7.5. 引数リストのアンパック
引数として与える値がすでにリストやタプルになっている場合、” * “(アスタリスク)を使って位置引数として展開(アンパック)しながら関数に渡すことができます。
range関数を例としてみます。
■通常の使い方
list(range(3,6))
[3, 4, 5]
■引数リストをアンパック
args = [3, 6] list(range(*args))
[3, 4, 5]
また、辞書型のデータも” ** “(アスタリスク×2つ)で、キーワード引数として展開して関数に渡すことができます。( { key : value } ー> key=value みたいな感じで展開)
def parrot(voltage, state='a stiff', action='voom'): print("-- This parrot wouldn't", action, end=' ') print("if you put", voltage, "volts through it.", end=' ') print("E's", state, "!") d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"} parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
4.7.6 ラムダ式
ラムダ(lambda)式とは無名関数と呼ばれ、その名の通り関数名を定義することなく使用することができます。
■ラムダ式の表現方法
lambda <仮引数>:<処理>
■ラムダ式の使い方
# ラムダ式で定義した関数を変数に収めてから、引数を与える result = lambda x : x * 2 print(result(10)) 20 # ラムダ式での関数定義と呼び出しを同時に行う print((lambda x : x * 2)(10)) 20
ここで、Pythonチュートリアルにある以下の動作を確認してみます。
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] pairs.sort(key=lambda pair: pair[1]) pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
” pairs.sort(key=lambda pair: pair[1]) “の部分について、細かく動作を見てみます。
list.sort(key=function)で、key関数を指定することで、比較(sort)を行う前に、listの各要素に対して適用される関数(function)を呼びだします。(Pythonチュートリアル > Key関数)
つまり、
- ” pairs “の各要素((1, ‘one’)や、(2, ‘two’)など)を取り出します。
- それらをlambda式の仮引数” pair “とします。
- lamda式によって、” pair “のindex1の要素(’one’や、’two’など)を取り出します。
- それらをsortするためのkeyとします。