見出し画像

Python 3: Deep Dive (Part 1 - Functional): コール可能 (セクション6-3/11)

  • Pythonのコール可能は、関数やクラス、オブジェクトが`()`で呼び出せる特性を持ち、常に値を返す。

  • `map()`、`filter()`、`zip()`などの高階関数は、イテラブルに対して関数を適用し、リスト内包表記がこれらの代替として使える。

  • リスト内包表記は、コードを簡潔にし、`if`文でインラインフィルタリングが可能なPythonの強力な機能。

Python 3: Deep Dive (Part 1 - Functional)コースを進める中で、セクション6のレッスン88~90を終えました。このセクションでは、Pythonのファーストクラス関数について学び、Pythonの関数型プログラミング機能を理解するための基礎を築きました。ここでは、コール可能(Callable)、組み込み関数である`map()`、`filter()`、`zip()`、そしてリスト内包表記についての重要な概念を紹介します。

レッスン88:コール可能を理解する

Pythonにおける*コール可能(Callable)*とは、丸括弧 `()` を使って呼び出すことができるオブジェクトを指します。関数やメソッドが代表例ですが、Pythonではクラスやオブジェクト、その他のデータ型にもコール可能な機能が拡張されています。

何がコール可能か?

  • 丸括弧演算子を使用して呼び出せるオブジェクトはすべてコール可能です。

  • コール可能なものは常に値を返します。それが`None`であっても必ず返されます。

  • あるオブジェクトがコール可能かどうかは、組み込み関数`callable()`を使って確認できます。

次の例を見てみましょう:

print(callable(print))  # True
print(callable(10))     # False

このレッスンでは、さまざまなタイプのコール可能なオブジェクトについて学びました:

  • 組み込み関数 例: `print()` や `len()`

  • 組み込みメソッド 例: `str.upper()` や `list.append()`

  • ユーザー定義関数 `def` や `lambda`を使って定義された関数

  • クラス クラスもコール可能です。インスタンス化するときに丸括弧を使います。

  • クラスインスタンス `call()`メソッドを実装すればコール可能です。

以下は、クラスインスタンスをコール可能にする簡単な例です:

class MyClass:
    def __init__(self):
        self.counter = 0
    
    def __call__(self, x=1):
        self.counter += x
        print(self.counter)

my_obj = MyClass()
my_obj()  # これで__call__メソッドが呼び出されます

レッスン89:マップ、フィルター、ジップ、リスト内包表記の紹介

レッスン89では、Pythonの重要な高階関数である`map()`、`filter()`、`zip()`に加え、リスト内包表記のようなモダンな代替手段について紹介されました。

Map(マップ)

`map()`は、指定された関数を1つ以上のイテラブルの各要素に適用する組み込み関数です。返り値はイテレーターで、リストに変換することができます。

l = [2, 3, 4]
squared = list(map(lambda x: x**2, l))
print(squared)  # 出力: [4, 9, 16]

Filter(フィルター)

`filter()`は、イテラブル内の各要素に関数を適用し、その関数が`True`を返す要素だけを保持します。

l = [1, 2, 3, 4]
evens = list(filter(lambda x: x % 2 == 0, l))
print(evens)  # 出力: [2, 4]

Zip(ジップ)

`zip()`は、複数のイテラブルの要素をタプルにまとめます。最短のイテラブルが終了すると、処理が終了します。

l1 = [1, 2, 3]
l2 = [10, 20, 30]
zipped = list(zip(l1, l2))
print(zipped)  # 出力: [(1, 10), (2, 20), (3, 30)]

レッスン90:マップ、フィルター、ジップ、リスト内包表記の実装

このセクションの最後のレッスンであるレッスン90では、これらの関数を使った実際のコーディングを重視しています。リスト内包表記を使うことで、`map()`や`filter()`に代わる、よりPython的なアプローチが提供されることを示しています。

例えば、リスト内包表記を使用して`map()`と同じ結果を得る方法は次の通りです:

l = [2, 3, 4]
squared = [x**2 for x in l]
print(squared)  # 出力: [4, 9, 16]

また、`map()`と`filter()`を組み合わせたより複雑な式も次のように簡単に表現できます:

l = range(10)
filtered_squares = [x**2 for x in l if x**2 < 25]
print(filtered_squares)  # 出力: [0, 1, 4, 9, 16]

このアプローチは、`map()`と`filter()`の連鎖よりも、よりクリーンで読みやすいです。

まとめ

  1. コール可能(Callable):Pythonでは、関数やメソッドだけでなく、クラスやオブジェクトも`call()`メソッドを実装すればコール可能になります。

  2. 高階関数:`map()`、`filter()`、`zip()`のような高階関数は、関数をイテラブルに適用する柔軟な方法を提供し、Pythonを関数型プログラミングに適した言語にしています。

  3. リスト内包表記:`map()`や`filter()`の代替手段として、リスト内包表記は簡潔で、しばしば読みやすいコードを提供します。また、`if`文を使ってインラインでフィルタリングも可能です。

これらのレッスンは、Pythonが関数をどのようにファーストクラスオブジェクトとして扱うかについての理解を深めるものです。次のセクションでは、さらに関数型プログラミングの概念やデコレータ、クロージャに深く入り込んでいきます。

次回もお楽しみに!


この記事をお好みに合わせて変更したり、さらに詳しく説明することもできます。Jupyter Notebookに関する詳細を追加したい場合は、お知らせください。

「超本当にドラゴン」へ

いいなと思ったら応援しよう!