Cet article présente principalement les informations pertinentes sur des exemples détaillés d'itérateurs et de générateurs en Python Les amis dans le besoin peuvent se référer à
Explication détaillée de Python. d'exemples d'itérateurs et de générateurs en Python
Cet article résume certaines connaissances connexes sur les itérateurs et les générateurs en Python en se concentrant sur différents scénarios d'application et leurs solutions, comme suit :
1. Traverser manuellement l'itérateur
Scénario d'application : je souhaite parcourir tous les éléments d'un objet itérable , mais je ne veux pas utiliser de boucle for
Solution : utilisez la fonction next() et interceptez l'exception StopIteration
def manual_iter(): with open('/etc/passwd') as f: try: while True: line=next(f) if line is None: break print(line,end='') except StopIteration: pass
#test case items=[1,2,3] it=iter(items) next(it) next(it) next(it)
2. Itération proxy
Scénario d'application : Vous souhaitez effectuer des opérations d'itération directement sur un objet conteneur contenant une liste, un tuple ou un autre objet itérable
Solution : Définir une méthode iter(), déléguer le Opération d'itération sur l'objet à l'intérieur du conteneur
Exemple :
class Node: def init(self,value): self._value=value self._children=[] def repr(self): return 'Node({!r})'.fromat(self._value) def add_child(self,node): self._children.append(node) def iter(self): #将迭代请求传递给内部的_children属性 return iter(self._children)
#test case if name='main': root=Node(0) child1=Node(1) child2=Nide(2) root.add_child(child1) root.add_child(child2) for ch in root: print(ch)
3. Itération inversée
Application Scénario : Vous souhaitez itérer une séquence dans le sens inverse
Solution : utilisez la fonction reverse() intégrée ou implémentez reversed() sur une classe personnalisée
Exemple 1
a=[1,2,3,4] for x in reversed(a): print(x) #4 3 2 1 f=open('somefile') for line in reversed(list(f)): print(line,end='') #test case for rr in reversed(Countdown(30)): print(rr) for rr in Countdown(30): print(rr)
Exemple 2
class Countdown: def init(self,start): self.start=start #常规迭代 def iter(self): n=self.start while n > 0: yield n n -= 1 #反向迭代 def reversed(self): n=1 while n <p style="text-align: left;"><strong>4. Itération sélective</strong></p><p style="text-align: left;">Scénario d'application : je souhaite parcourir un objet itérable, mais certains éléments au début de celui-ci ne sont pas intéressés et souhaitent pour ignorer </p><p style="text-align: left;">Solution : utilisez itertools.dropwhile()</p><p style="text-align: left;">Exemple 1</p><pre class="brush:php;toolbar:false">with open('/etc/passwd') as f: for line in f: print(line,end='')
Exemple 2
from itertools import dropwhile with open('/etc/passwd') as f: for line in dropwhile(lambda line:line.startwith('#'),f): print(line,end='')
5. plusieurs séquences en même temps
Scénario d'application : vous souhaitez itérer plusieurs séquences en même temps et prendre un élément de chaque séquence à chaque fois
Solution : utilisez zip() fonction
6. Itération d'éléments sur différentes collections
Scénario d'application : Vous souhaitez effectuer la même opération sur plusieurs objets, mais ces objets sont dans des conteneurs différents
Solution : utilisez itertool.chain( ) fonction
7. Développer la séquence imbriquée
Scénario d'application : Vous souhaitez imbriquer un multicouche La séquence de se développe dans une liste à un seul niveau
Solution : Utiliser un générateur récursif contenant une instruction rendement from
Exemple
from collections import Iterable def flatten(items,ignore_types=(str,bytes)): for x in items: if isinstance(x,Iterable) and not isinstance(x,ignore_types): yield from flatten(x) else: yield x
#test case items=[1,2,[3,4,[5,6],7],8] for x in flatten(items): print(x)
Merci pour lecture, j'espère que cela pourra vous aider, merci pour votre soutien à ce site !
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!