2010/10/5(Tue.) t2y
   2.1 リスト内包表記 P. 62 ~
   2.2 イテレータとジェネレータ                 P. 64 ~

       ジェネレータ、コルーチン、ジェネレータ式
       itertools モジュール
   2.3 デコレータ         P. 76 ~

       引数チェック、キャッシュ、プロキシ、その他
   2.4 with と contextlib       P. 88 ~

       contextlib モジュール
   2.5 まとめ     P. 93 ~
   イテレータ
       繰り返し要素を返すオブジェクトのこと
        for j in [i for i in range(3)]:
           print j                            イテレータ
                                                    ジェネレータ
   ジェネレータ
       yield 文を使用して関数を一時停止させ、途中の
        結果を生成する
         def generator():                 for i in generator():
           for i in [0, 1, 2]:               print i
              yield i
   イテレータを返す関数を提供するモジュール
       islice: ウィンドウイテレータ
           入力イテレータをスライシングしてイテレータを返す
       tee: 前後方イテレータ
           オリジナルの入力イテレータから複数の独立したイテレータ
            を返す(tee コマンド)
       groupby: ユニークイテレータ
           グループ化した値セットのイテレータを返す(uniq コマンド)
       その他の関数
                                    07
           ピュア Python で動作の説明がある
P.75 他の関数
   イテレータを組み合わせる
     itertools の関数を入力イテレータに使用するこ
      とで様々な用途に応用ができそう
                              08
     imap/izip や starmap で連携

     パフォーマンス

           メモリ効率が良いので速くなる
P.76 - 79
   デコレータ(decorator)
     関数やメソッドのラッピング処理の見た目を分かり
      易くする
     デコレータ構文を使用しなくても同処理が書ける

     デコレータの良いプラクティス
                      P.79 Note
           汎用的なラッパーとなる処理
               ラップした関数の引数、返り値を見るようにして、できるだけそ
                の関数の内部を解析しないようにすべき
                関数の pre/post 処理を実装する
                                       09
            


           1つのモジュール内にまとめる
   XML-RPC プロトコル                    P.80 - 81

       引数を取るデコレータ
       デコレータ内の処理結果を使いたいときはグロー
        バル変数を使うしかない?
           関数内部を解析しないようにすべき?

        def xmlrpc(in_=(), out(type(None),)):
          def _xmlrpm(function):
             def __xmlrpc(*args):
                return function(*args)
             retrun __xmlrpc
          return _xmlrpc
P.82 - 84
   キャッシュデコレータ
     関数型プログラミングの特徴
     出力が内部状態の影響を受けない

         引数から必ず一意な結果が算出される
         関数を呼び出さず、キャッシュの値を返す

         やっぱりキャッシュはグローバル変数

       メモ化(memoizing)
         たらいを回すならHaskell
         Python でもチャンレンジしてみよう
P.85
   プロキシデコレータ
     Web フレームワークのセキュリティを確保する仕
      組みに利用される?
     Django での使用例

         login_required デコレータ
         permission_required デコレータ
P.86
   コンテキストデコレータ
       正しい実行コンテキストでの実行を保証
           例) スレッドのロック
   デコレータでなくても with 文でできるよ
       Python 2.6 以降
   Python デコレータライブラリ        P.87
       インスタンスへメソッドを追加する
           こんな状況あるかな?
       引数の情報収集
           Oreilly2sphinx
       ハンドラ登録
           プログラム終了時に実行する
   引数のカッコが省略可能なデコレータの実装方法
P.88-90
   with 文
       try...finally の置き換え
         ファイルを閉じる
         ロックを解除する

         一時的にコードにパッチをあてる

         特定環境で保護されたコードを実行する

   2つのメソッドを実装したプロトコル
       __enter__: with ブロックに入るときに何かする、大抵は self を返す
       __exit__: with ブロックを出るときに何かする、クリーンナップ

            デコレータのコンテキストプロバイダと           10
              同様に pre/post 処理を行う
 with 文のヘルパー関数を提供                        P.91-92
 contextmanager が役に立つ

       yield 文で分割
           yield より前: __enter__ の処理
                yiled が生成した値は as で指定した変数へセット
           yield より後: __exit__ の処理
   closing: close メソッドの呼び出しを保証する
                                                    11
       ストリームを扱うクラスに役立つ、例) urllib.urlopen
   nested: コンテキストを結合してネストされた with を扱う
P.93
 リスト内包表記は便利だよ!
 イテレータとジェネレータで効率的に!

 デコレータで新たなコードパターンが!

 try...finally に代わり with 文を!

