おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

Python初心者のお勉強ノート(10)関数の基礎

プログラムを効率よく書くためには、同じ処理を繰り返し使える「関数」を理解することが重要です。

関数とは何か

関数とは、ひとまとまりの処理を名前を付けて定義したものです。 一度定義すれば、何度でもその処理を呼び出して使うことができます。

関数の定義と呼び出し

Pythonで関数を定義するには、defキーワードを使います。以下は基本的な構文です。

def 関数名(引数1, 引数2, ...):
    処理
    return 戻り値

例として、2つの数を足し合わせる関数を作ってみましょう。 この関数を呼び出すには、関数名と引数を指定します。

>>> def add(a, b):
...     return a+b
...
>>> add(2, 4)
6
>>>

引数のない関数

引数を取らない関数も定義できます。例えば、文字列"Hello, world."を返す関数を作ります。

>>> def greet():
...     return "Hello world."
...
>>> greet()
'Hello world.'
>>>

引数が無くても、関数名に続くカッコは省略できないことに注意しましょう。

戻り値のない関数

returnを省略すると、戻り値はNoneというオブジェクトになります。 Noneは何もないという意味で使われます。

次の例では、引数を2倍にして表示するだけの関数を作ります。

>>> def double_print(x):
...     print(x*2)
...
>>> a = double_print(10)
20
>>> a
>>> print(a)
None
>>>
  • 5行目では、関数内のprint文が実行され、10の2倍の20が表示される
  • 6行目で変数aの値を表示させようとしているが、Pythonを対話的に動かしているときにNoneは表示されないことになっている
  • 7行目ではprint文でaの値を表示する。その結果が8行目のNoneになっている

良く使うprint関数も戻り値がNoneになっています。 なお、関数の中でreturn NoneとしてもNoneを返すことができます。

デフォルト引数

関数にデフォルト値を設定することで、引数を省略した場合に使われる値を指定できます。

>>> def greet(name="world"):
...     print(f"Hello, {name}!")
...
>>> greet()
Hello, world!
>>> greet("Alice")
Hello, Alice!
>>>

可変長引数

引数の数を固定しない関数を、*argsまたは**kwargsを使い、作ることができます。 関数呼び出しでは、任意の引数を与えることができ、関数内ではそれをタプル、または辞書型として処理できます。

  • *args: 任意の数の位置引数をタプルとして受け取る
  • **kwargs: 任意の数のキーワード引数を辞書型として受け取る

次の例では任意の個数の数値を引数にできます。 関数側では、引数をタプルとして受け取っています。 sumはタプルやリストの合計を求める関数です。

>>> def summarize(*args):
...     return sum(args)
...
>>> summarize(1, 2, 3, 4, 5)
15
>>>

次の例では可変長のキーワード引数を使って関数定義をしています。 キーワード引数とは、辞書型のように、キーと値のペアで各引数を与えるものです。

>>> def display_info(**kwargs):
...     for key, value in kwargs.items():
...     print(f"{key.capitalize()}: {value}")
...
>>> display_info(name="Alice", age=30, country="USA")
Name: Alice
Age: 30
Country: USA
>>> display_info()
>>> display_info(language="Python", version="3.11", author="Guido van Rossum")
Language: Python
Version: 3.11
Author: Guido van Rossum

関数を使うメリット

関数は、特定の処理を再利用したいときやコードを簡潔にしたいときに役立ち、複雑なアルゴリズムを分割して分かりやすくできるという利点があります。 また、プログラムが読みやすくなるとともに、バグの場所がどこにあるかが分かりやすくなり、修正が容易になるというメリットもあります。