Maison > développement back-end > Tutoriel Python > Exemples détaillés d'itérateurs et de générateurs en Python

Exemples détaillés d'itérateurs et de générateurs en Python

黄舟
Libérer: 2017-08-13 10:00:14
original
1248 Les gens l'ont consulté

Itérateur


Itérable

Définition

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
Copier après la connexion

Il ressort de la définition que Iterable doit contenir le __iter__ fonction

Itérateur

définition

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
Copier après la connexion

On peut voir à partir de la définition que Iterator contient le __next__ et __iter__ fonctions. Lorsque le prochain est hors de portée, il lancera StopIteration événement

relation de type

#! /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
Copier après la connexion

Théoriquement, vous pouvez utiliser next() pour exécuter __next__() jusqu'à ce que l'itérateur lance StopIteration En fait, le système fournit un for .. in .. moyen d'analyser les itérateurs

l = [1,2,3,4]
for i in l:
    print(i)
    
# 执行结果    
# 1
# 2
# 3
# 4
Copier après la connexion

générateur


L'essence d'un générateur est un itérateur S'il y a

#! /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
Copier après la connexion
dans la fonction

yield, la fonction est un objet générateur Chaque fois que la fonction next est exécutée, la fonction. commencera l'exécution au yield précédent, et les retours (équivalent à yield) au return suivant >

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal