Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

私の好きなPython構文 vol.2 #nds46

1,498 views

Published on

Pythonの文字列リテラル、with文について

Published in: Technology
  • Be the first to comment

  • Be the first to like this

私の好きなPython構文 vol.2 #nds46

  1. 1. 私の好きなPython構文 vol.2 #nds4 @civic
  2. 2. お前だれよ • @civic • NDS管理者 • Python, Java
  3. 3. このプレゼンのねらい Pythonへの熱い想いを語って 少しでもPython人口を増やしたい
  4. 4. 前回の発表 おさらい
  5. 5. 今日帰ってすぐに始められる Python
  6. 6. Pythonの良さ
  7. 7. かんたん
  8. 8. 素直で覚えやすい
  9. 9. 人気あり
  10. 10. プログラミング言語 人気ランキング Top10 2015年8月 GitHub発表 http://goo.gl/160eHH
  11. 11. Python人気は? • 4位 PHP • 5位 Python • 6位 CSS • 7位 C++ • 8位 C# • 9位 C • 10位 HTML • 1位 JavaScript • 2位 Java • 3位 Ruby
  12. 12. 好きなPython構文 vol.1
  13. 13. デコレータについて 紹介しました 詳しくはこちら www.slideshare.net/fbcivic/lt-python-nds45
  14. 14. 今日話す内容
  15. 15. 好きなPython構文 vol.2 文字列リテラル with文 (コンテキストマネージャー)
  16. 16. 文字列リテラル
  17. 17. 文字列リテラル 基本 'Hello' # シングルクォート "World" # ダブルクォート • 普通な感じ • 変数の展開などはしない • format関数 • %
  18. 18. 文字列リテラルのプレフィックス • プレフィックスで意味が変わる b'abc' # バイト列 ≠ 文字列 r'rn' # raw文字列(エスケープなし) u'あいう' # Unicode文字列 #(python2のみ。3.3以降ではuは不要) リテラルの記号を増やすことなく、アルファベット1字で 様々なリテラルを表現できてわかりやすい!好き!
  19. 19. 正規表現リテラルなど不要! • Pythonでは正規表現は言語仕様になく、 標準ライブラリ。正規表現リテラルはない。 • JavaScriptの正規表現リテラル // nにマッチするか? test_string.match(/n/); // にマッチするか? test_string.match(//);
  20. 20. Javaの場合 • 同様に正規表現が標準ライブラリで提供されるJava の場合 • Javaの場合 // nにマッチするか? test_string.matches("n"); // にマッチするか? test_string.matches(""); 文字列でパターンを表現するので、正規表現としてのエ スケープ文字と文字列リテラルのエスケープが重なる
  21. 21. Pythonの場合 • raw文字列を使えばさほど問題ない • Pythonの場合 // nにマッチするか? re.match(r"n", test_string) // にマッチするか? re.match(r"", test_string); raw文字列 r""→エスケープ無効な文字列リテラル 言語仕様に正規表現リテラルを含めなくてもライブラリ で十分!→シンプル!
  22. 22. 文字列リテラルのプレフィックス • 記号を使わずに文字列リテラルをたくさん表現できる "abc" 文字列 r"n" raw文字列 b"abc" バイト列 u"あいう" Unicode文字列 (Python2) f"Hello! {name}" 変数展開できるやつ (Python3.6予定)
  23. 23. 余談ですが
  24. 24. Python2と3の文字列(闇)
  25. 25. Python2の文字列 • Python2の文字列リテラルはバイト列 なんらかのエンコードの文字列→バイト列 • 文字単位で数えたりするには、 なんらかのエンコードのバイト列では扱いにくい →Unicode文字列もあるよ "Hello" # 文字列(バイト列) u"Hello" # Unicode文字列
  26. 26. 混ぜるな危険!! Python2の 文字列 vs Unicode文字列 UnicodeDecodeError: 'ascii' 〜
  27. 27. 安心してください Python3では自然な感じに Python2 意味 Python3 "abc" バイト列 b"abc" u"abc" Unicode文字列 "abc" • 自然になったが互換性が... • u" "リテラルはもう付けなくてもいいから不要!
  28. 28. Python3.0では u""は廃止!
  29. 29. Python2の u""が 全部使えなくなった! 互換性ヤバい!
  30. 30. ゴメン! やっぱりPython3.3から u"" 復活させるわ!
  31. 31. お分かり いただけただろうか?
  32. 32. えっと... Pythonの文字列リテラルが 好きだって話だった
  33. 33. このプレゼンのねらい(再) Pythonへの熱い想いを語って 少しでもPython人口を増やしたい
  34. 34. 文字列リテラル まとめ • 3になってからは自然な感じ • プレフィックスで表現できて便利 • 記号よりわかりやすい • Python3.6で新しい文字列リテラル f"Hello {name}" # フォーマット文字列 https://docs.python.org/3.6/whatsnew/3.6.html#pep-498- formatted-string-literals
  35. 35. 今日2つめの 好きな構文
  36. 36. with文 コンテキストマネージャー
  37. 37. with文 • コンテキストを扱う便利な構文(雑) with open('hoge.txt', 'w') as f: f.write('Hello World') # withブロックを抜けるとファイルをclose 「ファイルを開いた」というコンテキストで処理を記述
  38. 38. Javaでいうところの • try-with-resource try (Write w = new FileWriter(path)) { //ファイル処理 } • Javaの場合はAutoClosableインターフェースを 実装したオブジェクトを返す • Pythonの場合はコンテキストマネージャー型
  39. 39. コンテキストマネージャー型 • __enter__と__exit__メソッドをもつオブジェクト class Hoge(): def __enter__(self): print("Enter") def __exit__(self, exc_type, exc_value, traceback): print("Exit") with Hoge(): print("Hello") # Enter # Hello # Exit コードブロックの入り口と出口
  40. 40. もう少しかんたんに
  41. 41. contextlibモジュール • コンテキストマネージャー型のクラスつくるの メンドクサ → contextlibでお手軽に @contextlib.contextmanager def テストすっぞ(): print("test setup') yield print("test teardown") with テストすっぞ(): print("テスト中") # test setup # テスト中 # test teardown
  42. 42. contextlib.contextmanager • 前処理・後処理が簡単に記述できた! • リソースのcloseだけでなく 定型的な前処理・後処理に • yieldは関数の途中で保留して戻るようなやつ • yieldについてはまた別の機会に
  43. 43. まとめ
  44. 44. まとめ • 好きなPython構文として2つ挙げました • 文字列リテラル(のプレフィックス) • わかりやすくて表現の幅が広がる • with文(コンテキストマネージャー) • 前処理・後処理がきれいに書ける
  45. 45. ご静聴ありがとう ございました

×