Python의 Generators와 Iterators의 차이점
반복기와 발전기의 차이점은 무엇입니까?각 케이스를 사용하는 경우에 대한 몇 가지 예가 도움이 될 것입니다.
iterator
에 보다 has has has 가 있는 입니다.클래스에 가 있는 오브젝트__next__
메서드)next
2) 및 Python 2)의 »__iter__
실행하는 return self
.
모든 발전기는 반복기이지만 그 반대는 아닙니다.는 하나 됩니다.yield
sexpressions)yield
2.5 의 스테이트먼트로, Python 2.5의 입니다.iterator
.
동작을 하는 것이 또, 보다 복잡한 상태 유지 동작을 가진 클래스가 필요한 경우, 또는 다른 도 좋습니다.__next__
(그리고)__iter__
★★★★★★★★★★★★★★★★★」__init__
대부분의 경우 제너레이터(간단히 필요한 경우에는 제너레이터 표현식)로 충분합니다.또한 프레임이 일시정지되었다가 재개됨으로써 상태 유지보수가 기본적으로 "사용자를 위해 수행"되기 때문에 코드화가 더 간단합니다.
예를 들어 다음과 같은 생성기가 있습니다.
def squares(start, stop):
for i in range(start, stop):
yield i * i
generator = squares(a, b)
또는 동등한 제너레이터 식(genexp)
generator = (i*i for i in range(a, b))
커스텀 리터레이터로서 빌드하려면 , 보다 많은 코드가 필요합니다.
class Squares(object):
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __iter__(self): return self
def __next__(self): # next in Python 2
if self.start >= self.stop:
raise StopIteration
current = self.start * self.start
self.start += 1
return current
iterator = Squares(a, b)
하지만 물론, 수업과 함께라면Squares
을 사용하다
def current(self):
return self.start
어플리케이션에 이러한 추가 기능이 실제로 필요한 경우.
반복기와 발전기의 차이점은 무엇입니까?각 케이스를 사용하는 경우에 대한 몇 가지 예가 도움이 될 것입니다.
: 반복자는 '반복자'가 입니다.__iter__
a. a. a.__next__
)next
Python 2) Python.생성기를 사용하면 반복기 인스턴스를 쉽게 만들 수 있습니다.
수율이 포함된 함수는 여전히 함수로, 호출되면 생성기 객체의 인스턴스를 반환합니다.
def a_function():
"when called, returns generator object"
yield
제너레이터 표현식은 제너레이터도 반환합니다.
a_generator = (i for i in range(0))
자세한 설명과 예를 보려면 계속 읽어보십시오.
제너레이터는 반복기입니다.
특히 제너레이터는 반복기의 하위 유형입니다.
>>> import collections, types
>>> issubclass(types.GeneratorType, collections.Iterator)
True
여러 가지 방법으로 발전기를 만들 수 있습니다.이를 위한 매우 일반적이고 간단한 방법은 기능을 사용하는 것입니다.
특히 수율이 포함된 함수는 호출 시 제너레이터를 반환하는 함수입니다.
>>> def a_function():
"just a function definition with yield in it"
yield
>>> type(a_function)
<class 'function'>
>>> a_generator = a_function() # when called
>>> type(a_generator) # returns a generator
<class 'generator'>
발전기는 반복기입니다.
>>> isinstance(a_generator, collections.Iterator)
True
반복자는 반복할 수 있는 사람이다.
반복자는 반복할 수 있는 존재입니다.
>>> issubclass(collections.Iterator, collections.Iterable)
True
에는 '이것'이 합니다.__iter__
다음 중 하나:
>>> collections.Iterable()
Traceback (most recent call last):
File "<pyshell#79>", line 1, in <module>
collections.Iterable()
TypeError: Can't instantiate abstract class Iterable with abstract methods __iter__
반복 가능한 예로는 기본 제공 튜플, 목록, 사전, 세트, 프리즈언 세트, 문자열, 바이트 문자열, 바이트 배열, 범위 및 메모리 뷰가 있습니다.
>>> all(isinstance(element, collections.Iterable) for element in (
(), [], {}, set(), frozenset(), '', b'', bytearray(), range(0), memoryview(b'')))
True
리터레이터에는next
★★★★★★★★★★★★★★★★★」__next__
Python 2의 경우:
>>> collections.Iterator()
Traceback (most recent call last):
File "<pyshell#80>", line 1, in <module>
collections.Iterator()
TypeError: Can't instantiate abstract class Iterator with abstract methods next
Python 3의 경우:
>>> collections.Iterator()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Iterator with abstract methods __next__
는 삽입커스텀 오브젝트)에서 수 있습니다.iter
★★★★
>>> all(isinstance(iter(element), collections.Iterator) for element in (
(), [], {}, set(), frozenset(), '', b'', bytearray(), range(0), memoryview(b'')))
True
__iter__
는 for-loopfor-loop 을 됩니다. '하다'는__next__
각 됩니다..StopIteration
그 시점에서 재사용할 수 없는 경우.
매뉴얼에서
기본 제공 유형 설명서의 반복기 유형 섹션에 있는 제너레이터 유형 섹션에서 다음을 수행하십시오.
Python의 생성기는 반복기 프로토콜을 구현하는 편리한 방법을 제공합니다.컨테이너 객체의 경우
__iter__()
되어 있습니다.즉, 오브젝트 오브젝트되어 Generator 오브젝트는 Generator 오브젝트입니다.__iter__()
★★★★★★★★★★★★★★★★★」next()
__next__()
파이썬 3] 파이썬 3생성자에 대한 자세한 내용은 항복식에 대한 문서에서 확인할 수 있습니다.
(강조 추가)
이를 통해 제너레이터는 (편리한) 유형의 반복기임을 알 수 있습니다.
반복기 오브젝트 예시
사용자 자신의 개체를 생성하거나 확장하여 반복기 프로토콜을 구현하는 개체를 생성할 수 있습니다.
class Yes(collections.Iterator):
def __init__(self, stop):
self.x = 0
self.stop = stop
def __iter__(self):
return self
def next(self):
if self.x < self.stop:
self.x += 1
return 'yes'
else:
# Iterators must raise when done, else considered broken
raise StopIteration
__next__ = next # Python 3 compatibility
단, 제너레이터를 사용하면 간단하게 이 작업을 수행할 수 있습니다.
def yes(stop):
for _ in range(stop):
yield 'yes'
또는 제너레이터 식(목록 압축과 유사하게 작동)을 사용할 수도 있습니다.
yes_expr = ('yes' for _ in range(stop))
모두 같은 방법으로 사용할 수 있습니다.
>>> stop = 4
>>> for i, y1, y2, y3 in zip(range(stop), Yes(stop), yes(stop),
('yes' for _ in range(stop))):
... print('{0}: {1} == {2} == {3}'.format(i, y1, y2, y3))
...
0: yes == yes == yes
1: yes == yes == yes
2: yes == yes == yes
3: yes == yes == yes
결론
반복할 수 있는 개체로 Python 개체를 확장해야 할 때 Iterator 프로토콜을 직접 사용할 수 있습니다.
단, 대부분의 경우 이 기능을 사용하는 것이 가장 적합합니다.yield
제너레이터 반복기를 반환하는 함수를 정의하거나 제너레이터 식을 고려합니다.
마지막으로 제너레이터는 코루틴으로서 더 많은 기능을 제공한다는 점에 유의하십시오.나는 "수익률" 키워드는 무엇을 하는가?"에 대한 나의 답변에 대해 발전기와 함께 상세하게 설명한다.
반복기는 다음 명령을 사용하는 개체입니다.next()
방법
생성자는 다음을 사용하여 일련의 값을 생성하거나 생성하는 함수입니다.yield
키워드키워드를 지정합니다.
모 모든 든next()
method call on a generator object(for ex: 생성기 객체에 대한 메서드 호출(예:f
아래) 제너레이터 기능(예: 래 ) 너 아 해 환 수 : below: ex)예 returned function는(반 (다 by의함니됩 a제에for터이레 generatorfoo()
아래 값을 생성하면 다음 값을 생성합니다.다음)을 지정하면 시퀀스의 다음 값이 생성됩니다.
제너레이터 기능이 호출되면 기능 실행 없이 제너레이터 개체를 반환합니다.제너레이터 함수가 호출되면 함수의 실행도 시작하지 않고 제너레이터 객체를 반환합니다.?next()
가 되면 실행이 시작됩니다.yield
출력된 값을 반환하는 문입니다.yield
는 무슨 일이 일어났는지 추적합니다. 즉, 마지막 실행을 기억합니다.그리고 두 번째로next()
콜은 이전 값부터 계속됩니다.
는 하다의 줍니다.yield
의 콜을 합니다.next
메서드를 지정합니다.
>>> def foo():
... print("begin")
... for i in range(3):
... print("before yield", i)
... yield i
... print("after yield", i)
... print("end")
...
>>> f = foo()
>>> next(f)
begin
before yield 0 # Control is in for loop
0
>>> next(f)
after yield 0
before yield 1 # Continue for loop
1
>>> next(f)
after yield 1
before yield 2
2
>>> next(f)
after yield 2
end
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
기존 답변 중 공식 문서의 혼란을 구체적으로 다루지 않았기 때문에 답변을 추가하는 것입니다.
제너레이터 함수는 다음을 사용하여 정의된 일반적인 함수입니다.yield
return
. 호출 시 제너레이터 함수는 제너레이터 객체를 반환합니다.이것은 일종의 반복기입니다.이 함수는 다음을 가집니다.next()
★★★★★★★★★★★★★★★★★★★★★★★★★★.next()
제너레이터 함수에 의해 산출된 다음 값이 반환됩니다.
어떤 Python 소스 문서를 읽느냐에 따라 함수 또는 개체를 "제너레이터"라고 부를 수 있습니다.Python 용어집에는 generator functions라고 나와 있지만 Python wiki는 generator 객체를 의미합니다.Python 튜토리얼은 세 문장으로 이루어진 공간에서 두 가지 사용법을 모두 암시하고 있습니다.
생성기는 반복기를 만드는 간단하고 강력한 도구입니다.일반 함수처럼 작성되지만 데이터를 반환하려면 항상 yield 문을 사용합니다.next()가 호출될 때마다 생성기는 중단된 위치에서 다시 시작됩니다(모든 데이터 값과 마지막으로 실행된 문이 기억됨).
처음 두 문장은 발전기 기능을 가진 발전기를 식별하며, 세 번째 문장은 발전기 개체로 식별한다.
이러한 혼란에도 불구하고 파이썬 언어 참조를 통해 명확하고 최종적인 단어를 찾을 수 있습니다.
항복식은 생성기 함수를 정의할 때만 사용되며 함수 정의 본문에서만 사용할 수 있습니다.함수 정의에서 수율식을 사용하면 해당 정의가 정규 함수 대신 생성 함수를 만들 수 있습니다.
제너레이터 함수가 호출되면 제너레이터로 알려진 반복기를 반환합니다.그 후, 그 발전기는 발전기 기능의 실행을 제어합니다.
따라서 공식적이고 정확한 용법에서 "제너레이터"는 생성기 함수가 아닌 생성기 객체를 의미합니다.
위의 참조는 Python 2용이지만 Python 3 언어 참조도 마찬가지입니다.그러나 Python 3 용어집에는 다음과 같이 기술되어 있습니다.
제너레이터...일반적으로 제너레이터 함수를 나타내지만 일부 컨텍스트에서는 제너레이터 반복기를 나타낼 수 있습니다.의도한 의미가 명확하지 않은 경우에는 용어 전체를 사용하여 애매함을 회피합니다.
모든 사람들이 예시와 함께 정말 멋지고 장황한 답변을 가지고 있고 나는 정말 그것에 감사한다.개념적으로 아직 명확하지 않은 분들을 위해 몇 줄의 답변을 드리고자 합니다.
자체 반복기를 만드는 경우 약간 복잡합니다. 클래스를 만들고 적어도 반복기와 다음 메서드를 구현해야 합니다.그러나 이러한 번거로움을 겪지 않고 신속하게 반복기를 만들고 싶다면 어떻게 해야 할까요?다행히 Python은 반복자를 정의하는 지름길을 제공합니다.실행할 함수는 적어도1개의 호출이 있는 함수를 정의하기만 하면 됩니다.이 함수를 호출하면 반복기와 같은 "something"이 반환됩니다(다음 메서드를 호출하여 for 루프에서 사용할 수 있습니다).이것은 Python에서 Generator라는 이름을 가지고 있다.
그게 좀 더 명확해졌으면 좋겠어요.
반복기 및 생성기에 강력히 권장되는 Ned Batchelder의 예
짝수에 대해 뭔가를 하는 생성기가 없는 방법
def evens(stream):
them = []
for n in stream:
if n % 2 == 0:
them.append(n)
return them
발전기를 사용하여
def evens(stream):
for n in stream:
if n % 2 == 0:
yield n
- 명세서나 명세서는 필요 없습니다
- 대용량/무제한 길이 스트림에 효율적...그냥 걸어다니며 가치를 창출해낸다.
더 ★★★★★★★★★★★★★★★★」evens
는 통상의 method(으)입니다.
num = [...]
for n in evens(num):
do_smth(n)
- 발전기는 이중 루프를 차단하는 데도 사용됩니다.
반복기
페이지가 가득 찬 책은 반복할 수 있고, 북마크는 반복할 수 있다.
이는 ' 것' 에는 아무 .next
litr = iter([1,2,3])
next(litr) ## 1
next(litr) ## 2
next(litr) ## 3
next(litr) ## StopIteration (Exception) as we got end of the iterator
발전기를 사용하려면... 기능이 필요합니다.
를 사용하려면 Iterator가 합니다.next
★★★★★★★★★★★★★★★★★」iter
말씀드린 바와 같이:
제너레이터 함수는 반복기 개체를 반환합니다.
Iterator의 전체적인 장점:
한 번에 한 요소씩 메모리에 저장
에서 이되었습니다. 에는 이 추가가 . 제너레이터에close
일반적인 반복기에서는 그렇지 않습니다.close
는 ""를 .StopIteration
로, 발생기는 발생기의 예외로, 발생기는 발생기의 경우 발생기에 걸릴 수 있습니다.finally
뒷처리를 할 수 있는 기회를 얻기 위해 그 반복자의 조항이 있습니다.이 추상화를 통해 단순 반복기보다 대규모 반복기에서 가장 유용하게 사용할 수 있습니다.파일을 닫을 수 있는 만큼 아래를 신경 쓸 필요 없이 발전기를 닫을 수 있다.
첫 나의 수 있는 은 「반복할 수 있다」, 「반복할 수 있다」, 「반복할 수 있다.__iter__
는 「」, 「」를 .__next__
에는, 「」와「」의 양쪽 .__iter__
a. a. a.__next__
의 「」close
.
. 공공 인터페이스에서는 발전기가 . 즉, 발전기는 더 탄력적이기 때문입니다. 퍼블릭 인터페이스에서는 발전기를 매우 선호합니다. 왜냐하면 발전기가 더 탄력적이기 때문입니다.close
와의 합성성을 높이는 방법을 취하다yield from
할 수 하고 단순한 구조(되지 않음)일 경우, 되기 전에 될 수 로컬에서는 반복기를 사용할 수 있지만, 평평하고 단순한 구조(반복기가 쉽게 구성되지 않음)일 경우, 특히 시퀀스가 끝나기 전에 중단될 수 있다면 더욱 그렇습니다.나는 반복자를 낮은 수준의 원시어로 보는 경향이 있다. 다만 리터럴은 제외한다.
제어 흐름 문제에 있어 발전기는 약속만큼이나 중요한 개념입니다. 두 개념은 모두 추상적이고 구성 가능합니다.
코드 없음 4행 치트 시트:
A generator function is a function with yield in it.
A generator expression is like a list comprehension. It uses "()" vs "[]"
A generator object (often called 'a generator') is returned by both above.
A generator is also a subtype of iterator.
이 없으면 iterable
★★★★★★★★★★★★★★★★★」iterator protocol
.
- 「 」의 입니까?
iterator
★★★★★★★★★★★★★★★★★」iterable
iterable
하는 「의 힘을 」iterator
을데이 되는 몇 이 있습니다.iterator
★★★★★★★★★★★★★★★★★」iterable
★★★★- 한 가지 다른 점이 있다면
iterator
있다__next__
법,,iterable
지지않않않않 - 다른으로는 두 '하다 - 하다'가 있습니다.
__iter__
★★★★★★★★★의 경우iterable
이치노의iterator
스스로 되돌아옵니다. 하면 것, 음, 음, 음, ish, , 음, 음, 음, 음, this, this을 구분하는데 도움이 됩니다.iterator
★★★★★★★★★★★★★★★★★」iterable
실제로요.
- 한 가지 다른 점이 있다면
>>> x = [1, 2, 3]
>>> dir(x)
[... __iter__ ...]
>>> x_iter = iter(x)
>>> dir(x_iter)
[... __iter__ ... __next__ ...]
>>> type(x_iter)
list_iterator
「 」에
iterables
python
무슨 일입니까?list
,string
,range
가 뭐죠?이??iterators
무슨 일입니까?enumerate
,zip
,reversed
기타. 상기 방법을 사용하여 확인할 수 있습니다.좀 헷갈리네요.아아 、 류류만만있울 울울울울 。range
★★★★★★★★★★★★★★★★★」zip
중 는 - 이렇게 하는 것입니다.range
에는 많은 추가 기능이 있습니다.인덱스화하거나 번호가 포함되어 있는지 등을 확인할 수 있습니다(자세한 내용은 여기를 참조).「」를 할 수 ?
iterator
우리 자신?이론상으로는 도입할 수 있습니다.Iterator Protocol
(여기를 참조).우리는 글을 쓸 필요가 있다.__next__
★★★★★★★★★★★★★★★★★」__iter__
및 raise " "를 실행합니다.StopIteration
예외 등(예시와 가능한 동기에 대해서는 Alex Martelli의 답변을 참조해 주세요.여기도 참조).그러나 실제로는 발전기를 사용합니다.그것은 지금까지의 주요 작성 방법인 것 같다.iterators
python
.
이러한 개념의 실제 사용법을 다소 혼란스럽게 보여주는 몇 가지 흥미로운 예를 들어 보겠습니다.
keras
.tf.keras.preprocessing.image.ImageDataGenerator
이;가 .__next__
★★★★★★★★★★★★★★★★★」__iter__
즉, 반복자가 아니라, 반복자 생성자가 , 반복자(또는 생성자)가 아니라, 반복자(또는 생성자)가 됩니다.- 라고 하면.」라고
flow_from_dataframe()
수 있는 방법DataFrameIterator
은 구현되지 .StopIteration
.python
에서는 "A"; "A"라고 수 .DataFrameIterator
의 곱셈(x, y)
- 또 - 아, 맞다 - 또 있어요.
Sequence
을 in in in inkeras
멀티스레딩에 ). 이 되지 않습니다.하다, 하다, 하다, 실실실 다실 실다 다__next__
★★★★★★★★★★★★★★★★★」__iter__
yield
★★★★★★★★★★★★★★★★)
제너레이터 기능, 제너레이터 개체, 제너레이터:
Generator 함수는 Python의 일반 함수와 동일하지만 하나 이상의 함수가 포함되어 있습니다.yield
진술들.제너레이터 기능은 가능한 한 쉽게 반복기 개체를 만들 수 있는 훌륭한 도구입니다.생성기 함수에 의해 반복되는 반복기 개체는 생성기 개체 또는 생성기라고도 합니다.
오브젝트 「Generator」를하는 「를했습니다.<generator object fib at 0x01342480>
.는 다른 로 ada에서 할 수 for
또는 " " " " " " " " " " " 를 합니다.next()
제너레이터에서 다음 값을 반환합니다.
def fib(max):
a, b = 0, 1
for i in range(max):
yield a
a, b = b, a + b
print(fib(10)) #<generator object fib at 0x01342480>
for i in fib(10):
print(i) # 0 1 1 2 3 5 8 13 21 34
print(next(myfib)) #0
print(next(myfib)) #1
print(next(myfib)) #1
print(next(myfib)) #2
따라서 생성기 함수는 반복기 객체를 만드는 가장 쉬운 방법입니다.
반복기:
모든 제너레이터 객체는 반복기이지만 그 반대는 아닙니다.클래스가 구현된 경우 사용자 지정 반복기 개체를 만들 수 있습니다.__iter__
★★★★★★★★★★★★★★★★★」__next__
메서드
단, 생성기 함수를 사용하여 반복기를 작성하는 것은 매우 간단하지만 커스텀 반복기를 사용하면 다음 예시와 같이 필요에 따라 다른 메서드를 구현할 수 있습니다.
class Fib:
def __init__(self,max):
self.current=0
self.next=1
self.max=max
self.count=0
def __iter__(self):
return self
def __next__(self):
if self.count>self.max:
raise StopIteration
else:
self.current,self.next=self.next,(self.current+self.next)
self.count+=1
return self.next-self.current
def __str__(self):
return "Generator object"
itobj=Fib(4)
print(itobj) #Generator object
for i in Fib(4):
print(i) #0 1 1 2
print(next(itobj)) #0
print(next(itobj)) #1
print(next(itobj)) #1
동일한 데이터에 대해 두 가지 방법을 비교할 수 있습니다.
def myGeneratorList(n):
for i in range(n):
yield i
def myIterableList(n):
ll = n*[None]
for i in range(n):
ll[i] = i
return ll
# Same values
ll1 = myGeneratorList(10)
ll2 = myIterableList(10)
for i1, i2 in zip(ll1, ll2):
print("{} {}".format(i1, i2))
# Generator can only be read once
ll1 = myGeneratorList(10)
ll2 = myIterableList(10)
print("{} {}".format(len(list(ll1)), len(ll2)))
print("{} {}".format(len(list(ll1)), len(ll2)))
# Generator can be read several times if converted into iterable
ll1 = list(myGeneratorList(10))
ll2 = myIterableList(10)
print("{} {}".format(len(list(ll1)), len(ll2)))
print("{} {}".format(len(list(ll1)), len(ll2)))
게다가 메모리 풋프린트를 체크하면, 모든 값을 동시에 메모리에 보존할 필요는 없기 때문에, 제너레이터의 메모리 소비량은 큰폭으로 삭감됩니다.
이 스레드에서는 두 가지 차이점에 대해 자세히 설명하지만, 두 가지 차이점 간의 개념적인 차이에 대해 추가하고자 합니다.
[...] GoF 북에 정의된 반복기는 컬렉션에서 항목을 검색하는 반면 생성기는 "갑자기" 항목을 생성할 수 있습니다.그렇기 때문에 Fibonacci 시퀀스 생성기가 일반적인 예입니다. 즉, 무한 시리즈의 숫자를 컬렉션에 저장할 수 없습니다.
라말호, 루치아노Fluent Python (415페이지)오라일리 미디어.킨들 에디션
물론 모든 것을 망라하는 것은 아니지만, 언제 도움이 될 수 있을지는 잘 알 수 있다고 생각합니다.
반복할 수 있는 물체는 반복할 수 있는 것이다.단, 그러기 위해서는 반복 객체 같은 것이 필요합니다.용어가 혼란스러울 수 있습니다.반복 가능한 오브젝트에는__iter__
반복 가능한 개체의 반복기 개체를 반환하는 메서드입니다.
반복기 개체는 규칙 집합인 반복기 프로토콜을 구현하는 개체입니다.이 경우 적어도 다음 2가지 방법이 필요합니다.__iter__
★★★★★★★★★★★★★★★★★」__next__
. 。__next__
방법__iter__
방법 수 , 는 반복기가 .__iter__
자체를 한다(일반적으로 '반환하다').return self
를 참조해 주세요.
의 반복 는 「」입니다.list
반복기가 있어요.__iter__
이치노은 '으로 하다'라고할 수 있습니다.things.__iter__()
또는 를 사용합니다.iter(things)
.
수집을 반복하려면 해당 반복기를 사용해야 합니다.
things_iterator = iter(things)
for i in things_iterator:
print(i)
그러나 Python은 자동으로 반복기를 사용하기 때문에 위의 예를 볼 수 없습니다.대신 다음과 같이 적습니다.
for i in things:
print(i)
직접 반복기를 쓰는 것은 지루할 수 있기 때문에 Python은 더 간단한 대안인 제너레이터 함수를 가지고 있습니다.제너레이터 함수는 일반적인 함수가 아닙니다.코드를 실행하고 최종 결과를 반환하는 대신 코드가 지연되고 함수는 생성기 개체와 함께 즉시 반환됩니다.
생성기 개체는 반복기 프로토콜을 구현한다는 점에서 반복기 개체와 같습니다.웬만하면 그걸로 충분해.다른 답변에는 생성기의 예가 많이 있습니다.
즉, 반복기는 컬렉션이든 다른 값 소스든 다른 개체를 통해 반복할 수 있는 객체입니다.생성기는 어느 정도 동일한 작업을 수행하지만 구현이 더 쉬운 단순화된 반복기입니다.
보통은 발전기만 있으면 됩니다.그러나 다른 기능 간의 반복을 포함하는 더 복잡한 개체를 작성하는 경우 대신 반복기 프로토콜을 사용합니다.
Python 신참을 위해 특별히 심플하게 글을 쓰고 있지만, Python은 마음속 깊이 많은 것을 하고 있습니다.
가장 기본적인 것부터 시작합시다.
리스트를 생각해 봅시다.
l = [1,2,3]
이와 동등한 함수를 적어 보겠습니다.
def f():
return [1,2,3]
O/Pprint(l): [1,2,3]
§의 op/op/print(f()) : [1,2,3]
목록을 읽기 쉽게 만듭니다.in python list는 항상 반복할 수 있습니다.즉, 원하는 시간에 반복기를 적용할 수 있습니다.
목록에 반복기를 적용합니다.
iter_l = iter(l) # iterator applied explicitly
함수를 반복할 수 있도록 합니다. 즉, 동등한 생성 함수를 작성합니다.python에서는 키워드를 도입하면 바로 generator 함수가 되어 interator가 암묵적으로 적용됩니다.
참고: 모든 제너레이터는 암묵적 반복기를 적용하면 항상 반복 가능하며, 여기서는 암묵적 반복기가 핵심입니다. 따라서 제너레이터 함수는 다음과 같습니다.
def f():
yield 1
yield 2
yield 3
iter_f = f() # which is iter(f) as iterator is already applied implicitly
따라서 관측한 경우 함수 f를 생성기로 만들자마자 이미 반복됩니다(f).
지금이다,
l은 반복자 메서드 "반복자"를 적용한 후 반복자(l)
f는 이미 반복자(f)이며, 반복자 메서드 "반복자"를 적용한 후 반복자(f)가 되고, 다시 반복자(f)가 됩니다.
이미 int(x)가 되어 있는 int(x)에 삽입하는 것과 같습니다.
예를 들어 o/p는 다음과 같습니다.
print(type(iter(iter(l))))
이
<class 'list_iterator'>
이것은 Python이며 C 또는 C++가 아님을 잊지 마십시오.
따라서 위의 설명에서 결론은 다음과 같습니다.
목록 l ~= 반복(l)
제너레이터 함수 f == 반복기(f)
언급URL : https://stackoverflow.com/questions/2776829/difference-between-pythons-generators-and-iterators
'programing' 카테고리의 다른 글
Enum의 values() 메서드에 대한 문서는 어디에 있습니까? (0) | 2023.01.03 |
---|---|
기존 테이블에 외부 키 추가 (0) | 2023.01.03 |
재정의 메서드가 재정의 메서드보다 더 넓은 예외를 발생시킬 수 없는 이유는 무엇입니까? (0) | 2023.01.03 |
jQuery Data vs Attr? (0) | 2023.01.03 |
sqlite3.프로그래밍 오류:제공된 바인딩 수가 잘못되었습니다.현재 스테이트먼트에서는 1을 사용하고 있으며 74가 제공되고 있습니다. (0) | 2022.12.29 |