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 kunou kunou
April 05, 2019

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

Avatar for kunou

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界隈では便利な書き方ぐらいにとらえてい る人が多いっぽい?