Heim  >  Artikel  >  Backend-Entwicklung  >  Geschrieben für Python-Programmiermeister 2: Iteratoren

Geschrieben für Python-Programmiermeister 2: Iteratoren

coldplay.xixi
coldplay.xixinach vorne
2020-11-04 17:19:112075Durchsuche

In der Spalte „Python-Tutorial“ werden Iteratoren vorgestellt, die bei der Programmierung verwendet werden.

Geschrieben für Python-Programmiermeister 2: IteratorenVerwandte kostenlose Lernempfehlungen:

Python-Tutorial
(Video)

So implementieren Sie iterierbare Objekte und Iteratorobjekte

Das Iteratormuster ist ein klassisches Software-Designmuster, das mittlerweile in viele Programmiersprachen integriert ist. Dieses Design Muster. Unter den primitiven Datentypen von Python sind diejenigen, die für Schleifen verwendet werden können, iterierbare Typen. Natürlich können Sie auch die Funktion iter verwenden, um den entsprechenden Iterator abzurufen und dann das Objekt zu durchlaufen. Zum Beispiel der folgende Code:

l = [1, 3]  # 可迭代对象 __iter__t = iter(l) #获取迭代器对象print(t.__next__())
print(t.__next__())# print(t.__next__()) # 报异常复制代码

Um ein iterierbares Objekt zu implementieren, müssen Sie zuerst das entsprechende Iteratorobjekt implementieren. Um einen Iterator in Python zu implementieren, müssen Sie nur die Methode __next__ implementieren. Die Iterator-Klasse im Sammlungspaket definiert jedoch die __next__-Methode als abstrakte Methode. Der Autor ist der Ansicht, dass Sie im Hinblick auf die Lesbarkeit des Programms möglicherweise die Iterator-Klasse erben möchten, wenn Sie einen Iterator implementieren.

from random import samplefrom collections import Iterable, Iteratorclass WeatherIterator(Iterator):
    def __init__(self, cities):
        self.cities = cities
        self.index = 0

    def getWeather(self, city):
        return (city, sample(['sun','wind','yu'], 1)[0])    def __next__(self):
        if self.index == len(self.cities):            raise StopIteration
        city = self.cities[self.index]
        self.index += 1
        return self.getWeather(city)复制代码
Um ein iterierbares Objekt zu implementieren, müssen Sie nur die __iter__-Methode implementieren. Ebenso definiert die Iterable-Klasse im Collections-Paket auch die __iter__-Methode als abstrakte Klasse.

from collections import Iterableclass WeatherIterable(Iterable):
    def __init__(self, cities):
        self.cities = cities
        self.index = 0

    def __iter__(self):
        return WeatherIterator(self.cities)复制代码
Auf diese Weise können Sie eine for-Schleife zum Iterieren verwenden.

for weather in WeatherIterable(['北京', '上海', '广州']):
    print(weather)复制代码
Einführung in Generatoren

Schauen Sie sich zunächst den folgenden Code an:

def gen():
    print("step 1")    yield 1
    print("step 2")    yield 2
    print("step 3")    yield 3复制代码

Der Rückgabewert der obigen Gen-Funktion ist ein Generatorobjekt.

g = gen()
g.__next__()
print(g.__next__())
print(g.__next__())复制代码
Wie im obigen Code gezeigt, führt der Generator bei jedem Aufruf der __next__-Methode eine gen-Funktion aus, bis er auf das Schlüsselwort yield trifft, und gibt das Folgende zurück. Daher kann ein Generator als eine Funktion verstanden werden, die unterbrochen werden kann.

Hinweis: Generatorobjekte sind auch iterierbare Objekte.

for x in g:
    print(x)复制代码
So verwenden Sie eine Generatorfunktion, um ein iterierbares Objekt zu implementieren

Durch die Implementierung der __iter__-Methode als Generatorfunktion können Sie ein iterierbares Objekt implementieren.

class PrimeNumbers:
    def __init__(self, start, end):
        self.start = start
        self.end = end    def isPrimeNum(self, k):  #判断是否是素数
        if k < 2:            return False
        for i in range(2, k):            if k % i == 0:                return False
        return True

    def __iter__(self):
        for k in range(self.start, self.end + 1):            if self.isPrimeNum(k):                yield kfor num in PrimeNumbers(2, 100):
    print(num)复制代码

Wie man eine umgekehrte Iteration durchführt und wie man eine umgekehrte Iteration implementiert

Die Iter-Funktion kann den Vorwärts-Iterator des iterierbaren Objekts erhalten, und die umgekehrte Funktion kann den Rückwärts-Iterator des iterierbaren Objekts erhalten.

l = [1, 2, 3, 4, 5]for x in reversed(l):
    print(x)复制代码

Um die umgekehrte Iteration zu implementieren, implementieren Sie einfach die Methode __reversed__.

class FloatRange:
    def __init__(self, start, end, step=0.1):
        self.start = start
        self.end = end
        self.step = step    def __iter__(self):
        t = self.start        while t <= self.end:            yield t
            t += self.step    def __reversed__(self):
        t = self.end        while t >= self.start:            yield t
            t -= self.stepfor x in FloatRange(1.0, 4.0, 0.5):
    print(x)for x in reversed(FloatRange(1.0, 4.0, 0.5)):
    print(x)复制代码
So führen Sie Slicing-Vorgänge für Iteratoren aus

Die islice-Funktion im itertools-Paket kann Slicing-Vorgänge für iterierbare Objekte ausführen.

from itertools import islicefor x in islice(FloatRange(1.0, 4.0, 0.5), 2, 5):
    print(x)复制代码

So iterieren Sie mehrere iterierbare Objekte in einer for-Anweisung

Verwenden Sie die Zip-Methode, um ein Tupel entsprechender Elemente zu bilden.

for w, e, m in zip([1, 2, 3, 4], ('a', 'b', 'c','d'), [5, 6, 7, 8]):
    print(w, e, m)复制代码

Verwenden Sie die Kettenfunktion im Paket itertools, um mehrere iterierbare Objekte zu verketten. Verwenden Sie die Zip-Methode, um ein Tupel entsprechender Elemente zu bilden.

from itertools import chainfor x in chain([1, 2, 3, 4], ('a', 'b', 'c','d')):
    print(x)复制代码

Das obige ist der detaillierte Inhalt vonGeschrieben für Python-Programmiermeister 2: Iteratoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen