Maison  >  Article  >  développement back-end  >  Explication détaillée des instances d'itérateur et de générateur en Python

Explication détaillée des instances d'itérateur et de générateur en Python

Y2J
Y2Joriginal
2017-04-20 09:58:511334parcourir

Cet article présente principalement des informations pertinentes sur l'explication détaillée des instances d'itérateur et de générateur en Python. Les amis qui en ont besoin peuvent se référer à

Explication détaillée des instances d'itérateur et de générateur 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 :

Parcourir manuellement les itérateurs .

Scénario d'application : vous souhaitez parcourir tous les éléments d'un objet itérable, mais vous ne souhaitez pas utiliser de boucle for


Solution : utilisez la fonction next() et Catching l'exception StopIteration


def manual_iter():
  with open(&#39;/etc/passwd&#39;) as f:
    try:
      while True:
        line=next(f)
        if line is None:
          break
        print(line,end=&#39;&#39;)
      except StopIteration:
        pass


#test case
items=[1,2,3]
it=iter(items)
next(it)
next(it)
next(it)

2. Itération de l'agent

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() pour proxy l'opération d'itération vers l'objet à l'intérieur le conteneur

Exemple :



class Node:
  def init(self,value):
    self._value=value
    self._children=[]
  def repr(self):
    return &#39;Node({!r})&#39;.fromat(self._value)
  def add_child(self,node):
    self._children.append(node)
  def iter(self):
    #将迭代请求传递给内部的_children属性
    return iter(self._children)


#test case
if name=&#39;main&#39;:
  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 inverse

Scénario d'application : souhaitez itérer une séquence à l'envers


Solution : utilisez la fonction reverse() intégrée ou personnalisez-la. Implémentez reversed()

Exemple 1



a=[1,2,3,4]
for x in reversed(a):
  print(x) #4 3 2 1


f=open(&#39;somefile&#39;)
for line in reversed(list(f)):
  print(line,end=&#39;&#39;)
#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 <= self.start:
      yield n
      n +=1

4. Itération sélective

Scénario d'application : vous souhaitez parcourir un objet itérable, mais vous n'êtes pas intéressé par certains éléments au début de celui-ci, vous souhaitez l'ignorer


Solution : utilisez itertools.dropwhile()

Exemple 1



with open(&#39;/etc/passwd&#39;) as f:
  for line in f:
    print(line,end=&#39;&#39;)
Exemple 2



from itertools import dropwhile
with open(&#39;/etc/passwd&#39;) as f:
  for line in dropwhile(lambda line:line.startwith(&#39;#&#39;),f):
    print(line,end=&#39;&#39;)

5. Itérer plusieurs séquences simultanément

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 : Utiliser la fonction zip()

Explication détaillée des instances d'itérateur et de générateur en Python

Explication détaillée des instances d'itérateur et de générateur en Python

Explication détaillée des instances d'itérateur et de générateur en Python

Explication détaillée des instances d'itérateur et de générateur en Python

6. Itération d'éléments sur différentes collections

Scénarios d'application : Vous souhaitez effectuer la même opération sur plusieurs objets, mais ces objets sont dans des conteneurs différents


Solution : utilisez la fonction itertool.chain()

Explication détaillée des instances d'itérateur et de générateur en Python

Développer la séquence imbriquée


7. 🎜>

Scénario d'application : vous souhaitez étendre une séquence imbriquée à plusieurs niveaux en une liste à un seul niveau


Solution : utiliser un générateur récursif


contenant une déclaration de rendement

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!

Déclaration:
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