oh…..
Python 3.6.1 (default, Jan 10 2018, 18:19:55) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> nums=[1, 2, 3, 4] >>> filtered=filter(lambda n:(n % 2)==0, nums) >>> list(filtered) [2, 4] >>> list(filtered) []
oh……
Python 3.6.1 (default, Jan 10 2018, 18:19:55) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> nums=[1, 2, 3, 4] >>> filtered=filter(lambda n:(n % 2)==0, nums) >>> print(len(filtered)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'filter' has no len() >>> list(filtered) [2, 4]
oh…….
Python 3.6.1 (default, Jan 10 2018, 18:19:55) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> nums=[1, 2, 3, 4] >>> print(type(nums)) <class 'list'> >>> filtered=filter(lambda n:(n % 2)==0, nums) >>> print(type(filtered)) <class 'filter'>
filterするとiterableな何かが返ってきている。
直感に反するが、
- リスト内包表記で無限個数のリスト
- くそ長いリスト
を map -> reduce する場合も、有限個数の普通のリストと同じインタフェースでシンプルに関数型っぽく書けて、 なおかつ遅延評価っぽくなってパフォーマンス上有利になるということかなぁ。