Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Beispiele für Iteratoren und Generatoren in Python

Detaillierte Beispiele für Iteratoren und Generatoren in Python

黄舟
黄舟Original
2017-08-13 10:00:141176Durchsuche

Iterator


Iterierbar

Definition

class Iterable(metaclass=ABCMeta):

    __slots__ = ()

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    @classmethod
    def __subclasshook__(cls, C):
        if cls is Iterable:
            if any("__iter__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented

Aus der Definition geht hervor, dass Iterable das enthalten muss __iter__ Funktion

Iterator

Definition

class Iterator(Iterable):

    __slots__ = ()

    @abstractmethod
    def __next__(self):
        'Return the next item from the iterator. When exhausted, raise StopIteration'
        raise StopIteration

    def __iter__(self):
        return self

    @classmethod
    def __subclasshook__(cls, C):
        if cls is Iterator:
            if (any("__next__" in B.__dict__ for B in C.__mro__) and
                any("__iter__" in B.__dict__ for B in C.__mro__)):
                return True
        return NotImplemented

Aus der Definition ist ersichtlich, dass Iterator die __next__ und enthält __iter__ Funktionen. Wenn next außerhalb des Gültigkeitsbereichs liegt, wird eine Beziehung vom Typ StopIteration

ausgelöst

#! /usr/bin/python
#-*-coding:utf-8-*-

from collections import Iterator,Iterable

# 迭代器
s = 'abc'
l = [1,2,3]
d=iter(l)

print(isinstance(s,Iterable)) # True
print(isinstance(l,Iterable)) # True

print(isinstance(s,Iterator)) # False
print(isinstance(l,Iterator)) # False

print(isinstance(d,Iterable)) # True
print(isinstance(d,Iterator)) # True
Theoretisch können Sie

dazu verwenden Führen Sie next() aus, bis der Iterator __next__()StopIteration auslöst. Tatsächlich bietet das System eine Möglichkeit, Iteratoren zu analysierenfor .. in ..

l = [1,2,3,4]
for i in l:
    print(i)
    
# 执行结果    
# 1
# 2
# 3
# 4
Generatorgenerator


Die Essenz eines Generators ist ein Iterator. Wenn in der Funktion

#! /usr/bin/python
#-*-coding:utf-8-*-

from collections import Iterator,Iterable

s = (x*2 for x in range(5))
print(s)
print('Is Iterable:' + str(isinstance(s,Iterable)))
print('Is Iterator:' + str(isinstance(s,Iterator)))

for x in s:
    print(x)

# 执行结果    
# <generator object <genexpr> at 0x000001E61C11F048>
# Is Iterable:True
# Is Iterator:True
# 0
# 2
# 4
# 6
# 8

yield vorhanden ist, ist die Funktion ein Generatorobjekt. Jedes Mal, wenn die Funktion ausgeführt wird startet die Ausführung beim vorherigen next und kehrt (entspricht yield) beim nächsten yield >return zurück

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

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