Tutte le seguenti funzioni del modulo costruiscono e restituiscono iteratori. Alcune forniscono flussi di lunghezza infinita, percui dovrebbero essere utilizzate solo da funzioni o cicli che troncano il flusso.
| *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
Notate, count() non esegue controlli di overflow e
restituisce numeri negativi dopo aver superato sys.maxint.
Questo comportamento potrebbe cambiare in futuro.
| iterable) |
def cycle(iterable):
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
Notate, questo � l'unico membro del toolkit che pu� richiedere un notevole spazio di memoria (in funzione della lunghezza della sequenza).
| 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,
il valore predefinito di key � la funzione identica che
restituisce l'elemento immutato. Generalmente, l'iterabile deve gi�
essere ordinato con la stessa funzione chiave.
Il gruppo restituito � esso stesso un iteratore che condivide l'iterabile sottostante con groupby(). Poich� la sorgente � condivisa, quando l'oggetto groupby viene fatto avanzare, il gruppo precedente non � pi� visibile. Quindi, se i dati sono necessari in seguito, devono essere memorizzati in una lista:
groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
groups.append(list(g)) # Salva l'iteratore di gruppo come lista.
uniquekeys.append(k)
groupby() � equivalente a:
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() # Esce da 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() # Esce da StopIteration
self.currkey = self.keyfunc(self.currvalue)
| predicate, iterable) |
True. Se
il predicato, predicate, � None, restituisce gli
elementi che sono veri. Equivalente a:
def ifilter(predicate, iterable):
if predicate is None:
predicate = bool
for x in iterable:
if predicate(x):
yield x
| predicate, iterable) |
False. Se
predicate � None, restituisce gli elementi
che sono falsi. Equivalente a:
def ifilterfalse(predicate, iterable):
if predicate is None:
predicate = bool
for x in iterable:
if not predicate(x):
yield x
| function, *iterables) |
None, allora imap() restituisce gli
argomenti come una tupla. È simile a map() ma si
interrompe quando l'iterabile pi� breve si � esaurito, invece che
riempire di None gli iterabili pi� corti. Il motivo
della differenza � che argomenti di iteratori infiniti
in genere mandano in errore map() (poich� l'output viene valutato
completamente) ma rappresenta una via comune e comoda per fornire
argomenti a imap(). Equivalente a:
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, l'iterazione continua
fino all'esaurimento dell'iteratore, altrimenti si ferma
alla posizione specificata. Diversamente dall'affettamento regolare,
islice() non supporta valori negativi per start,
stop o step. Questo metodo pu� venire usato per estrarre
campi specifici da dati che presentano una struttura interna appiattita (per
esempio, un rapporto multi-linea pu� presentare un campo nome
ogni tre linee). Equivalente a:
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)
Modificato nella versione 2.4: Se non vengono specificati iterables, il metodo restituisce un iteratore di lunghezza zero invece di sollevare un'eccezione 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) e function(*c). Equivalente a:
def starmap(function, iterable):
iterable = iter(iterable)
while True:
yield function(*iterable.next())
| predicate, iterable) |
def takewhile(predicate, iterable):
for x in iterable:
if predicate(x):
yield x
else:
break
| iterable[, 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))
Notate, una volta che tee() ha fatto una suddivisione, l'iterabile iterable originale non dovrebbe essere pi� usato altrove; altrimenti iterable potrebbe venire fatto avanzare senza che gli oggetti di tee() ne siano informati.
Notate, questo membro del toolkit potrebbe richiedere un notevole spazio di memoria (a seconda della quantit� di dati temporanei che � necessario immagazzinare). In genere, se un iteratore dovr� utilizzare tutti o gran parte i dati prima dell'altro iteratore, � pi� veloce l'utilizzo di list() piuttosto che di tee(). Nuovo nella versione 2.4.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.