Lightweight Language Weekend ls-lRシェル

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

わんくま同盟 福岡勉強会 #4 yield について るーごん. わんくま同盟 福岡勉強会 #4 自己紹介 日本一人口が少ない県に住んでいます。 一昨年まで、ちょっと福岡に住みました。 仕事は主に dbMAGIC 。 プログラミング言語はよく分かりません。 好きなもの ポケモン、ファイブマン、ジェットマン、
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
なぜ今Pythonか? Pythonをお薦めする18の理由
Generic programming と STL
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
4章 制御の流れ-3.
プログラミング基礎I(再) 山元進.
プログラミング言語としてのR 情報知能学科 白井 英俊.
スレッドの同期と、スレッドの使用例 スレッドの同期 Lockオブジェクト: lockオブジェクトの生成
IE5でアプリケーション開発 東日本計算センター 小野 修司.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
Servlet J2EE I 第8回 /
アルゴリズムとプログラミング (Algorithms and Programming)
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
最適化ソルバーのための Python言語入門
C言語 配列 2016年 吉田研究室.
Ruby勉強会(第1回) 2006/06/29 竹内豪.
オブジェクト指向プログラミング(2) OOPの三大要素 「クラス」「ポリモーフィズム」「継承」
Bottle/Pythonによる Webアプリ入門
情報処理Ⅱ 2005年12月9日(金).
の まとめ 2007/04/02 (Mon) / d;id:hzkr
第20章 Flyweight ~同じものを共有して無駄をなくす~
ピカチュウによる オブジェクト指向入門 (新版)
第7回 条件による繰り返し.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
プログラミング言語入門 手続き型言語としてのJava
B演習(言語処理系演習)第8回 評価器 田浦.
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
Javaによる Webアプリケーション入門 第6回
アルゴリズムとプログラミング (Algorithms and Programming)
2011/06/21-24 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
第7回 条件による繰り返し.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
変数,式,関数,クラス,コンストラクタ, クラスの属性アクセス,メソッド,親クラ スからの継承
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
OpenCV について OpenCV とは OpenCV の Python プログラム例 配列 画像の B, G, R の 3成分
オブジェクト指向プログラミングと開発環境
プログラムの基本構造と 構造化チャート(PAD)
アルゴリズムとデータ構造 2011年7月8日課題の復習
ファイルの読み込み #!/usr/bin/env perl #Perlスクリプトの指定 open(FILE, "food.txt");
統計ソフトウエアRの基礎.
アルゴリズムとプログラミング (Algorithms and Programming)
マイグレーションを支援する分散集合オブジェクト
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
プログラミングⅡ 第2回.
ニューラルテスト理論分析ソフト「neutet」の特徴と使い方
オープンソースソフトウェアに対する コーディングパターン分析の適用
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
精密工学科プログラミング基礎 第7回資料 (11/27実施)
モジュール分割.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
演算子のオーバーロード.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
君ならどうする – ls-lRシェル Python編
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
情報処理Ⅱ 第8回:2003年12月9日(火).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 2 静的変数.
Presentation transcript:

Lightweight Language Weekend ls-lRシェル Iteratorを使おう 日本Pythonユーザ会 石本 敦夫

Iterator パターン GoFによる定義 集約オブジェクトが基にある内部表現を公開せずに、その要素に順にアクセスする方法を提供する Lightweight Language Weekend ls-lRシェル Iterator パターン GoFによる定義 集約オブジェクトが基にある内部表現を公開せずに、その要素に順にアクセスする方法を提供する Iterator Collection Item

Pythonのイテレータ データやアルゴリズムをイテレータでラップし、シーケンスのように順にデータを取得する方法を提供する Iterator Lightweight Language Weekend ls-lRシェル Pythonのイテレータ データやアルゴリズムをイテレータでラップし、シーケンスのように順にデータを取得する方法を提供する Iterator Collection Function File etc,...

Pythonのイテレータ サポート Pythonのステートメントはイテレータを使用するように変更されている Python2.1以前 Lightweight Language Weekend ls-lRシェル Pythonのイテレータ サポート Pythonのステートメントはイテレータを使用するように変更されている Python2.1以前 Python2.2以降 for i in [1,2,3]: print i seq = [1,2,3] n = 0 while True: try: print seq[n] except IndexError: break n += 1 iterator = [1,2,3].__iter__() i = iterator.next() except StopIteration: i, j = (1,2) seq = (1,2) i = seq[0] j = seq[1] iterator = (1,2).__iter__() j = iterator.next()

イテレータインターフェース Iterable - イテレート可能オブジェクト iterator – イテレータオブジェクト Lightweight Language Weekend ls-lRシェル イテレータインターフェース Iterable - イテレート可能オブジェクト 組み込み関数 iter()を使ってイテレータを取得することができるオブジェクト for文などで直接使用することができる Python組み込みのコンテナはすべてIterable イテレータを返すメソッド__iter__() を持つ iterator – イテレータオブジェクト 次の値を返すnext()メソッドを持つ next()で返すオブジェクトがなければ、StopIteration例外を送出する __iter__()メソッドを持ち、自分自身を返す

イテレータの例 Fileイテレータ - ファイルを行のシーケンスとみなし、順に読み込む inFile = open("./foo.txt") Lightweight Language Weekend ls-lRシェル イテレータの例 Fileイテレータ - ファイルを行のシーケンスとみなし、順に読み込む inFile = open("./foo.txt") for line in inFile: print line # 又は fileIter = iter(inFile) print fileIter.next()

