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

Pythonを書いていておーマジかーと感じたあれこれ

kunou
April 05, 2019

 Pythonを書いていておーマジかーと感じたあれこれ

kunou

April 05, 2019
Tweet

More Decks by kunou

Other Decks in Technology

Transcript

  1. コロン重要 def foo(x): if (x % 15 == 0): return

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

    baz(self, y): return y ** y クラスメソッド インスタンスメソッド
  3. 変数のスコープ x = 10 def foo(): return x foo() =>

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

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

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

    10 x = 10 def bar(): tmp = x x = 0 return x bar() => エラー <ipython-input-50-565584f722f4> in bar() 7 8 def bar(): ----> 9 tmp = x 10 x = 0 11 return x UnboundLocalError: local variable 'x' referenced before assignment 代入がある時点でローカル変数と判定される でもローカル変数がまだ定義されてない!!
  7. いっぽうその頃Rubyは… x = 10 foo = -> { tmp =

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

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

    x x = 0 return x } foo.call() => 0 x => 0 いつもどおりのゆるふわ具合で安心(?) この辺は好みもあるとは思いますが
  10. 変数のスコープ(その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
  11. 変数のスコープ(その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()) => どうなる?
  12. 変数のスコープ(その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]
  13. 変数のスコープ(その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!?
  14. 変数のスコープ(その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
  15. 変数のスコープ(その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はインスタンス変数 と解釈される
  16. 変数のスコープ(その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はクラス変数と解 釈される
  17. 式と文 (lambda x: (tmp = x))(10) File "<ipython-input-67-09db41500918>", line 1

    (lambda x: (tmp = x))(10) ^ SyntaxError: invalid syntax
  18. 式と文 (lambda x: (tmp = x))(10) File "<ipython-input-67-09db41500918>", line 1

    (lambda x: (tmp = x))(10) ^ SyntaxError: invalid syntax lambda式の中に代入文は書けない
  19. いっぽうその頃Rubyは… 1 + (tmp = 10) + 100 => 111

    Rubyの代入は式なので式の中に書 ける これはむしろRubyが特殊なのだけれど、代入や if などが式であることで、文法上の自由度が非常に 高くなっている
  20. 組み込み関数… array = [1, 2, 3, 4, 5] len(array) =>

    5 歴史的経緯なのでしょうが、 Arrayが自分の長さを 返せない
  21. 条件演算… x = 10 tmp = x if (x >

    5) else 0 tmp => 10 これ、読みやすいのだろうか …
  22. リスト内包表記 [i for i in [1, 2, 3, 4, 5,

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

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

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

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