以下の関数は全て、イテレータを作成して返します。無限長のストリームのイテ レータを返す関数もあり、この場合にはストリームを中断するような関数かルー プ処理から使用しなければなりません。
*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
にした場合、デフォルトはオブジェクトのアイデンティティ
関数をになり、要素をそのまま返します。通常、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) next, stop, step = s.start or 0, s.stop, s.step or 1 for cnt, element in enumerate(iterable): if cnt < next: continue if stop is not None and cnt >= stop: break yield element next += step
*iterables) |
def izip(*iterables): iterables = map(iter, iterables) while iterables: result = [i.next() for i in iterables] yield tuple(result)
バージョン 2.4 で 変更 された仕様: イテレート可能オブジェクトを指定しない場合、TypeError 例外を送出する代わりに長さゼロのイテレータを返します。
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() を使った方が高速です。 tee(). バージョン 2.4 で 新たに追加 された仕様です。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。