エキ Py 読書会02 2章後半

  • 1.
  • 2.
    2.1 リスト内包表記 P. 62 ~  2.2 イテレータとジェネレータ P. 64 ~  ジェネレータ、コルーチン、ジェネレータ式  itertools モジュール  2.3 デコレータ P. 76 ~  引数チェック、キャッシュ、プロキシ、その他  2.4 with と contextlib P. 88 ~  contextlib モジュール  2.5 まとめ P. 93 ~
  • 3.
    イテレータ  繰り返し要素を返すオブジェクトのこと for j in [i for i in range(3)]: print j イテレータ ジェネレータ  ジェネレータ  yield 文を使用して関数を一時停止させ、途中の 結果を生成する def generator(): for i in generator(): for i in [0, 1, 2]: print i yield i
  • 4.
    イテレータを返す関数を提供するモジュール  islice: ウィンドウイテレータ  入力イテレータをスライシングしてイテレータを返す  tee: 前後方イテレータ  オリジナルの入力イテレータから複数の独立したイテレータ を返す(tee コマンド)  groupby: ユニークイテレータ  グループ化した値セットのイテレータを返す(uniq コマンド)  その他の関数 07  ピュア Python で動作の説明がある
  • 5.
    P.75 他の関数  イテレータを組み合わせる  itertools の関数を入力イテレータに使用するこ とで様々な用途に応用ができそう 08  imap/izip や starmap で連携  パフォーマンス  メモリ効率が良いので速くなる
  • 6.
    P.76 - 79  デコレータ(decorator)  関数やメソッドのラッピング処理の見た目を分かり 易くする  デコレータ構文を使用しなくても同処理が書ける  デコレータの良いプラクティス P.79 Note  汎用的なラッパーとなる処理  ラップした関数の引数、返り値を見るようにして、できるだけそ の関数の内部を解析しないようにすべき 関数の pre/post 処理を実装する 09   1つのモジュール内にまとめる
  • 7.
    XML-RPC プロトコル P.80 - 81  引数を取るデコレータ  デコレータ内の処理結果を使いたいときはグロー バル変数を使うしかない?  関数内部を解析しないようにすべき? def xmlrpc(in_=(), out(type(None),)): def _xmlrpm(function): def __xmlrpc(*args): return function(*args) retrun __xmlrpc return _xmlrpc
  • 8.
    P.82 - 84  キャッシュデコレータ  関数型プログラミングの特徴  出力が内部状態の影響を受けない  引数から必ず一意な結果が算出される  関数を呼び出さず、キャッシュの値を返す  やっぱりキャッシュはグローバル変数  メモ化(memoizing)  たらいを回すならHaskell  Python でもチャンレンジしてみよう
  • 9.
    P.85  プロキシデコレータ  Web フレームワークのセキュリティを確保する仕 組みに利用される?  Django での使用例  login_required デコレータ  permission_required デコレータ
  • 10.
    P.86  コンテキストデコレータ  正しい実行コンテキストでの実行を保証  例) スレッドのロック  デコレータでなくても with 文でできるよ  Python 2.6 以降
  • 11.
    Python デコレータライブラリ P.87  インスタンスへメソッドを追加する  こんな状況あるかな?  引数の情報収集  Oreilly2sphinx  ハンドラ登録  プログラム終了時に実行する  引数のカッコが省略可能なデコレータの実装方法
  • 12.
    P.88-90  with 文  try...finally の置き換え  ファイルを閉じる  ロックを解除する  一時的にコードにパッチをあてる  特定環境で保護されたコードを実行する  2つのメソッドを実装したプロトコル  __enter__: with ブロックに入るときに何かする、大抵は self を返す  __exit__: with ブロックを出るときに何かする、クリーンナップ デコレータのコンテキストプロバイダと 10 同様に pre/post 処理を行う
  • 13.
     with 文のヘルパー関数を提供 P.91-92  contextmanager が役に立つ  yield 文で分割  yield より前: __enter__ の処理  yiled が生成した値は as で指定した変数へセット  yield より後: __exit__ の処理  closing: close メソッドの呼び出しを保証する 11  ストリームを扱うクラスに役立つ、例) urllib.urlopen  nested: コンテキストを結合してネストされた with を扱う
  • 14.
    P.93  リスト内包表記は便利だよ!  イテレータとジェネレータで効率的に! デコレータで新たなコードパターンが!  try...finally に代わり with 文を!