Python3系のmap()とかfilter()とか

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 する場合も、有限個数の普通のリストと同じインタフェースでシンプルに関数型っぽく書けて、 なおかつ遅延評価っぽくなってパフォーマンス上有利になるということかなぁ。

Python2からPython3で破壊的変更となってるらしいが….