> 백엔드 개발 > 파이썬 튜토리얼 > 파이썬 생성기와 반복자의 차이점

파이썬 생성기와 반복자의 차이점

爱喝马黛茶的安东尼
풀어 주다: 2019-06-24 13:26:31
원래의
3596명이 탐색했습니다.

list, string, tuple, dict 등과 같은 컨테이너 객체의 경우 for 루프를 사용하여 탐색하는 것이 매우 편리합니다. iter() 함수는 for 문 백그라운드에서 컨테이너 개체에 대해 호출됩니다. iter()는 Python 내장 함수입니다. iter() 함수는 컨테이너의 요소에 하나씩 액세스하는 next() 메서드를 정의하는 반복자 개체를 반환합니다. next()는 Python의 내장 함수이기도 합니다. 후속 요소가 없으면 next()는 StopIteration 예외를 발생시켜 for 문에 루프 끝을 알립니다.

파이썬 생성기와 반복자의 차이점

Iterator

Iterator는 각 반복에서 방문한 위치를 기록하는 데 사용됩니다. 반복자에서 next() 함수를 사용할 때 반복자는 다음에 대한 데이터를 반환한다고 알려줍니다. 기록된 위치 옆의 위치. 실제로 next() 함수를 사용하면 iterator 객체의 _next_ 메서드(Python3에서는 객체의 _next_ 메서드, Python2에서는 객체의 next() 메서드)가 호출됩니다. 따라서 반복자를 생성하려면 _next_ 메서드를 구현해야 합니다. 하지만 이것만으로는 충분하지 않습니다. Python에서는 반복자 자체도 반복 가능해야 하므로 반복자에 대한 _iter_ 메서드도 구현해야 하며, _iter_ 메서드는 반복자 자체이므로 반복의 _iter_ 메서드가 필요합니다. 장치가 스스로 돌아올 수 있습니다.

일부 용어 설명:

1. 반복자 프로토콜: 객체는 반복의 다음 항목을 반환하거나 반복을 종료하기 위해 StopIteration 예외를 발생시키는 next() 메서드를 제공해야 합니다.
2. 반복 가능한 객체: 반복자 프로토콜 객체를 구현합니다. List, Tuple 및 dict는 모두 Iterable(반복 가능한 객체)이지만 Iterator(반복자 객체)는 아닙니다. 그러나 내장 함수 iter()를 사용하여 이를 Iterable(반복 가능한 객체)로 바꿀 수 있습니다.
3 Iterable 루프에서 for 항목의 핵심은 먼저 iter() 함수를 통해 반복 가능한 객체 Iterable의 반복자를 얻은 다음, 얻은 반복자에 대해 next() 메서드를 계속 호출하여 다음 값을 얻고 할당하는 것입니다. item 에 추가하면 StopIteration 예외가 발생하면 루프가 종료됩니다.

관련 권장사항: "Python 동영상 튜토리얼"

Python 자체 컨테이너 객체 사례:

# 随便定义一个list
listArray=[1,2,3]
# 使用iter()函数
iterName=iter(listArray)
print(iterName)
# 结果如下:是一个列表list的迭代器
# <list_iterator object at 0x0000017B0D984278>
 
print(next(iterName))
print(next(iterName))
print(next(iterName))
print(next(iterName))#没有迭代到下一个元素,直接抛出异常
# 1
# 2
# 3
# Traceback (most recent call last):
# File "Test07.py", line 32, in <module>
# StopIteration
로그인 후 복사

_iter_method 및 _next_method를 구현하는 Python의 클래스 객체는 반복자입니다. 다음 사례는 계산입니다. 피보나치 수열의 경우

class Fib(object):
 def __init__(self, max):
  super(Fib, self).__init__()
  self.max = max
 
 def __iter__(self):
  self.a = 0
  self.b = 1
  return self
 
 def __next__(self):
  fib = self.a
  if fib > self.max:
   raise StopIteration
  self.a, self.b = self.b, self.a + self.b
  return fib
 
# 定义一个main函数,循环遍历每一个菲波那切数
def main():
 # 20以内的数
 fib = Fib(20)
 for i in fib:
  print(i)
 
# 测试
if __name__ == &#39;__main__&#39;:
 main()
로그인 후 복사

설명:

이 클래스의 구현에서는 for 루프가 순회하고 반복자를 반환할 때 iter()에 의해 _iter_(self) 메서드가 정의됩니다. 순회할 때 Python 내장 함수인 iter()가 직접 호출되고, iter()는 _iter_(self)를 호출하여 객체의 반복자를 얻기 때문입니다. 반복자를 사용하면 요소를 하나씩 순회할 수 있습니다. 하나씩 순회할 때 내장된 next() 함수도 객체의 _next_(self) 메서드를 호출하여 반복자 객체를 순회하는 데 사용됩니다. 따라서 _iter_(self) 및 _next_(self)라는 두 가지 메서드를 구현해야 합니다.

그리고 _next_(self) 메서드가 구현되어 있으므로 _iter_(self) 구현 시 self를 직접 반환하면 됩니다.

한 문장으로 요약하면:

사용자 정의 컨테이너 개체를 반복할 때 Python 내장 함수 iter()를 사용하여 순회 개체의 _iter_(self)를 호출하여 반복자를 얻은 다음 반복자는 반복자 객체의 next() 호출 _next_(self) 루프에서 사용됩니다.

참고: _iter_(self)는 한 번만 호출되는 반면 _next_(self)는 StopIteration 예외가 발생할 때까지 n 번 호출됩니다.

발전기

기능:

지연 작업. 즉, 결과는 즉시 생성되는 것이 아니라 필요할 때 생성됩니다.

참고:

생성기는 한 번만 통과할 수 있습니다.
Generator는 특별한 유형의 반복자입니다.

카테고리:

第一类:生成器函数:还是使用 def 定义函数,但是,使用yield而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。

# 菲波那切数列
def Fib(max):
 n, a, b = 0, 0, 1
 while n < max:
  yield b
  a, b = b, a + b
  n = n + 1
 return &#39;亲!没有数据了...&#39;
# 调用方法,生成出10个数来
f=Fib(10)
# 使用一个循环捕获最后return 返回的值,保存在异常StopIteration的value中
while True:
 try:
  x=next(f)
  print("f:",x)
 except StopIteration as e:
  print("生成器最后的返回值是:",e.value)
  break
로그인 후 복사

第二类:生成器表达式:类似于列表推导,只不过是把一对大括号[]变换为一对小括号()。但是,生成器表达式是按需产生一个生成器结果对象,要想拿到每一个元素,就需要循环遍历。

如下案例加以说明:

# 一个列表
xiaoke=[2,3,4,5]
# 生成器generator,类似于list,但是是把[]改为()
gen=(a for a in xiaoke)
for i in gen:
 print(i)
#结果是:
2
3
4
5
# 为什么要使用生成器?因为效率。
# 使用生成器表达式取代列表推导式可以同时节省 cpu 和 内存(RAM)。
# 如果你构造一个列表(list)的目的仅仅是传递给别的函数,
# 比如 传递给tuple()或者set(), 那就用生成器表达式替代吧! 
#本案例是直接把列表转化为元组
kk=tuple(a for a in xiaoke)
print(kk)
#结果是:
(2, 3, 4, 5) 
# python内置的一些函数,可以识别这是生成器表达式,外面有一对小括号,就是生成器
result1=sum(a for a in range(3))
print(result1)
# 列表推导式
result2=sum([a for a in range(3)])
print(result2)
로그인 후 복사

区别:

生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出 StopIteration 异常。

위 내용은 파이썬 생성기와 반복자의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