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