私の好きなPython構文 vol.2
#nds4 @civic
お前だれよ
• @civic
• NDS管理者
• Python, Java
このプレゼンのねらい
Pythonへの熱い想いを語って
少しでもPython人口を増やしたい
前回の発表
おさらい
今日帰ってすぐに始められる
Python
Pythonの良さ
かんたん
素直で覚えやすい
人気あり
プログラミング言語
人気ランキング Top10
2015年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'rn' # 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.contextmanager
def テストすっぞ():
print("test setup')
yield
print("test teardown")
with テストすっぞ():
print("テスト中")
# test setup
# テスト中
# test teardown
contextlib.contextmanager
• 前処理・後処理が簡単に記述できた!
• リソースのcloseだけでなく
定型的な前処理・後処理に
• yieldは関数の途中で保留して戻るようなやつ
• yieldについてはまた別の機会に
まとめ
まとめ
• 好きなPython構文として2つ挙げました
• 文字列リテラル(のプレフィックス)
• わかりやすくて表現の幅が広がる
• with文(コンテキストマネージャー)
• 前処理・後処理がきれいに書ける
ご静聴ありがとう
ございました

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

Editor's Notes

  • #18 変数展開については、次のPython3.6で搭載予定
  • #19 具体的な例として、どういう点で分かりやすいかということを紹介
  • #20 正規表現リテラルのあるJavaScriptの場合
  • #21 正規表現ライブラリに文字列でパターンを渡さなければならない
  • #22 raw文字列は正規表現のためのものではないが、文字列の表現の幅が広がる 言語仕様はシンプルに。その代わり豊富な標準ライブラリ
  • #23 PEP498のフォーマット文字列
  • #26 Python2の文字列はバイト列でしかないので、代わりにUnicode文字列というオブジェクトもある
  • #27 2つの文字列があるから、よく発生したエラー!
  • #28 いままでのUnicode文字列が、ふつーに使いたい文字列だからプレフィックスなし たとえば文字列→SJISで表現されたバイト列にしたらbプレフィックスにしよう uリテラルもう要らないよね!
  • #31 ただしつけても、なにも機能しない互換性のためだけに存在
  • #35 f-string
  • #40 コンテキストマネージャーを返すことで、前処理・後処理を実装できて綺麗
  • #42 クラスを作成するのはおっくうでも、関数ならサッと作る気になる