Explication détaillée des méthodes d'instance d'itérateur et de générateur en Python

高洛峰
Libérer: 2017-03-31 09:45:18
original
1692 Les gens l'ont consulté

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
Copier après la connexion
#test case
items=[1,2,3]
it=iter(items)
next(it)
next(it)
next(it)
Copier après la connexion

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

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

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

Exemple 2

from itertools import dropwhile
with open('/etc/passwd') as f:
  for line in dropwhile(lambda line:line.startwith('#'),f):
    print(line,end='')
Copier après la connexion

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

Explication détaillée des méthodes dinstance ditérateur et de générateur en Python

Explication détaillée des méthodes dinstance ditérateur et de générateur en Python

Explication détaillée des méthodes dinstance ditérateur et de générateur en Python

Explication détaillée des méthodes dinstance ditérateur et de générateur en Python

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

Explication détaillée des méthodes dinstance ditérateur et de générateur en Python

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
Copier après la connexion
#test case
items=[1,2,[3,4,[5,6],7],8]
for x in flatten(items):
  print(x)
Copier après la connexion

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!

É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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!