Slide 1

Slide 1 text

Pythonを書いていて おーマジかーと感じたあれこれ 2019/4/5 esm_LT 4th

Slide 2

Slide 2 text

はじめに Pythonをちょっとだけ書いていて、感じたあれこれです 違和感を覚えたところが中心になっているので、批判しているように 見えますが特にPythonを貶めたい意図がある訳ではありません。 これから機械学習の勉強でも始めてみようかという方の一助となれ ば幸いです。

Slide 3

Slide 3 text

コロン重要 def foo(x): if (x % 15 == 0): return 'FizzBuzz' if (x % 3 == 0): return 'Fizz' if (x % 5 == 0): return 'Buzz' Pythonはインデントでブロックを見るもの と思っていたけれど、ブロックの開始はコ ロンを見ている

Slide 4

Slide 4 text

self重要 class Foo: def bar(x): return x * x def baz(self, y): return y ** y クラスメソッド インスタンスメソッド

Slide 5

Slide 5 text

変数のスコープ x = 10 def foo(): return x foo() => 10 x = 10 def bar(): tmp = x x = 0 return x bar() => どうなる?

Slide 6

Slide 6 text

変数のスコープ x = 10 def foo(): return x foo() => 10 x = 10 def bar(): tmp = x x = 0 return x bar() => エラー in bar() 7 8 def bar(): ----> 9 tmp = x 10 x = 0 11 return x UnboundLocalError: local variable 'x' referenced before assignment

Slide 7

Slide 7 text

変数のスコープ x = 10 def foo(): return x foo() => 10 x = 10 def bar(): tmp = x x = 0 return x bar() => エラー in bar() 7 8 def bar(): ----> 9 tmp = x 10 x = 0 11 return x UnboundLocalError: local variable 'x' referenced before assignment 代入がある時点でローカル変数と判定される

Slide 8

Slide 8 text

変数のスコープ x = 10 def foo(): return x foo() => 10 x = 10 def bar(): tmp = x x = 0 return x bar() => エラー in bar() 7 8 def bar(): ----> 9 tmp = x 10 x = 0 11 return x UnboundLocalError: local variable 'x' referenced before assignment 代入がある時点でローカル変数と判定される でもローカル変数がまだ定義されてない!!

Slide 9

Slide 9 text

いっぽうその頃Rubyは… x = 10 foo = -> { tmp = x x = 0 return x } foo.call() => 0 x => 0

Slide 10

Slide 10 text

いっぽうその頃Rubyは… x = 10 foo = -> { tmp = x x = 0 return x } foo.call() => 0 x => 0 いつもどおりのゆるふわ具合で安心(?)

Slide 11

Slide 11 text

いっぽうその頃Rubyは… x = 10 foo = -> { tmp = x x = 0 return x } foo.call() => 0 x => 0 いつもどおりのゆるふわ具合で安心(?) この辺は好みもあるとは思いますが

Slide 12

Slide 12 text

変数のスコープ(その2) class Hoge: hoge = 10 def setHoge(self, x): self.hoge = x def getHoge(self): return self.hoge hoge1 = Hoge() hoge1.setHoge(20) hoge1.getHoge() => 20 hoge2 = Hoge() hoge2.setHoge(30) print(hoge2.getHoge()) => 30

Slide 13

Slide 13 text

変数のスコープ(その2) class Fuga: fuga = [10] def addFuga(self, x): self.fuga.append(x) def getFuga(self): return self.fuga fuga1 = Fuga() fuga1.addFuga(20) print(fuga1.getFuga()) => どうなる? fuga2 = Fuga() fuga2.addFuga(30) print(fuga2.getFuga()) => どうなる?

Slide 14

Slide 14 text

変数のスコープ(その2) class Fuga: fuga = [10] def addFuga(self, x): self.fuga.append(x) def getFuga(self): return self.fuga fuga1 = Fuga() fuga1.addFuga(20) print(fuga1.getFuga()) => [10, 20] fuga2 = Fuga() fuga2.addFuga(30) print(fuga2.getFuga()) => [10, 20, 30]

Slide 15

Slide 15 text

変数のスコープ(その2) class Fuga: fuga = [10] def addFuga(self, x): self.fuga.append(x) def getFuga(self): return self.fuga fuga1 = Fuga() fuga1.addFuga(20) print(fuga1.getFuga()) => [10, 20] fuga2 = Fuga() fuga2.addFuga(30) print(fuga2.getFuga()) => [10, 20, 30] なぜ20!?

