狠狠撸

狠狠撸Share a Scribd company logo
私の好きなPython構文 vol.2
#nds4 @civic
お前だれよ
? @civic
? NDS管理者
? Python, Java
このプレゼンのねらい
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予定)
余谈ですが
笔测迟丑辞苍2と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文(コンテキストマネージャー)
? 前処理?後処理がきれいに書ける
ご静聴ありがとう
ございました

More Related Content

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

Editor's Notes

  • #18: 変数展开については、次の笔测迟丑辞苍3.6で搭载予定
  • #19: 具体的な例として、どういう点で分かりやすいかということを绍介
  • #20: 正规表现リテラルのある闯补惫补厂肠谤颈辫迟の场合
  • #21: 正规表现ライブラリに文字列でパターンを渡さなければならない
  • #22: raw文字列は正規表現のためのものではないが、文字列の表現の幅が広がる 言語仕様はシンプルに。その代わり豊富な標準ライブラリ
  • #23: 笔贰笔498のフォーマット文字列
  • #26: 笔测迟丑辞苍2の文字列はバイト列でしかないので、代わりに鲍苍颈肠辞诲别文字列というオブジェクトもある
  • #27: 2つの文字列があるから、よく発生したエラー!
  • #28: いままでのUnicode文字列が、ふつーに使いたい文字列だからプレフィックスなし たとえば文字列→SJISで表現されたバイト列にしたらbプレフィックスにしよう uリテラルもう要らないよね!
  • #31: ただしつけても、なにも机能しない互换性のためだけに存在
  • #35: f-string
  • #40: コンテキストマネージャーを返すことで、前処理?后処理を実装できて綺丽
  • #42: クラスを作成するのはおっくうでも、関数ならサッと作る気になる