Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung von Iteratoren und Generatoren in Python

Verwendung von Iteratoren und Generatoren in Python

PHPz
PHPznach vorne
2023-05-22 12:13:21910Durchsuche

1. Iterator (foreach)

1. Iterierbare Objekte

Diejenigen mit integrierter __iter__-Methode werden als iterierbare Objekte bezeichnet. __iter__方法的都叫可迭代的对象。

Python内置str、list、tuple、dict、set、file都是可迭代对象。

x = 1.__iter__  # SyntaxError: invalid syntax

# 以下都是可迭代的对象
name = 'nick'.__iter__
print(type(name))  # 'method-wrapper'>

2、迭代器对象

执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象。

只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的,只能使用迭代器对象。

  • 内置有__iter__方法,执行该方法会拿到迭代器本身。

  • 内置__next__

    Die in Python integrierten Elemente str, list, tuple, dict, set und file sind allesamt iterierbare Objekte.
  • s = 'hello'
    iter_s = s.__iter__()
    print(type(iter_s))  # 'str_iterator'> iter_s为迭代器对象
    
    while True:
        try:
            print(iter_s.__next__())
        except StopIteration:
            break
    #hello
2. Iteratorobjekt

Führen Sie die __iter__-Methode des iterierbaren Objekts aus, und der erhaltene Rückgabewert ist das Iteratorobjekt.

Nur Zeichenfolgen und Listen basieren auf Indexwerten, während andere iterierbare Objekte nicht auf Indexwerten basieren und nur Iteratorobjekte verwenden können.

Es gibt eine integrierte __iter__-Methode, und durch die Ausführung dieser Methode wird der Iterator selbst abgerufen.

Eingebaute __next__-Methode. Durch die Ausführung dieser Methode wird ein Wert im Iteratorobjekt abgerufen.
  • s = 'hello'
    iter_s = iter(s) # 创建迭代器对象
    print(type(iter_s))  #  iter_s为迭代器对象
    
    while True:
        try:
            print(next(iter_s)) # 输出迭代器的下一个元素
    
        except StopIteration:
            break
    # hello

    3. Iteratoren haben zwei grundlegende Methoden: iter() und next().
  • #str
    name = 'nick' 
    for x in name:
        print(x)
    
    #list
    for x in [None, 3, 4.5, "foo", lambda: "moo", object, object()]:
        print("{0}  ({1})".format(x, type(x)))
    
    #dict
    d = {
        '1': 'tasty',
        '2': 'the best',
        '3 sprouts': 'evil',
        '4': 'pretty good'
    }
    
    for sKey in d:
        print("{0} are {1}".format(sKey, d[sKey]))
    
    #file
    f = open('32.txt', 'r', encoding='utf-8')
    for x in f:
        print(x)
    f.close()
  • 4. for-Iterator-Schleife

    Iterierbare Objekte können direkt mit regulären for-Anweisungen durchlaufen werden
  • Die for-Schleife wird Iteratorschleife genannt, muss sei ein iterierbares Objekt nach in.

    class MyNumbers:
      def __iter__(self):
        self.a = 1
        return self
     
      def __next__(self):
        if self.a <= 20:
          x = self.a
          self.a += 1
          return x
        else:
          raise StopIteration
     
    myclass = MyNumbers()
    myiter = iter(myclass)
     
    for x in myiter:
      print(x)

    5. Implementieren Sie Iteratoren (__next__ und __iter__)
Nachdem Sie die beiden Methoden __iter__() und __next__() in der Klasse implementiert haben, können Sie sie als verwenden Iterator.

Die __iter__()-Methode gibt ein spezielles Iteratorobjekt zurück, das die __next__()-Methode implementiert und den Abschluss der Iteration durch die StopIteration-Ausnahme identifiziert.

__next__() Methode gibt das nächste Iteratorobjekt zurück.

StopIteration-Ausnahme wird verwendet, um den Abschluss der Iteration zu identifizieren, um Endlosschleifen zu verhindern. Wir können StopIteration so einstellen, dass es nach Abschluss der angegebenen Anzahl ausgelöst wird von Schleifen. Ausnahme zum Beenden der Iteration.

Erstellen Sie einen Iterator, der eine Zahl zurückgibt. Der Anfangswert ist 1, erhöht sich schrittweise um 1 und stoppt die Ausführung nach 20 Iterationen:

class Range:
    def __init__(self, n, stop, step):
        self.n = n
        self.stop = stop
        self.step = step

    def __next__(self):
        if self.n >= self.stop:
            raise StopIteration
        x = self.n
        self.n += self.step
        return x

    def __iter__(self):
        return self


for i in Range(1, 7, 3):
    print(i)

#1
#4
#🎜🎜 # 1. Simulationsbereich

