【Pythonチュートリアル】4. その他の制御フローツール その3

monitor Python

前回の続きから。

 

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関数

つまり、

  1. ” pairs “の各要素((1, ‘one’)や、(2, ‘two’)など)を取り出します。
  2. それらをlambda式の仮引数” pair “とします。
  3. lamda式によって、” pair “のindex1の要素(’one’や、’two’など)を取り出します。
  4. それらをsortするためのkeyとします。

 

参考

Python チュートリアル > 4. その他の制御フローツール

タイトルとURLをコピーしました