以下の関数は全て、イテレータを作成して返します。無限長のストリームのイテ レータを返す関数もあり、この場合にはストリームを中断するような関数かルー プ処理から使用しなければなりません。
*iterables) |
def chain(*iterables): for it in iterables: for element in it: yield element
[n]) |
def count(n=0): while True: yield n n += 1
count()はオーバーフローのチェックを行いません。このため、
sys.maxint
を超えると負の値を返します。この動作は将来変更されま
す。
iterable) |
def cycle(iterable): saved = [] for element in iterable: yield element saved.append(element) while saved: for element in saved: yield element
cycleは大きなメモリ領域を使用し ます。使用するメモリ量はiterableの大きさに依存します。
predicate, iterable) |
def dropwhile(predicate, iterable): iterable = iter(iterable) for x in iterable: if not predicate(x): yield x break for x in iterable: yield x
iterable[, key]) |
None
にした場合、key 関数のデフォルトは恒等関数になり
要素をそのまま返します。通常、iterable は
同じキー関数で並べ替え済みである必要があります。
返されるグループはそれ自体がイテレータで、groupby() と iterable を共有しています。もととなるiterable を 共有しているため、groupby オブジェクトの要素取り出しを 先に進めると、それ以前の要素であるグループは見えなくなってしまいます。 従って、データが後で必要な場合にはリストの形で保存しておく必要があります:
groups = [] uniquekeys = [] for k, g in groupby(data, keyfunc): groups.append(list(g)) # Store group iterator as a list uniquekeys.append(k)
groupby() は以下のコードと等価です:
class groupby(object): def __init__(self, iterable, key=None): if key is None: key = lambda x: x self.keyfunc = key self.it = iter(iterable) self.tgtkey = self.currkey = self.currvalue = xrange(0) def __iter__(self): return self def next(self): while self.currkey == self.tgtkey: self.currvalue = self.it.next() # Exit on StopIteration self.currkey = self.keyfunc(self.currvalue) self.tgtkey = self.currkey return (self.currkey, self._grouper(self.tgtkey)) def _grouper(self, tgtkey): while self.currkey == tgtkey: yield self.currvalue self.currvalue = self.it.next() # Exit on StopIteration self.currkey = self.keyfunc(self.currvalue)
predicate, iterable) |
True
となる要素だけを返すイテレータを作成します。
predicateがNone
の場合、値が真であるアイテムだけを返しま
す。この関数は以下のスクリプトと同等です:
def ifilter(predicate, iterable): if predicate is None: predicate = bool for x in iterable: if predicate(x): yield x
predicate, iterable) |
False
となる要素だけを返すイテレータを作成します。
predicateがNone
の場合、値が偽であるアイテムだけを返しま
す。この関数は以下のスクリプトと同等です:
def ifilterfalse(predicate, iterable): if predicate is None: predicate = bool for x in iterable: if not predicate(x): yield x
function, *iterables) |
None
の場合、引数のタプルを返します。
map()と似ていますが、最短のiterableの末尾まで到達した後は
None
を補って処理を続行するのではなく、終了します。これは、
map()に無限長のイテレータを指定するのは多くの場合誤りですが
(全出力が評価されてしまうため)、imap()の場合には一般的で役
に立つ方法であるためです。この関数は以下のスクリプトと同等です:
def imap(function, *iterables): iterables = map(iter, iterables) while True: args = [i.next() for i in iterables] if function is None: yield tuple(args) else: yield function(*args)
iterable, [start,] stop [, step]) |
None
であれば、無限に、もしく
はiterableの全要素を返すまで値を返します。None
以外ならイテレー
タは指定された要素位置で停止します。通常のスライスと異なり、
start、stop、stepに負の値を指定する事はできません。
シーケンス化されたデータから関連するデータを取得する場合(複数行からなるレ
ポートで、三行ごとに名前が指定されている場合など)に使用します。この関
数は以下のスクリプトと同等です:
def islice(iterable, *args): s = slice(*args) it = iter(xrange(s.start or 0, s.stop or sys.maxint, s.step or 1)) nexti = it.next() for i, element in enumerate(iterable): if i == nexti: yield element nexti = it.next()
startがNone
ならば、繰返しは0から始まります。
stepがNone
ならば、ステップは1となります。
バージョン 2.5 で 変更 された仕様:
startとstepはデフォルト値として
None
を受け付けます。
*iterables) |
def izip(*iterables): iterables = map(iter, iterables) while iterables: result = [it.next() for it in iterables] yield tuple(result)
バージョン 2.4 で 変更 された仕様: イテレート可能オブジェクトを指定しない場合、 TypeError例外を送出する代わりに長さゼロのイテレータを返し ます。
イテレート可能オブジェクトの左から右への評価順序は保証されることに注意 して下さい。このことによって、データ列を長さnのグループにまとめる常套 句 "izip(*[iter(s)]*n)" が実現可能になります。長さnのグループにま とめるのに中途半端なデータ列に対しては "izip(*[chain(s, [None]*(n-1))]*n)" のように、最後のタプルを埋める値をあらかじめ準備し ておくことができます。
もう一つの注意は izip() が長さが不揃いの入力に対して呼ばれた
時、izip() 終了の後引き続いて長い方のイテレート可能オブジェ
クトを呼び出した結果は保証の限りではないということです。可能性として、
残ったそれぞれのイテレート可能オブジェクトから値が一つ失われているかも
しれないし失われていないかもしれません。これは次のようにして起こります。
実行中にそれぞれのイテレート可能オブジェクトから一つずつ値を取り出しま
すが、その処理がいずれかのイテレート可能オブジェクトが空になることによ
り終了します。この時途中まで取り出された値たちは宙に浮きます(不完全なタ
プルとして送り出されることもなく、また次の it.next()
のためにイ
テレート可能オブジェクトに押し戻すこともできません)。一般に、
izip() を長さが不揃いな入力に使うのは、残され使われなかった
長い方のイテレート可能オブジェクトの値を気にしない時だけにするべきです。
object[, times]) |
def repeat(object, times=None): if times is None: while True: yield object else: for i in xrange(times): yield object
function, iterable) |
function(a,b)
、starmap()では
function(*c)
のように呼び出します。この関数は以下のスクリプトと
同等です:
def starmap(function, iterable): iterable = iter(iterable) while True: yield function(*iterable.next())
predicate, iterable) |
def takewhile(predicate, iterable): for x in iterable: x = iterable.next() if predicate(x): yield x else: break
iterable[, n=2]) |
n==2
の場合は、以下のコードと等価になります:
def tee(iterable): def gen(next, data={}, cnt=[0]): for i in count(): if i == cnt[0]: item = data[i] = next() cnt[0] += 1 else: item = data.pop(i) yield item it = iter(iterable) return (gen(it.next), gen(it.next))
一度tee() でイテレータを分割すると、もとの iterable を他で使ってはならなくなるので注意してください; さもなければ、 tee オブジェクトの知らない間にiterable が先の要素に 進んでしまうことになります。
teeはかなり大きなメモリ領域を使用します (使用するメモリ量はiterableの大きさに依存します)。 一般には、一つのイテレータが他のイテレータよりも先に ほとんどまたは全ての要素を消費するような場合には、tee() よりもlist() を使った方が高速です。 バージョン 2.4 で 新たに追加 された仕様です。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。