イテレータの実装例 class AlterIter: '''seq1, seq2内の要素を交互に返すイテレータ''' Lightweight Language Weekend ls-lRシェル イテレータの実装例 class AlterIter: '''seq1, seq2内の要素を交互に返すイテレータ''' def __init__(self, seq1, seq2): self._seqs = (seq1, seq2) self._cur = 0 self._max = min(len(seq1), len(seq2)) # 最大インデックス値 def __iter__(self): return self def next(self): n, idx = self._cur % 2, self._cur//2 if idx >= self._max: raise StopIteration # iterate終了 ret = self._seqs[n][idx] self._cur += 1 return ret 通常、__init__(), __iter__(), next()は最低限必要 次回の呼び出しに備えて状態を保存しなければならない

AlterIterの使用方法 for ステートメントでイテレータを使用する もちろん、next()メソッドで順次読み出しても良い Lightweight Language Weekend ls-lRシェル AlterIterの使用方法 for ステートメントでイテレータを使用する for v in AlterIter([1,2],['a','b']): print v, 出力 => 1 a 2 b もちろん、next()メソッドで順次読み出しても良い values = AlterIter([1,2],['a','b']) print values.next(),

イテレータのメリット 実際にシーケンスを作成する必要がないため効率が良い 無限長のシーケンスを扱う事ができる Lightweight Language Weekend ls-lRシェル イテレータのメリット 実際にシーケンスを作成する必要がないため効率が良い 無限長のシーケンスを扱う事ができる 呼び出し元の処理がシンプルになる データを取り出すタイミングを呼び出し元で制御できる forループ内で終了条件をチェックする必要がないため、処理がすっきりする

Generator関数 関数定義の形でイテレータを定義 Generator関数は戻り値としてイテレータを返す Lightweight Language Weekend ls-lRシェル Generator関数 関数定義の形でイテレータを定義 Generator関数は戻り値としてイテレータを返す イテレータのnext()は、yield文で指定した値を次々に返す # return ('最初', '2番目', '終わり' )と同じ def gen(): yield '最初' yield '2番目' yield '終わり' # Generetor関数 の呼び出し v = gen() print v.next(), # '最初' print v.next(), # '2番目' print v.next(), # '終わり' # 又は for v in gen(): print v, # 出力 => 最初 2番目 終わり

Generatorの動作 呼び出されると イテレータの一種であるgeneratorオブジェクトを返す Lightweight Language Weekend ls-lRシェル Generatorの動作 呼び出されると イテレータの一種であるgeneratorオブジェクトを返す generatorのnext()メソッドを呼び出すと、関数のyield文までを実行してその値を返す yield文に遭遇せずに関数が終了すると、StopIteration例外を送出する class gen: def __init__(self): self._n = 0 def __iter__(self): return self def next(self): if self._n == 0: return 'A' if self._n == 1: return 'B' raise StopIteration def gen(): yield 'a' yield 'b' 同じ

Generatorのメリット 簡単にイテレータを作成する事ができる 処理状態をどこかに退避する必要がない 速い! Lightweight Language Weekend ls-lRシェル Generatorのメリット 簡単にイテレータを作成する事ができる 処理状態をどこかに退避する必要がない 速い! クラスを使ったイテレータより100%以上速いケースも ほとんどローカル変数のみで実行できる 状態を退避する必要がない

Generator版AlterIter イテレータクラスより簡単 高速! def AlterIter(seq1, seq2): Lightweight Language Weekend ls-lRシェル Generator版AlterIter def AlterIter(seq1, seq2): _max = min(len(seq1), len(seq2)) for idx in range(_max): yield seq1[idx] yield seq2[idx] イテレータクラスより簡単 高速!

Fibonacci数列 def fibonacci(): i = j = 1 yield i yield j while True: Lightweight Language Weekend ls-lRシェル Fibonacci数列 def fibonacci(): i = j = 1 yield i yield j while True: i, j = j, i+j for n in fibonacci(): print n, 出力 => 1 1 2 3 5 8 13 21 34 55 89 ...

イテレータの合成 def odds(iterable): '''奇数のみを返すイテレータ''' for v in iterable: Lightweight Language Weekend ls-lRシェル イテレータの合成 def odds(iterable): '''奇数のみを返すイテレータ''' for v in iterable: if v % 2: yield v def lessThan(iterable, cond): '''cond以下の値のみを返すイテレータ''' if v < cond: seq = [90, 22, 49, 93, 49, 68, 36, 96, 31, 23] for v in odds(lessThan(seq, 50)): print v,

パフォーマンス比較 イテレータの二段重ねでもそれほど遅くはならない 柔軟性とのトレードオフ 結果 test1() test2() Lightweight Language Weekend ls-lRシェル パフォーマンス比較 def test1(seq): for v in lessThan(odds(seq), 50): pass def test2(seq): for v in seq: if (v % 2) and (v < 50): def test3(seq, f): if f(v): # テスト用シーケンス seq = [random.randint(0, 10000) for v in range(1000000)] test1(seq) test2(seq) test3(seq, lambda v: (v < 50) and (v % 2)) 測定環境: Python2.3.3 Windows2000 結果 test1() test2() test3() 0.72秒 0.59秒 1.08秒 イテレータの二段重ねでもそれほど遅くはならない 柔軟性とのトレードオフ

参考リンク PEP 234 Iterators http://www.python.org/peps/pep-0234.html Lightweight Language Weekend ls-lRシェル 参考リンク PEP 234 Iterators http://www.python.org/peps/pep-0234.html PEP 255 Simple Generators http://www.python.org/peps/pep-0255.html

終わりに イテレータを使おう。イテレータはPythonicだ。 Generatorを使おう。Generatorは魔法じゃない。 Lightweight Language Weekend ls-lRシェル 終わりに イテレータを使おう。イテレータはPythonicだ。 Generatorを使おう。Generatorは魔法じゃない。