Pythonにおける関数

Pythonにおける関数

この記事ではPythonにおける関数について説明します。

YouTube Video

Pythonにおける関数

Pythonにおける関数は、再利用可能なコードのブロックを定義し、必要に応じて呼び出すことでプログラムを整理・簡素化するための重要な機能です。関数を使うことで、コードの可読性を向上させ、DRY原則(Don't Repeat Yourself、一度書いたコードを繰り返さない)に従うことができます。

関数の定義

関数はdefキーワードを使って定義します。基本的な構文は次の通りです。

1def function_name(arg1, arg2, ..., argN):
2    """docstring (A brief description of the function)"""
3    processing
4    return return_value

例えば、2つの数値を加算する関数を定義するには、次のように書きます。

1def add(x, y):
2    """A function that adds two numbers and returns the result"""
3    return x + y

関数の呼び出し

定義した関数は、以下のように呼び出して利用します。

1result = add(3, 4)
2print(result)  # Output: 7

関数の構成要素

  1. 関数名

    • 関数の名前で、呼び出す際に使います。
  2. 引数(パラメータ)

    • 呼び出し時に渡されるデータを受け取る変数名です。引数は0個以上定義できます。
  3. ドキュメンテーション文字列(Docstring)

    • 関数の目的や使い方を説明する文字列です。省略可能です。
  4. 関数本体

    • インデントされたブロックで、関数が実行する命令が記述されます。
  5. 戻り値

    • return文を使って関数の呼び出し元に返す値です。returnを省略すると、デフォルトでNoneが返されます。

引数の種類

Pythonにはいくつかの引数の種類があります。

  1. 位置引数
    • 引数を関数に渡す通常の方法です。
  2. デフォルト引数
    • 引数にデフォルト値を設定して、呼び出し時に省略できるようにします。
1def greet(name, message="Hello"):
2    print(f"{message}, {name}")
3
4greet("Alice")  # "Hello, Alice"
5greet("Bob", "Good morning")  # "Good morning, Bob"
  1. 可変長引数
    • 複数の位置引数をタプルとして受け取るargs、辞書として受け取るkwargsがあります。
1def func(*args, **kwargs):
2    print("args:", args)
3    print("kwargs:", kwargs)
4
5func(1, 2, 3, a=4, b=5)
6# Output:
7# args: (1, 2, 3)
8# kwargs: {'a': 4, 'b': 5}

関数を正しく使うことで、Pythonプログラムをより効果的に、かつ効率良く書くことができます。

Pythonにおけるlambda関数

Pythonにおけるlambda関数は、無名の簡潔な関数を定義するために使用されます。通常のdefキーワードを使って定義する関数とは異なり、lambdaを使うことで、一行で短い関数を作成することが可能です。ここでは、Pythonのlambda関数について詳しく説明します。

lambda関数の基本

lambda関数は、無名関数とも呼ばれ、その名の通り名前を持たない一時的な関数を定義する際に使用されます。基本的な構文は以下の通りです。

1lambda arguments: expression
  • arguments
    • 関数の引数を指定します。カンマ区切りで複数可です。
  • expression
    • 引数に基づいて評価される式です。結果が関数の戻り値となります。

例えば、次のコードは2つの数値を加算するlambda関数を定義し、それを実行する例です。

1add = lambda x, y: x + y
2print(add(5, 3))  # Output: 8

この例では、lambda x, y: x + yは、xyという2つの引数を取り、その合計を返すlambda関数です。

lambda関数の使いどころ

lambda関数は、簡単な関数を即座に定義する必要がある場合に便利です。特に、以下のようなケースでよく使われます。

  1. 関数の引数として渡す場合

    • 高階関数(他の関数を引数に取る関数)において、短い一時的な関数を渡す場合に便利です。
  2. リストの並べ替え時にキーを指定する場合

    • sort()sorted()といった関数で、並べ替えの基準(キー)を指定する際に便利です。

高階関数での使用例

高階関数の典型的な例として、map(), filter(), reduce()などがあります。これらの関数は、他の関数を引数として取り、リストなどのシーケンスに対して適用します。

1numbers = [1, 2, 3, 4, 5]
2squared = list(map(lambda x: x ** 2, numbers))
3print(squared)  # Output: [1, 4, 9, 16, 25]

この例では、map()関数にlambda関数を渡して、リスト内の各数値を二乗しています。

リストのソートでの使用例

lambda関数は、リストをソートする際にカスタムキーを指定するために使われることがあります。例えば、次のコードでは、タプルのリストを2番目の要素を基準に並べ替えます。

1pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
2pairs.sort(key=lambda pair: pair[1])
3print(pairs)
4# Output: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

この例では、lambda関数を使って、タプルの2番目の要素(文字列)を基準に並べ替えています。

filter()lambda

filter()関数は、与えられた条件に基づいてリストなどの要素をフィルタリングするために使います。

1numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
2even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
3print(even_numbers)  # Output: [2, 4, 6, 8]

この例では、リスト内の偶数をフィルタリングして新しいリストを作成しています。

lambda関数とreduce()

reduce()関数は、リスト全体を1つの値に畳み込むために使用されます。lambda関数を使って簡単に実装できます。

1from functools import reduce
2
3numbers = [1, 2, 3, 4, 5]
4product = reduce(lambda x, y: x * y, numbers)
5print(product)  # Output: 120

この例では、リスト内のすべての要素を掛け合わせて結果を得ています。

複雑なlambda関数は避けるべき

lambda関数は簡潔であることが利点ですが、複雑なロジックを実装すると読みづらくなります。そのため、1行で記述できる程度のシンプルな処理に使うのが適切です。複雑な処理は通常のdef関数を使って定義する方が読みやすく、保守性も高まります。

例えば、以下のような複雑なlambda関数は避けるべきです。

1# Complex and hard-to-read lambda function
2complex_func = lambda x, y: (x * 2 + y) if x > y else (x + y * 2)

この場合は、次のようにdefを使った関数にした方が良いでしょう。

1def complex_func(x, y):
2    if x > y:
3        return x * 2 + y
4    else:
5        return x + y * 2

結論

Pythonのlambda関数は、一時的な短い関数を定義するための便利なツールです。高階関数やリスト操作において、特定の条件を簡潔に記述する場面でよく使われます。しかし、lambda関数はシンプルな処理に限定して使用し、複雑なロジックにはdef関数を使うことが推奨されます。

YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。

YouTube Video