▼ 下記ページを理解していること。
[Python] [基本] 組込みデータ型の特性(immutable, mutable等)
[Python] [基本] 組込みデータ型まとめ (bool, int, float, complex)
[Python] [基本] 組込みデータ型まとめ (str, list, tuple, range, dict)
[Python] [基本] 組込みデータ型まとめ (set, bytes, bytearray, fileobject)
▼ Python3.6がインストールされていること。
このページでは、venvの仮想環境(Python3.6)上にNumPyをインストールした環境で、Python対話モード(Pythonインタプリタ)にて実装サンプルを記載している。
※ Python対話モードについては下記を参考。
Python対話モード:[Python] 対話モード (インタプリタ) の使用方法
※ 実装サンプルの注意。
Python対話モードの応答にコードハイライトの予約語である class が登場しているため、コメントや変数名など不統一なハイライト色となっているのでご了承のこと。
$ python
>>>
>>> # 関数 p_func を引数に持つ、高階関数 h_order_func を定義
>>> def h_order_func(p_func):
... p_func()
...
>>> # メッセージを出力する関数 print_msg を定義
>>> def print_msg():
... print('executed print_msg')
...
>>> # 高階関数 h_order_func の引数に関数 print_msg を指定して実行
>>> h_order_func(print_msg)
executed print_msg
>>>
▼ 関数を戻り値に持つ高階関数
$ python
>>>
>>> # 関数 add_param を戻り値に持つ、高階関数 h_order_func を定義
>>> def h_order_func(x):
... def add_param(y):
... return x + y
... return add_param
...
>>> # h_order_func(5)の戻り値である add_param(y) に 10 を指定して実行
>>> h_order_func(5)(10)
15
>>>
>>> # ※ h_order_func(5) の 戻り値は、下記の add_param(y) の定義となり、x が 5 に置き換わっている状態となる
... def add_param(y):
... return 5 + y
>>>
▼ 関数を引数と戻り値の両方に持つ高階関数
$ python
>>>
>>> # 関数 func を引数に持ち、戻り値に add_func 持つ、高階関数 h_order_func を定義
>>> def h_order_func(func):
... def add_func(x, y):
... return func(x) + y
... return add_func
...
>>> # 5 を加算する関数 add_five を定義
>>> def add_five(x):
... return x + 5
>>>
>>> # h_order_func(add_five)の戻り値である add_func(x, y) に 1, 2 を指定して実行
>>> h_order_func(add_five)(1, 2)
8
>>>
>>> # ※ h_order_func(add_five) の 戻り値は、下記の add_func(x, y) の定義となり、関数 func(x) が 関数 add_five(x) に置き換えられた状態となる
... def add_func(x, y):
... return x + 5 + y
>>>
$ python
>>>
>>> # 第1引数の関数を定義(3倍にするだけ)
>>> def triple(p):
... return p * 3
...
>>> # 第2引数のlist型を定義
>>> list_a = [1, 2, 3, 4, 5]
>>>
>>> # mapを実行
>>> result = map(triple, list_a)
>>>
>>> # map型のイテレータで返ってくる
>>> print(result)
<map object at 0x7f59b53cc5c0>
>>>
>>> # list型にキャストし、中身を確認
>>> print(list(result))
[3, 6, 9, 12, 15]
>>>
$ python
>>>
>>> result = map(lambda x:x * 3, list_a)
>>> print(list(result))
[3, 6, 9, 12, 15]
>>>
$ python
>>>
>>> # map(triple, list_a) と同義
>>> result = (triple(p) for p in list_a)
>>> print(list(result))
[3, 6, 9, 12, 15]
>>>
$ python
>>>
>>> # 第1引数の関数を定義(正であればTrueを返す)
>>> def is_plus(p):
... return p > 0
...
>>> # 第2引数のlist型を定義
>>> list_a = [-2, -1, 0, 1, 2]
>>>
>>> # filterを実行
>>> result = filter(is_plus, list_a)
>>>
>>> # filter型のイテレータで返ってくる
>>> print(result)
<filter object at 0x7f59b53cc668>
>>>
>>> # list型にキャストし、中身を確認
>>> print(list(result))
[1, 2]
>>>
$ python
>>>
>>> result = filter(lambda x:x > 0, list_a)
>>> print(list(result))
[1, 2]
>>>
$ python
>>>
>>> # filter(is_plus, list_a) と同義
>>> result = (p for p in list_a if is_plus(p))
>>> print(list(result))
[1, 2]
>>>
$ python
>>>
>>> # functoolsからインポート
>>> from functools import reduce
>>>
>>> # 第1引数の関数を定義(差を返す)
>>> def minus(p1, p2):
... return p1 - p2
...
>>> # 第2引数のlist型を定義
>>> list_a = [-5, -4, -3, -2, -1]
>>>
>>> # minus と list_a で reduce を実行
>>> print(reduce(minus, list_a))
5
>>>
>>> # 第3引数に -6 を指定
>>> result = reduce(minus, list_a, -6)
>>> print(result)
9
>>>
$ python
>>>
>>> result = reduce(lambda x, y: x - y, list_a)
>>> print(list(result))
5
>>>