Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Iterator und Itertools-Modul

Python-Iterator und Itertools-Modul

高洛峰
高洛峰Original
2017-02-22 10:28:401561Durchsuche

Iterator In Python besteht das Iteratorprotokoll darin, die __iter()-Methode und die next()-Methode des Objekts zu implementieren, wobei ersteres das Objekt selbst zurückgibt, das das zurückgibt nächstes Element des Containers. Objekte, die diese beiden Methoden implementieren, sind iterierbare Objekte. Iteratoren sind träge und werden nur bei Verwendung generiert, was Vorteile bei der Verarbeitung großer Datenmengen bietet, im Gegensatz zum gleichzeitigen Schreiben aller Daten in den Speicher. Unten habe ich selbst einen Iterator geschrieben. Sie können sehen, dass Sie eine for-Schleife verwenden können, um den von Ihnen geschriebenen Iterator zu verarbeiten. Für Objekte, die das Iterator-Protokoll implementieren, können Sie jedes Iterator-Tool verwenden, das einer for-Schleife ähnelt. Wenn man sich jedoch die Ausgabe unten ansieht, ist die zweite Ausgabe leer. Warum ist das so? Wenn wir eine Liste verwenden, können wir dasselbe Objekt mehrmals ausgeben. Was ist der Unterschied zwischen dieser und einem Objekt, das sein eigenes Iteratorprotokoll implementiert?

class it(object):

def __init__(self, n):

self.a = 0
self.n = n

def __iter__(self):
return self
<br/>
def next(self):
if self.a < self.n:
self.a += 1
return self.a
else : Raise Stopiteration

I = it (5)
for j in i:
PRINT J,
PRINT '
PRINT' ------ >for j in i:
print j
# 1 2 3 4 5
# ------
Nach dem Studium habe ich gelernt, dass Listen- und andere Arten von Iteratoren einen Iterator zurückgeben Das Objekt wird nicht selbst zurückgegeben . Dann habe ich zum Testen den folgenden Code geschrieben. Wie Sie dem Ausdruck entnehmen können, können Objekte wie TestIt wiederholt verwendet werden. Es stellt sich also noch eine andere Frage: Ist ein Objekt, das die next()-Methode nicht implementiert, immer noch ein Iteratorobjekt? Dies liegt daran, dass bei Verwendung der it-Klasse ein Iteratorobjekt zurückgegeben wird und die Iterationsfunktion mithilfe des it-Iterators implementiert wird, was der Implementierung des Iteratorprotokolls entspricht. Das Iterator-Protokoll ist in Python sehr nützlich. Es gibt ein Modul itertools über Iteratoren. Jetzt werde ich etwas über das Modul itertools erfahren und sehen, welche Überraschungen es gibt!


itertools

class TestIt(object):
def __init__(self, a):
self.a = a 
def __iter__(self):
return it(self.a)

Unendlicher Iterator

1 count(), akzeptiert zwei Parameter, den ersten ist die Startnummer, die zweite ist der Schritt, standardmäßig beginnend bei 0, die Verwendung ist wie folgt:

2cycle(), akzeptiert einen Parameter, nämlich die Iteration Das Iteratorobjekt (Liste, Zeichenfolge usw.) führt eine Schleife aus, um die Elemente im Iterator zu generieren

import itertools as it

c = it.count(10, 2)
for i in c:
    if i > 20:
        break
    print i,
# 10 12 14 16 18 20

3 repeat(), das zwei Parameter akzeptiert und zum Generieren des ersten verwendet wird Parameter n mal

c = it.cycle([1, 2, 3])
i = 1
for j in c:
    if i > 7:
        break
    print j,
    i += 1

begrenzter Iterator, wählen Sie den aus, den Sie Ihrer Meinung nach häufig verwenden, und führen Sie

for j in it.repeat([1, 2, 3], 4):
print j

1 chain() ein, das akzeptiert Mehrere Iteratoren Objekte als Parameter und verbinden sie mit der Kette ('abc', [1, 2, 3])

2 komprimieren (Daten, Selektoren), filtern Sie die vorherigen entsprechend den letzteren Parameter Parameter, beide Parameter müssen Iteratorobjekte sein

3 dropwhile

(

pre, iterable ) , der pre-Parameter ist eine Funktion. Wenn pre(i) True ist, werden dieses Element und alle folgenden Elemente zurückgegeben

4 groupby(iterierbar[, keyfunc]), wobei iterable ein iterierbares Objekt ist, keyfunc dagegen eine Gruppierungsfunktion, die zum Gruppieren aufeinanderfolgender Elemente in Iterable verwendet wird. Wenn nicht angegeben, gruppiert sie standardmäßig aufeinanderfolgende identische Elemente in Iterable und gibt einen Iterator von zurück. (key, sub-iterator)

ifilter(function or None, sequence),将 iterable 中 function(item) 为 True 的元素组成一个迭代器返回,如果 function 是 None,则返回 iterable 中所有计算为 True 的项

6 tee(iterable [,n]),tee 用于从 iterable 创建 n 个独立的迭代器,以元组的形式返回,n 的默认值是 2。


 for j in it.tee(&#39;abc&#39;, 4):
     print list(j)


组合生成器

permutations(iterable[, r]),用于生成一个排列,r是生成排列的元素长度,不指定则为默认长度


  list(it.permutations(  list(it.permutations(, 2


combinations(iterable, r), 求序列的组合,其中,r 指定生成组合的元素的长度,是必需的参数

3 combinations_with_replacement(iterable, r),生成的组合包含自身元素 

 print list(it.combinations_with_replacement(&#39;abc&#39;, 2))
 # [(&#39;a&#39;, &#39;a&#39;), (&#39;a&#39;, &#39;b&#39;), (&#39;a&#39;, &#39;c&#39;), (&#39;b&#39;, &#39;b&#39;), (&#39;b&#39;, &#39;c&#39;), (&#39;c&#39;, &#39;c&#39;)]

更多python迭代器以及itertools模块相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn