Select Language

AI Technology Community

3.3、Python関数パラメータの伝達(精講版)

大多数の関数はパラメータを持っており、異なる入力パラメータを指定することで異なる操作を行い、異なる戻り値を得ることができます。Pythonのパラメータは、関数と呼び出し元の間の通信プロトコルです。通信プロトコルとして最も重要なのは、一貫性を保つことです。つまり、呼び出し元と関数の間でパラメータに対する理解が一致している必要があります。

位置引数

最も単純なプロトコルは、C言語の仮引数と実引数に似ています。関数は仮引数を定義し、呼び出し元は実引数を渡します。仮引数と実引数の個数は同じで、順序も同じである必要があります。つまり、仮引数と実引数は位置によってマッチングされます。

例えば、2つのパラメータの和を求める場合は、以下のように定義できます:

def get_sum(a, b):  # 2つの仮引数を定義します。1つはa、もう1つはbです
    return a+b
get_sum(1, 2)       # 2つの実引数を渡します。1つは1、もう1つは2です


パラメータの個数が異なると、エラーが発生します。以下の例では、仮引数と実引数が一致しない場合を示しています:

>>> def get_sum(a, b):  # 関数を定義します
        return a+b

>>> get_sum(1)  # 実引数の個数が仮引数より少ない場合
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: get_sum() takes exactly 2 arguments (1 given)
>>> get_sum(1, 2, 3)  # 実引数の個数が仮引数より多い場合
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: get_sum() takes exactly 2 arguments (3 given)


パラメータの順序が一致しない場合、エラーが発生しないこともありますが、計算結果が期待通りにならないことがあります。

例えば、2つの数の差を求める場合、関数を定義する際に最初のパラメータは被減数を表し、2番目のパラメータは減数を表します。しかし、呼び出す際に順序を逆にすると、最初の実引数が減数になり、2番目の実引数が被減数になり、結果が間違ってしまいます。

>>> def get_diff(a, b):  # 差を求める関数を定義します。最初のパラメータは被減数です
        return a-b

>>> get_diff(10, 2)      # 差を求める関数を使用しますが、実引数の順序が間違っているため、結果が間違ってしまいます
8

位置引数をタプルとして扱う

上記の方法には、関数のパラメータの個数が固定されているという欠点があります。しかし、関数を呼び出す際に入力する実引数の個数が決まっていない場合もあります。最も単純な例は、Python 3のprint()関数です。この関数は任意の個数のパラメータを受け取ることができます。

>>> print(1)        # 1つのパラメータ
1
>>> print(1, 2)     # 2つのパラメータ
1 2
>>> print(1, 2, 3)  # 3つのパラメータ
1 2 3


ここで、任意の個数のパラメータを受け取り、すべての実引数の和を求めて返す関数を実装するとします。

この場合、すべての実引数をタプルとして扱うことができます。関数は以下のように定義できます:

def get_sum(*l):

ここで、前の例と異なるのは、パラメータの前に*が付いていることです。これは、パラメータlがタプルであることを示しています。このタプルの各要素は、それぞれの実引数に対応しており、順序も実引数の実際の順序と一致しています。

>>> def get_sum(*l):  # 和を求める関数を定義します。パラメータをタプルとして扱います
        print("Type of l:", type(l))
        ret = 0
        for x in l:
            print("  x =", x)
            ret = ret + x
        print("sum =", ret)
        return ret
                      # 和を求める関数の定義終了
>>> get_sum(10, 2)  # 和を求める関数を使用します。2つの実引数を渡します
Type of l: <class 'tuple'>
  x = 10
  x = 2
sum = 12
12
>>> get_sum(10, 2, 11, 28, 100)  # 和を求める関数を使用します。5つの実引数を渡します
Type of l: <class 'tuple'>
  x = 10
  x = 2
  x = 11
  x = 28
  x = 100
sum = 151
151


前の例では、すべての実引数をタプルとして使用しました。では、一部の実引数をタプルとして使用することはできますか?答えはYesです。ただし、タプルとして使用するパラメータは、最後の実引数である必要があります。前の実引数は通常のパラメータとして使用し、後ろのパラメータをタプルとして使用することができます。

ここで、前の和を求める関数を変更します。最初のパラメータは係数kで、その後に任意の個数のパラメータが続きます。計算結果は、これらのパラメータの和に最初のパラメータkを掛けたものです。数学的に表すと、以下のようになります:

y = k * (v1 + v2+ ...)

この場合、最初の実引数kを通常のパラメータとして、他の実引数をタプルとして扱うことができます。

以下は、この関数の定義と使用例です:

>>> def get_sum(k, *l):  # 最初の実引数は通常のパラメータで、その後はタプルです
        print("k =", k)
        print("Type of l:", type(l))
        ret = 0
        for x in l:  # タプル内のデータの和を求めます
            print("  x =", x)
            ret = ret + x
        ret = ret * k  # 係数kを掛けます
        print("sum =", ret)
        return ret

>>> get_sum(10, 2)  # 10はkに対応し、2はタプルパラメータに入ります
k = 10
Type of l: <class 'tuple'>
  x = 2
sum = 20
20
>>> get_sum(10, 2, 11, 28, 100)  # 10はkに対応し、他の値はタプルパラメータに入ります
k = 10
Type of l: <class 'tuple'>
  x = 2
  x = 11
  x = 28
  x = 100
sum = 1410
1410

呼び出し時にタプルとリストを使用する

上記では、関数を呼び出す際に通常の方法を使用していましたが、関数を定義する際にパラメータに特殊な処理を行っていました。ここでは、逆に、関数を定義する際に通常の方法を使用し、関数を呼び出す際にタプルを渡します。

注意:このタプルの要素の個数と順序は、関数を定義する際と一致している必要があります。渡す辞書オブジェクトの前には*を付ける必要があります。

>>> def func_demo(a, b, c):  # 通常の定義方法で、3つのパラメータが必要です
        print("  a = %s" % a)
        print("  b = %s" % b)
        print("  c = %s" % c)

>>> d = [1, 2, 3]  # 渡すのはリストです
>>> func_demo(*d)  # リストには3つの要素があり、問題ありません
  a = 1            # 注意:パラメータオブジェクトの前に*があります
  b = 2
  c = 3
>>> d = [1, 2]     # リストには2つの要素しかないため、問題があります
>>> func_demo(*d)
Trace
post
Pythonの関数
2021-12-10 23:42:59join communtity
  • 6

    item of content
関数はコードの基本的なモジュールであり、特定の機能を実現し、他のコードから利用することができます。関数を使うことでコードのモジュール性が向上し、コードの組織化がより効率的になり、共同開発が促進されます。
現代のソフトウェア開発言語はすべて関数をサポートしており、関数をコードの最も基本的な単位と考えることができます。たとえ最もシンプルな「Hello, Python」コードでも、print() 関数の呼び出しに関数が関わっています。
この章では、関数の基本概念と使用方法について紹介します。具体的には、Pythonの関数の定義と使用方法、関数パラメータの使い方、よく使用される組み込み関数、そしてlambda関数や再帰に関する内容を含みます。