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

内包表記とPythonとOption

 内包表記とPythonとOption

LT駆動開発21 - 闇夜深し輝け稲妻の語りの発表資料です。
https://github.com/LTDD/Sessions/wiki/LT%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA21

1a679952cdf455ecd6a15cbde7ae80d5?s=128

Tomohiko Himura

December 06, 2015
Tweet

Transcript

  1. 内包表記とPython とOption 2015-12-06 LTۦಈ։ൃ21

  2. ͻΉΒ ͱ΋ͻ͜ Python νϣοτΧΠλίτΞϧ

  3. https://twitter.com/eielh/status/655420985001185280 できませんでした

  4. 告知 すごいツール活用 すごい議事録 すごい現場 すごいスパイラル

  5. None
  6. None
  7. ಺แදهͱPython

  8. Pythonといえば…?

  9. 内包表記 というわけでもないけど

  10. 復習

  11. None
  12. 内包と外延

  13. 内包と外延 • 内包: 性質をかく • 10までの偶数 • 外延: 全部かく •

    2 4 6 8
  14. 例題 二つの袋X,Yがあります。 Xには1と2の二枚のカードがあります。 YにはAとBのの二枚のカードがあります。 XとYからそれぞれ1枚づつカードをとりだしたとき の組合せをすべて書き出しなさい。

  15. 内包と外延 • 内包: 性質をかく • [ (x, y) | x

    <- [1,2], y <- ["A","B"]] • 外延: 全部かく • [(1, "A"), (1, "B"), (2, "A"), (2, "B")]
  16. python [ (x,y) for x in [1, 2] for y

    in ["A", "B"] ]
  17. それScalaのfor式でもできるよ

  18. Scala for { x <- Seq(1,2) y <- Seq("A","B") }

    yield (x, y)
  19. 話は変わるけど

  20. Option

  21. x と y に値があったとき足し算をする それ以外のときは値は返さない関数

  22. def add(x, y): if x != None: if y !=

    None: return x + y add(1,2) # => 3 add(None, 2) # => None add(1, None) # => None
  23. それScalaならforでできるよ

  24. def add(x: Option[Int], y: Option[Int]): Option[Int] = for { x_

    <- x y_ <- y } yield x_ + y_ add(Some(1), Some(2)) // => Some(3) add(Some(1), None) // => None add(None, Some(2) // => None
  25. ຊ୊

  26. > それ Python でもできるよ <

  27. 前準備 Optionクラスを用意

  28. class Option: def __init__(self, value): self.value = value def __iter__(self):

    return self def next(self): if self.value == None: raise StopIteration else: ret = self.value self.value = None return ret def __str__(self): if self.value == None: return "Nothing" else: return "Some(%d)" % self.value
  29. def add(x, y): return [ x_+ y_ for x_ in

    x for y_ in y ] add(Option(1), Option(2)) # => [3] add(Option(1), Option(None)) # => [] add(Option(None), Option(2)) # => []
  30. やったぜ!

  31. class Option: def __init__(self, value): self.value = value def __iter__(self):

    return self def next(self): if self.value == None: raise StopIteration else: ret = self.value self.value = None return ret def __str__(self): if self.value == None: return "Nothing" else: return "Some(%d)" % self.value
  32. ところで

  33. Optionとかつくらなくても 要素1のリストと空のリストで 代用できるんじゃね?

  34. それは言わない約束でしょ。 おばあちゃん。

  35. add([1], [2]) # => [3] add([1], []) # => []

    add([], [2]) # => []
  36. ·ͱΊ

  37. まとめ • 内包表記 • __iter__やnextを実装すればユーザ定義クラス でも • 巷で流行のOption • 要素1個または要素0個のリストの集合みたいな

    もんだ