Biz-IT Blog

Business x IT --> Upgrade!

第6章 6.2 関数の応用テクニック

この章では、知っていると便利な関数の応用テクニックについて解説します。

応用テクニック

複数の戻り値を返す方法

「関数での戻り値は1つまで」というルールに対し、要素を複数持つコレクションを使うことによって実質的に複数の戻り値を返すことができます。

<プログラム例>

# 関数plus_minusを定義
# 戻り値は1つのルールがあるため、コレクションを使う
# コレクションはリストでも、タプルでも可
def plus_minus(x, y):
    z = (x + y, x - y)    # z はタプル
    return z

# 戻り値をタプルcへ代入し、c[0],c[1]で取り出して表示
print('タプルc[0]とc[1]')
c = plus_minus(10,20)
print(c[0])
print(c[1])

<実行結果>
タプルc[0]とc[1]
30
-10

上記プログラムを「タプルの丸カッコは省略可能」「変数をまとめて代入(アンパック代入)」のルールを用いると、コレクションかどうかを気にせず複数の戻り値を返すように見える関数を記述できます。

# 関数plus_minusを定義
# 戻り値は1つのルールがあるため、コレクションを使う
# コレクションはリストでも、タプルでも可
def plus_minus(x, y):
    # 変数zを使わず、タプルの()を省略して記述
    return x + y, x - y

# 戻り値を変数a,bへアンパック代入
print('変数aとb')
a, b = plus_minus(10,20)
print(a)
print(b)

<実行結果>
変数aとb
30
-10

引数にデフォルト値を指定する方法

引数が毎回同じ値をとるケースが多く、引数の設定を省略したい場合、引数にデフォルト値を設定して関数を定義することができます。

<引数にデフォルト値を指定する関数の定義>

def 関数名(引数1,引数2,・・・,仮引数1=デフォルト値1,仮引数2=デフォルト値2,・・・)
 関数ブロック
 return 戻り値

※関数呼び出し時に、仮引数1以降の引数を省略することができる。
注意)仮引数を設定した以降の引数は必ず仮引数を設定しなければならない。

<プログラム例>

# 引数c にデフォルト値10 を設定
def abc(a,b,c=10):
    d = a * b / c
    return d

# 計算結果はどちらも「20*30/10」
print(abc(20,30,10))
print(abc(20,30))

# 計算結果は「20*30/50」
print(abc(20,30,50))

<実行結果>
60.0
60.0
12.0

引数名を用いた関数呼び出し

関数定義の引数名と関数呼び出しの引数名を同じにすることで、引数の記述の順序にかかわらず、正しい順序で引数を関数へ渡すことができる。

<引数名を用いた関数呼び出し>

def 関数名(引数名1,引数名2,・・・)
 関数ブロック
 return 戻り値

関数名(引数名1=引数1,引数名2=引数2・・・)

<プログラム例>

# 引数d にデフォルト値10 を設定
def abc(a,b,c=10):
    d = a * b / c
    return d

# 計算結果はどちらも「20*30/10」
print(abc(c=10,a=20,b=30))
print(abc(b=30,a=20))

# 計算結果は「20*30/50」
print(abc(c=50,a=20,b=30))

<実行結果>
60.0
60.0
12.0

※7,8,11行目では、関数定義の引数名と同じ引数名を使って、関数呼び出しを行っているため、関数呼び出し時の引数の記述順序に関係なく正しく引数を関数へ渡すことができている。

可変長引数

これまで説明してきた関数の引数の数は固定でしたが、この引数の数を可変にしたい場合があります。
その様な場合は、可変長引数を使って関数を定義します。

<可変長引数の関数定義と呼び出し>

def 関数名(引数名1,引数名2,・・・,*引数名n)
 関数ブロック
 return 戻り値

関数名(引数1,引数2,・・・,引数n,引数n+1,・・・)

※可変長引数には、*(アスタリスクを付ける。
※可変長引数は、最後の引数にのみ指定できる。
※関数呼び出しで関数に引き渡す(引数n,引数n+1,・・・)の部分は1つのタプルとして、*引数名nに渡される。

<プログラム例>

# 引数d は可変長引数
def abcd(a,b,c,*d):
    x = a + b + c
    print('まず{}と{}と{}を足して'.format(a,b,c))
    y = 0
    for y in d:
        x += y
        print('さらに{}を足して'.format(y))
    return x

# 計算結果を表示
print(abcd(1,2,3,4,5))
print(abcd(1,2,3,4,5,6,7))

<実行結果>
まず1と2と3を足して
さらに4を足して
さらに5を足して
15
まず1と2と3を足して
さらに4を足して
さらに5を足して
さらに6を足して
さらに7を足して
28

※関数abcdの4つ目の引数dは可変長引数として設定する。
※6-8行目でfor文を用いて可変長引数の要素を全て足し算する。
※print関数に記述されている「.format()」については、7章で詳しく説明します。ここでは、print関数とformat関数を使うと便利に文字列を表示できるという程度で理解しておいてください。

ディクショナリを用いた可変長引数

可変長引数にタプルではなく、ディクショナリを用いることもできます。
ディクショナリを用いる場合は、**(アスタリスク2つ)を付けて記述します。

# 引数x はディクショナリの可変長引数
def abc(**x):
    for key in x:
        print('{}は{}点でした'.format(key,x[key]))

abc(国語=70,数学=90,英語=80)

<実行結果>
国語は70点でした
数学は90点でした
英語は80点でした
 
 
次のページへ
Pythonトップへ戻る