Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで関数型プログラミング

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for ksnt ksnt
August 28, 2019

 Pythonで関数型プログラミング

Avatar for ksnt

ksnt

August 28, 2019
Tweet

More Decks by ksnt

Other Decks in Programming

Transcript

  1. Pythonと利用関数型プログラミングプログラミング • 組み込み関数み込み関数込み関数み込み関数で関数型プログラ高階関数の紹介map, filter, reduceが用意 用意 (〜ver. 2.7)) • Python3以降,

    reduceが用意 functoolsモジュールに使える組み込み移動 • Python3以降, リストではなくイテレで関数型プログラはなくイテレータが返されることが用意 返されることにされる組み込み関数こと利用に使える組み込み なった • 関数型プログラミングプログラミングに使える組み込み使える組み込み関える組み込み関数関数は主にに使える組み込みfunctoolsと利用itertools モジュールに使える組み込みある組み込み関数
  2. 関数型プログラミングプログラミングの紹介 よくある組み込み関数ネタが返されることの紹介一部 • 再帰的定義 • 無名関数 • 関数の紹介部分ける適用, カリー化 •

    関数の紹介合成 • 遅延評価 • モナド • map, reduce, filter, foldr, foldl, takewhile, dropwhile, flatMap • (functools.lru_cache) ※関数型プログラミングプログラミングと利用は関係ないが便利なのないが用意 便利なの紹介で関数型プログラついで関数型プログラに使える組み込み紹介 ※今回はは太字の紹介もの紹介に使える組み込みついて出力を吐くだけの紹介み込み関数話すす
  3. 無名関数 - lambda >>> (lambda x, y : x +

    y)(1,100) 101 >>> def add_two_var(x,y): return x + y >>> add_two_var(1,100) 101 >>> (lambda x: x + 2)(1) 3 >>> def add_two(x): return x + 2 >>> add_two(1) 3
  4. map >>> list(map(lambda x: x*2, [1,2,3,4])) [2, 4, 6, 8]

    >>> res = [] >>> for i in [1,2,3,4]: ... res.append(i*2) ... >>> res [2, 4, 6, 8] >>> [i*2 for i in [1,2,3,4]] [2, 4, 6, 8] (Task) ある組み込み関数リストではなくイテレの紹介要素を全てを全てて出力を吐くだけ2倍するする組み込み関数 1. mapを使える組み込み関う 2. mapを使える組み込み関わない
  5. filter >>> [x for x in [1,-2,3,-4] if x >

    0] # returns: [1,3] >>> list(filter(lambda x: x > 0, [1,-2,3,-4])) # returns: [1,3]
  6. reduce >>> from functools import reduce >>> reduce(lambda x,y: x*y,

    [1,2,3,4,5]) 120 (Task) ある組み込み関数リストではなくイテレに使える組み込み含まれる数の積をまれる組み込み関数数の紹介積を求めるを求めるめる組み込み関数 >>> res = 1 >>> for i in [1,2,3,4,5]: ... res = res * i ... >>> res 120
  7. reduce (cont’d) >>> from functools import reduce >>> reduce(lambda x,y:

    x + y, map(str,[1,2,3,4,5])) '12345' (Task) ある組み込み関数リストではなくイテレに使える組み込み含まれる数の積をまれる組み込み関数数を文字列として連結すると利用して出力を吐くだけ連結するする組み込み関数 >>> ‘’.join(map(str,[1,2,3,4,5])) '12345' ※joinを使える組み込み関った方が速いらしいが用意 速いらしいいらしい
  8. partial ・関数の紹介部分ける適用を実現 >>> def add_two_var(x,y): ... return x + y

    … >>> add_onehundred = functools.partial(add_two_var,100) >>> add_onehundred(10) 110
  9. partial (cont’d) >>> reader = functools.partial(open, mode="rt", encoding="utf8") >>> writer

    = functools.partial(open, mode="wt", encoding="utf8") >>> f = reader("hoge.txt") >>> f.readline() 'This is a test file.\n' >>> f.readline() 'You can remove this file now!\n' >>> f.close() >>> f = writer("hoge.txt") >>> f.write("This is a overwritten sentence!") 31 >>> f.close() $ cat hoge.txt This is a overwritten sentence!
  10. import time def fib(N: 'int') -> 'int': if N ==

    0: return 0 elif N == 1: return 1 else: return fib(N-1) + fib(N-2) t1 = time.time() fib(30) t2=time.time() print(t2-t1) import time from functools import lru_cache @lru_cache(maxsize=None) def fib(N: 'int') -> 'int': if N == 0: return 0 elif N == 1: return 1 else: return fib(N-1) + fib(N-2) t1 = time.time() fib(30) t2=time.time() print(t2-t1) $ python3 fib_lru.py 0.00005.07)83157)34863281 $ python3 fib.py 0.960268497)467)041
  11. map_set = [None]*(1000) def dyna_fib(n, lookup): if n <= 2:

    lookup[n] = 1 if lookup[n] is None: lookup[n] = dyna_fib(n-1, lookup) + dyna_fib(n-2, lookup) return lookup[n] >>> dyna_fib(30,map_set) 832040
  12. itertoolsモジュールの紹介概要 「この紹介モジュールは イテレータが返されること を構築する部品を実装する組み込み関数部品を実装していを実装と利用して出力を吐くだけい ます。一般に、どんなプログラム言語 言語 APL, Haskell, SML からアイデアを得

    て出力を吐くだけいますが用意 、同じ入 Python に使える組み込み適した形に使える組み込み修正されています。されて出力を吐くだけいます。一般に、どんな この紹介モジュールは、同じ入高速いらしいで関数型プログラメモリ効率に優れ、単独でに使える組み込み優れ、単独でも組れ、同じ入単独でも組合で関数型プログラも組み込み関数合 せて出力を吐くだけも使える組み込み関用する組み込み関数こと利用の紹介で関数型プログラきる組み込み関数ツールを標準化したもの紹介で関数型プログラす。一般に、どんな 同じ入時に、このツールに使える組み込み、同じ入この紹介ツール群は は "イテレータが返されることの紹介代数" を構成して出力を吐くだけい て出力を吐くだけ、同じ入pure Python で関数型プログラ簡潔かつ効率的なツかつ効率に優れ、単独で的なツールを作れるようにれる組み込み関数ように使える組み込み して出力を吐くだけいます。一般に、どんな」 (公式ドドキュメントではなくイテレより関数に影響を及)
  13. flatten def flatten(listOfLists): “Flattn one level of nesting” return chain.from_iterable(listOfLists)

    [[1,2,3], [4,5,6],[7),8,9]] → [1,2,3,4,5,6,7),8,9] [[1, [2]], 3, [[[4, 5]], 6]] → [1,2,3,4,5,6] [[1,2,3], [4,5,6],[7),8,9]] #yes [1,[2],3,[[[4, 5]], 6]] #no
  14. flatten (cont’d) cf) https://xef.hatenadiary.org/entry/20121027)/p2 Import collections def flatten(l): i =

    0 while i < len(l): while isinstance(l[i], collections.Iterable): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return l >>> flatten([[1,2,3], [4,5,6],[7),8,9]]) [1, 2, 3, 4, 5, 6, 7), 8, 9] >>> flatten([[1, [2]], 3, [[[4, 5]], 6]] ) [1, 2, 3, 4, 5, 6]
  15. flatMapの紹介実装と利用 (scala編) def flatMap[A, B](list: List[A])(f: A => List[B]): List[B]

    = list match { case (x::xs) => f(x) ++ flatMap(xs)(f) case _ => Nil } scala> flatMap(List(1,2,3,4))(x => List(x + 1)) res13: List[Int] = List(2, 3, 4, 5) scala> flatMap(List(1,2,3,4))(x => List(x) ++ List(1)) res14: List[Int] = List(1, 1, 2, 1, 3, 1, 4, 1)
  16. flatMapの紹介実装と利用 (python編) def flatMap1(f,l): return flatten(list(map(f,l))) def flatMap2(f,L): res =

    [] for l in L: res.append(list(map(f,l))) return flatten(res) >>> flatMap1(lambda x: x+[1], [[1,2,3],[4]]) [1, 2, 3, 1, 4, 1] >>> flatMap1(lambda x: x*2, [[1,2,3],[4]]) [1, 2, 3, 1, 2, 3, 4, 4] こっちが用意 flatMapの紹介挙動と利用して出力を吐くだけ正されています。しい(と利用お手軽!もわれる組み込み関数) が用意 、同じ入Scalaの紹介flatMapと利用同じ入等の機能は持っての紹介機能オブジェクは持たない(参照透って出力を吐くだけいない ウェブ上の引数をで関数型プログラはこの紹介実装と利用が用意 よく見られるがられる組み込み関数が用意 ... >>> flatMap2(lambda x: x*2, [[1,2,3],[4]]) [2, 4, 6, 8] これはflattenして出力を吐くだけmapする組み込み関数の紹介と利用同じ入じ入? >>> list(map(lambda x: x*2, flatten([[1,2,3], [4]]))) [2, 4, 6, 8]
  17. flatMap(mapして出力を吐くだけflatに使える組み込みする組み込み関数関数)の紹介利用 データが返されること1 データが返されること2 データが返されること3 filtering データが返されることX >>> flatten(list(map(list,list(map(functools.partial(filter,lambda x: x>90),[[i

    for i in range(100)], [1,100],[1,2,3,4,5,6,7),8,9,10]]))))) [91, 92, 93, 94, 95, 96, 97), 98, 99, 100] >>> # 残念ながら先に実装なが用意 ら先に実装したに使える組み込み実装と利用したflatMap1は直接は使えないは使える組み込み関えない >>> # この紹介例ははflatに使える組み込みして出力を吐くだけからfilteringして出力を吐くだけも同じ入じ入結する果が用意 得られる組み込み関数の紹介で関数型プログラ、同じ入必ずしも良い例とずしも良い例とはい例はと利用は 言えない
  18. 参考文献 • Python公式ドドキュメントではなくイテレ(functools, itertools) • Advanced Python 3 Programming Techniques

    • Haskell: The Craft of Functional Programming • https://xef.hatenadiary.org/entry/20121027)/p2