class Fib:
    def __init__(self):
        self._a = 0
        self._b = 1

    def __iter__(self):
        return self

    def __next__(self):
        self._a, self._b = self._b, self._a + self._b
        return self._a


f1 = Fib()
for i in f1:
    if i > 100:
        break
    print(&#39;%s &#39; % i, end=&#39;&#39;)

# 1 1 2 3 5 8 13 21 34 55 89

2. Fibonacci-Sequenz

import sys


def fibonacci(n):  # 函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if counter > n:
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  #f 是一个生成器
print(type(f))  # &#39;generator&#39;>

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()
2. Generator

#🎜 🎜#In In Python werden Funktionen, die Yield verwenden, als Generatoren bezeichnet.
  • Ein Generator ist eine spezielle Funktion, die einen Iterator zurückgibt und nur für iterative Operationen verwendet werden kann. Mit anderen Worten: Ein Generator ist ein Iterator.

    Während des Aufrufs des Generators hält die Funktion jedes Mal, wenn sie auf Yield trifft, an und speichert alle aktuellen Laufinformationen, gibt den Yield-Wert zurück und startet beim nächsten Mal mit dem aktuellen () Die Methode wird ausgeführt. Der Standort wird weiterhin ausgeführt.
  • Rufen Sie eine Generatorfunktion auf und geben Sie ein Iteratorobjekt zurück.

  • yield
Sie können danach mehrere Werte hinzufügen (können von jedem Typ sein), aber der zurückgegebene Wert ist ein Tupeltyp.

  • Bietet eine Möglichkeit, Iteratoren anzupassen

  • yield kann die Funktion anhalten und den aktuellen Rückgabewert bereitstellen von

  • def my_range(start, stop, step=1):
        while start < stop:
            yield start
            start += 1
    
    
    g = my_range(0, 3)
    print(f"list(g): {list(g)}")
Yield und Return:

sind gleich: beide befinden sich innerhalb der Funktion Use, you kann einen Wert zurückgeben, und es gibt keine Begrenzung für die Art oder Anzahl der Rückgabewerte

Der Unterschied: return kann einen Wert nur einmal zurückgeben; yield kann mehrere Werte zurückgeben # 🎜🎜#

2. Benutzerdefinierte range()-Methode

def range(*args, **kwargs):
    if not kwargs:
        if len(args) == 1:
            count = 0
            while count < args[0]:
                yield count
                count += 1
        if len(args) == 2:
            start, stop = args
            while start < stop:
                yield start
                start += 1
        if len(args) == 3:
            start, stop, step = args
            while start < stop:
                yield start
                start += step

    else:
        step = 1

        if len(args) == 1:
            start = args[0]
        if len(args) == 2:
            start, stop = args

        for k, v in kwargs.items():
            if k not in [&#39;start&#39;, &#39;step&#39;, &#39;stop&#39;]:
                raise (&#39;参数名错误&#39;)

            if k == &#39;start&#39;:
                start = v
            elif k == &#39;stop&#39;:
                stop = v
            elif k == &#39;step&#39;:
                step = v

        while start < stop:
            yield start
            start += step


for i in range(3):
    print(i)  # 0,1,2

for i in range(99, 101):
    print(i)  # 99,100

for i in range(1, 10, 3):
    print(i)  # 1,4,7

for i in range(1, step=2, stop=5):
    print(i)  # 1,3

for i in range(1, 10, step=2):
    print(i)  # 1,3,5,7,9
#🎜🎜#Komplexe Version: #🎜🎜#
t = (i for i in range(10))
print(t)  # <generator object  at 0x00000000026907B0>
print(next(t))  # 0
print(next(t))  # 1
#🎜🎜#3. Generatorausdruck (i .for .in)#🎜🎜##🎜🎜#Ersetzen Sie [] im Listenverständnis durch (), um einen Generatorausdruck zu erhalten. #🎜🎜##🎜🎜#Vorteile: Im Vergleich zu Listenverständnissen kann es Speicher sparen und generiert jeweils nur einen Wert im Speicher #🎜🎜#
with open(&#39;32.txt&#39;, &#39;r&#39;, encoding=&#39;utf8&#39;) as f:
    nums = [len(line) for line in f]  # 列表推导式相当于直接给你一筐蛋

print(max(nums))  # 2


with open(&#39;32.txt&#39;, &#39;r&#39;, encoding=&#39;utf8&#39;) as f:
    nums = (len(line) for line in f)  # 生成器表达式相当于给你一只老母鸡。

print(max(nums))  # ValueError: I/O operation on closed file.
#🎜🎜#Beispiel: #🎜🎜#rrreee

Das obige ist der detaillierte Inhalt vonVerwendung von Iteratoren und Generatoren in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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