>  기사  >  백엔드 개발  >  Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명

Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명

Y2J
Y2J원래의
2017-04-20 09:58:511333검색

이 글에서는 Python의 Iterator 및 Generator 인스턴스에 대한 자세한 설명을 주로 소개합니다. 필요한 친구는

Python의 Iterator 및 Generator 인스턴스에 대한 자세한 설명

이 문서에서는 다음과 같이 다양한 애플리케이션 시나리오와 해당 솔루션에 초점을 맞춰 Python의 반복자와 생성기에 대한 몇 가지 관련 지식을 요약합니다.

1 수동으로 반복기를 탐색합니다

애플리케이션 시나리오: 반복 가능한 객체의 모든 요소를 ​​순회하고 싶지만 for 루프를 사용하고 싶지 않습니다.


해결책: next() 함수를 사용하고 캡처 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. 에이전트 반복

응용 시나리오: 목록, 튜플 또는 기타 반복 가능한 객체가 포함된 컨테이너 객체에서 직접 반복 작업을 수행하려는 경우


해결책: iter() 메서드를 정의하여 컨테이너 내부의 컨테이너에 반복 작업을 위임합니다.

개체 예:



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. 역방향 반복

응용 시나리오: 역방향으로 시퀀스를 반복하려는 경우


해결책: 내장 reversed() 함수를 사용하거나 사용자 정의 클래스에 reversed() 구현

예제 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)

예제 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 .선택적 반복

애플리케이션 시나리오: 반복 가능한 객체를 순회하고 싶지만 시작 부분의 일부 요소에는 관심이 없고 건너뛰고 싶습니다.


해결책 : itertools.dropwhile()

예제 1



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

예제 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. 동시에 여러 시퀀스 반복


응용 시나리오: 동시에 여러 시퀀스를 반복하고 매번 하나의 시퀀스에서 요소를 가져오고 싶습니다.


해결책: zip() 기능 사용

Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명

Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명

Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명

Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명

6. 다른 컬렉션의 요소 반복


응용 시나리오: 여러 개체에 대해 동일한 작업을 수행하려고 하지만 이러한 개체는 서로 다릅니다. 컨테이너의


해결 방법: itertool.chain() 함수 사용

Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명

7. 중첩 시퀀스 확장


애플리케이션 시나리오: 다중 레벨 중첩 시퀀스를 단일 레벨 목록으로 확장하려는 경우


해결책: Yield from 문이 포함된 재귀 생성기를 사용하세요


아아아아아

아아아아아

위 내용은 Python의 반복자 및 생성기 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.