Slide 16

Slide 16 text

変数のスコープ(その2) class Hoge: hoge = 10 def setHoge(self, x): self.hoge = x def getHoge(self): return self.hoge class Fuga: fuga = [10] def addFuga(self, x): self.fuga.append(x) def getFuga(self): return self.fuga

Slide 17

Slide 17 text

変数のスコープ(その2) class Hoge: hoge = 10 def setHoge(self, x): self.hoge = x def getHoge(self): return self.hoge class Fuga: fuga = [10] def addFuga(self, x): self.fuga.append(x) def getFuga(self): return self.fuga インスタンスメソッド内で代入されて いるので、hogeはインスタンス変数 と解釈される

Slide 18

Slide 18 text

変数のスコープ(その2) class Hoge: hoge = 10 def setHoge(self, x): self.hoge = x def getHoge(self): return self.hoge class Fuga: fuga = [10] def addFuga(self, x): self.fuga.append(x) def getFuga(self): return self.fuga インスタンスメソッド内で代入されて いるので、hogeはインスタンス変数 と解釈される インスタンスメソッド内で代入されて いないので、fugaはクラス変数と解 釈される

Slide 19

Slide 19 text

式と文 一般的に… 値を持つのが式  算術計算、関数呼び出し etc... 値を持たないのが文  代入、if文 、while etc...

Slide 20

Slide 20 text

式と文 一般的に… 文には複数の式を含めることができるが、 式には文を含めることができない

Slide 21

Slide 21 text

式と文 (lambda x: (tmp = x))(10) File "", line 1 (lambda x: (tmp = x))(10) ^ SyntaxError: invalid syntax

Slide 22

Slide 22 text

式と文 (lambda x: (tmp = x))(10) File "", line 1 (lambda x: (tmp = x))(10) ^ SyntaxError: invalid syntax lambda式の中に代入文は書けない

Slide 23

Slide 23 text

いっぽうその頃Rubyは… 1 + (tmp = 10) + 100 => 111

Slide 24

Slide 24 text

いっぽうその頃Rubyは… 1 + (tmp = 10) + 100 => 111 Rubyの代入は式なので式の中に書 ける これはむしろRubyが特殊なのだけれど、代入や if などが式であることで、文法上の自由度が非常に 高くなっている

Slide 25

Slide 25 text

組み込み関数… array = [1, 2, 3, 4, 5] len(array) => 5

Slide 26

Slide 26 text

組み込み関数… array = [1, 2, 3, 4, 5] len(array) => 5 歴史的経緯なのでしょうが、 Arrayが自分の長さを 返せない

Slide 27

Slide 27 text

条件演算… x = 10 tmp = x if (x > 5) else 0 tmp => 10

Slide 28

Slide 28 text

条件演算… x = 10 tmp = x if (x > 5) else 0 tmp => 10 これ、読みやすいのだろうか …

Slide 29

Slide 29 text

Boolean if (1): 'true' else: 'false' => true if (0): 'true' else: 'false' => false

Slide 30

Slide 30 text

リスト内包表記 [i for i in [1, 2, 3, 4, 5, 6, 7] if i % 2] => [1, 3, 5, 7]

Slide 31

Slide 31 text

リスト内包表記 [i for i in [1, 2, 3, 4, 5, 6, 7] if i % 2] => [1, 3, 5, 7] これは便利(Rubyにも欲しい)

Slide 32

Slide 32 text

リスト内包表記 [i for i in [1, 2, 3, 4, 5, 6, 7] if i % 2] => [1, 3, 5, 7] これは便利(Rubyにも欲しい) リスト内包表記は、関数言語からの輸入だと思わ れる。 関数言語界隈では、集合から写像を作るみたい な説明をされていることが多い。

Slide 33

Slide 33 text

リスト内包表記 [i for i in [1, 2, 3, 4, 5, 6, 7] if i % 2] => [1, 3, 5, 7] これは便利(Rubyにも欲しい) リスト内包表記は、関数言語からの輸入だと思わ れる。 関数言語界隈では、集合から写像を作るみたい な説明をされていることが多い。 Python界隈では便利な書き方ぐらいにとらえてい る人が多いっぽい?

Slide 34

Slide 34 text

まとめ いろいろ書いたけど、Pythonにだって良いところはあります! numpyがあるとか… リスト内包表記があるとか…