반복자, 반복 가능 및 반복은 정확히 무엇입니까?
파이썬에서 "iterable", "iterator"및 "iteration"의 가장 기본적인 정의는 무엇입니까?
여러 정의를 읽었지만 여전히 침몰하지 않는 정확한 의미를 식별 할 수 없습니다.
평신도 용어로 세 가지 정의를 도와 줄 수 있습니까?
반복 이란 무엇인가의 각 항목을 차례로 가져 오는 일반적인 용어입니다. 명시 적이든 암시적인 루프를 사용하여 항목 그룹을 반복 할 때마다 반복입니다.
파이썬에서 iterable 과 iterator 는 특정한 의미를 가지고 있습니다.
반복자는 가진 개체입니다 __iter__
반환 방법 반복자를 , 또는 정의하는 __getitem__
0부터 시작하여 순차적으로 인덱스를 취할 수있는 방법을 (그리고를 제기하지 IndexError
인덱스가 더 이상 유효 할 때를). SO를 반복 가능한은 당신이 얻을 수있는 객체입니다 반복자 에서가.
반복자 A의 목적 next
(파이썬 2) 또는 __next__
(3 파이썬) 방법.
파이썬에서 for
루프 또는 map
목록 이해 등 을 사용할 때마다 반복기next
에서 각 항목을 가져 오기 위해 메소드가 자동으로 호출 되므로 반복 프로세스가 진행됩니다 .
학습을 시작하기에 좋은 곳 은 튜토리얼 의 반복자 섹션과 표준 유형 페이지 의 반복자 유형 섹션입니다 . 기본 사항을 이해 한 후 Functional Programming HOWTO 의 반복자 섹션을 시도하십시오 .
파이썬 클래스를 가르치는 데 사용하는 설명은 다음과 같습니다.
ITERABLE은 다음과 같습니다
- 반복 될 수있는 것 (즉, 문자열이나 파일을 반복 할 수있는 것) 또는
- for-loop의 오른쪽에 나타날 수있는 것 :
for x in iterable: ...
또는 - 당신이 호출 할 수있는 것도
iter()
그 반복자를 반환합니다iter(obj)
또는 __iter__
새로운 ITERATOR를 반환 하는 객체를 정의 하거나__getitem__
인덱스 조회에 적합한 메소드를 가질 수 있습니다 .
ITERATOR는 객체입니다.
- 반복하는 동안의 위치를 기억하는 상태로
- 다음과 같은
__next__
방법으로 :- 반복에서 다음 값을 반환
- 다음 값을 가리 키도록 상태를 업데이트합니다.
- 올리면 신호
StopIteration
- 그리고 그것은 스스로 반복 가능합니다 (
__iter__
을 반환 하는 메소드 가 있음을 의미 합니다self
).
노트:
__next__
Python 3 의 메소드는next
Python 2에서 철자가 되며- 내장 함수
next()
는 전달 된 객체에서 해당 메소드를 호출합니다.
예를 들면 다음과 같습니다.
>>> s = 'cat' # s is an ITERABLE
# s is a str object that is immutable
# s has no state
# s has a __getitem__() method
>>> t = iter(s) # t is an ITERATOR
# t has state (it starts by pointing at the "c"
# t has a next() method and an __iter__() method
>>> next(t) # the next() function returns the next value and advances the state
'c'
>>> next(t) # the next() function returns the next value and advances
'a'
>>> next(t) # the next() function returns the next value and advances
't'
>>> next(t) # next() raises StopIteration to signal that iteration is complete
Traceback (most recent call last):
...
StopIteration
>>> iter(t) is t # the iterator is self-iterable
위의 답변은 훌륭하지만 내가 본 것의 대부분은 나와 같은 사람들에게 구별을 강조하지 않습니다 .
또한 사람들은 "X는 __foo__()
메서드 가있는 객체입니다"와 같은 정의를 넣어서 "너무 Pythonic"을 얻는 경향이 있습니다. 이러한 정의는 정확합니다. 오리-타이핑 철학을 기반으로하지만 개념을 단순하게 이해하려고 할 때 방법에 중점을 두는 경향이 있습니다.
그래서 내 버전을 추가합니다.
자연어로
- 반복 은 한 번에 하나의 요소를 한 행의 요소로 가져 오는 프로세스입니다.
파이썬에서
iterable 은 간단하게 반복 가능한 객체이며 반복과 같이 반복에 사용될 수 있음을 의미합니다
for
. 어떻게? 반복자 를 사용하여 . 아래에 설명하겠습니다.... iterator 는 실제로 반복을 수행 하는 방법 , 특히 다음 요소 가 무엇인지 정의 하는 객체입니다 . 그것이
next()
방법 이 있어야하는 이유 입니다.
이터레이터는 이전에 대한 호출에 의해 항목이 소비되었는지 여부에 관계없이 __iter__()
메소드가 동일한 객체 ( self
)를 리턴 한다는 차이점을 가지고 반복 가능 합니다 next()
.
그렇다면 파이썬 인터프리터는 for x in obj:
문장 을 볼 때 어떻게 생각 합니까?
봐봐,
for
루프 이터레이터를위한 직업인 것 같습니다. ...이obj
사람 이 있으니 물어 보자."씨
obj
, 반복자가 있습니까?" (... 호출iter(obj)
, 호출obj.__iter__()
, 반짝이는 새 반복자를 행복하게 전달 함_i
)좋아, 쉬웠다 ... 반복을 시작하자. (
x = _i.next()
...x = _i.next()
...)
Mr. obj
이 테스트에서 성공한 이후 (유효한 반복자를 반환하는 특정 방법을 통해), 우리는 형용사에게 보상합니다 : 이제 "iterable Mr. obj
" 라고 부를 수 있습니다 .
그러나 간단한 경우에는 일반적으로 이터레이터와 이터 러블을 별도로 사용하면 이점이 없습니다. 따라서 자체 반복자 인 하나의 객체 만 정의 합니다. (파이썬은 정말 상관하지 않습니다 _i
에 의해 손으로 아웃 obj
모두 반짝 아니었지만, 바로 obj
그 자체.)
이것이 내가 본 대부분의 예에서 (그리고 나를 계속 혼란스럽게 한 것) 당신이 볼 수있는 이유입니다.
class IterableExample(object):
def __iter__(self):
return self
def next(self):
pass
대신에
class Iterator(object):
def next(self):
pass
class Iterable(object):
def __iter__(self):
return Iterator()
그러나 한 행의 항목을 원하지만 더 많은 "커서"를 원할 때와 같이 반복자를 iterable과 분리하여 얻을 수있는 경우가 있습니다. 예를 들어 "현재"및 "앞에 오는"요소로 작업하려는 경우 둘 다에 대해 별도의 반복자를 가질 수 있습니다. 또는 거대한 목록에서 여러 스레드를 가져옵니다. 각 스레드에는 모든 항목을 순회하는 자체 반복자가있을 수 있습니다. 참조 @ 레이몬드의 및 @ glglgl의 위의 답변.
할 수있는 일을 상상해보십시오.
class SmartIterableExample(object):
def create_iterator(self):
# An amazingly powerful yet simple way to create arbitrary
# iterator, utilizing object state (or not, if you are fan
# of functional), magic and nuclear waste--no kittens hurt.
pass # don't forget to add the next() method
def __iter__(self):
return self.create_iterator()
노트:
다시 반복하겠습니다 : 반복자는 반복 할 수 없습니다 . 반복자를 "소스"
for
루프 로 사용할 수 없습니다 . 무엇for
루프가 기본적으로 필요로하는 것입니다__iter__()
(와 그 반환 일next()
).물론,
for
유일한 반복 루프는 아니므로 위의 일부 다른 구문에도 적용됩니다 (while
...).반복자
next()
는 StopIteration을 발생시켜 반복을 중지 할 수 있습니다. 그러나 영원히 반복하거나 다른 수단을 사용할 필요는 없습니다.위의 "생각 과정"
_i
에는 실제로 존재하지 않습니다. 나는 그 이름을 만들었습니다.파이썬 3.x에는 약간의 변화가 있습니다 :
next()
(내장되지 않은) 메소드는 이제 호출되어야합니다__next__()
. 그렇습니다.iterable에는 데이터가 있고 iterator는 다음 항목을 가져옵니다.
면책 조항 : 저는 파이썬 인터프리터 개발자가 아니므로 인터프리터가 무엇을 생각하는지 모르겠습니다. 위의 생각은 파이썬 초보자의 다른 설명, 실험 및 실제 경험에서 주제를 이해하는 방법을 보여줍니다.
iterable은 __iter__()
메소드 가있는 객체입니다 . list()
s 및 tuple()
s 와 같이 여러 번 반복 될 수 있습니다 .
반복자는 반복되는 객체입니다. __iter__()
메소드에 의해 리턴되고 자체 __iter__()
메소드 를 통해 자체 리턴되며 next()
메소드 ( __next__()
3.x)가 있습니다.
반복은이 next()
resp 를 호출하는 프로세스입니다 . __next__()
그것이 올 때까지 StopIteration
.
예:
>>> a = [1, 2, 3] # iterable
>>> b1 = iter(a) # iterator 1
>>> b2 = iter(a) # iterator 2, independent of b1
>>> next(b1)
1
>>> next(b1)
2
>>> next(b2) # start over, as it is the first call to b2
1
>>> next(b1)
3
>>> next(b1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> b1 = iter(a) # new one, start over
>>> next(b1)
1
그것이 누구에게 도움이되는지 모르겠지만 항상 개념을 더 잘 이해하기 위해 머리 속에 개념을 시각화하는 것을 좋아합니다. 그래서 작은 아들이 있으므로 벽돌과 백서를 사용하여 반복 가능 / 반복자 개념을 시각화합니다.
우리가 어두운 방에 있고 바닥에 아들을위한 벽돌이 있다고 가정 해 봅시다. 다른 크기, 색의 벽돌은 이제 중요하지 않습니다. 5 개의 벽돌이 있다고 가정 해 봅시다. 이 5 개의 브릭은 오브젝트 로 설명 될 수 있습니다 . 브릭 키트를 예로 들어 보겠습니다 . 우리는이 벽돌 키트로 많은 일을 할 수 있습니다 – 하나를 가져다가 두 번째로, 세 번째로, 벽돌의 장소를 바꾸고, 첫 번째 벽돌을 두 번째 위에 놓을 수 있습니다. 우리는 그것들로 많은 종류의 일을 할 수 있습니다. 따라서이 브릭 키트는 각 브릭을 거치면서 무언가를 할 수 있으므로 반복 가능한 객체 또는 시퀀스 입니다. 우리는 나의 작은 아들처럼 그것을 할 수 있습니다 – 우리는 한 번에 하나의 벽돌 로 놀 수 있습니다 . 다시 한번이 벽돌 키트는반복 가능 .
이제 우리는 어두운 방에 있다는 것을 기억하십시오. 아니면 거의 어둡습니다. 문제는 벽돌, 색상, 모양 등을 명확하게 볼 수 없다는 것입니다. 따라서 벽돌을 통해 무언가를하고 싶더라도 (일명 반복) – 실제로 무엇을 어떻게 알지 못합니다. 너무 어둡다.
우리가 할 수있는 일은 벽돌 키트의 요소 인 첫 번째 벽돌 근처에 있습니다. 첫 번째 벽돌 요소의 위치를 알 수 있도록 흰색 형광 종이를 넣을 수 있습니다. 키트에서 벽돌을 가져갈 때마다 어두운 방에서 볼 수 있도록 흰색 종이를 다음 벽돌로 바꿉니다. 이 하얀 종이는 이터레이터에 지나지 않습니다 . 그것은 또한 대상 이다. 그러나 반복 가능한 객체 – 브릭 키트의 요소로 작업하고 재생할 수있는 객체.
그건 그렇고 IDLE에서 다음을 시도하고 TypeError가 발생했을 때 초기 실수를 설명합니다.
>>> X = [1,2,3,4,5]
>>> next(X)
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
next(X)
TypeError: 'list' object is not an iterator
X 목록은 우리의 벽돌 키트 였지만 흰 종이는 아닙니다. 반복자를 먼저 찾아야했습니다.
>>> X = [1,2,3,4,5]
>>> bricks_kit = [1,2,3,4,5]
>>> white_piece_of_paper = iter(bricks_kit)
>>> next(white_piece_of_paper)
1
>>> next(white_piece_of_paper)
2
>>>
그것이 도움이되는지 모르겠지만 도움이되었습니다. 누군가가 개념의 시각화를 확인 / 수정할 수 있다면 감사하겠습니다. 더 배우는 데 도움이 될 것입니다.
내 치트 시트는 다음과 같습니다.
sequence
+
|
v
def __getitem__(self, index: int):
+ ...
| raise IndexError
|
|
| def __iter__(self):
| + ...
| | return <iterator>
| |
| |
+--> or <-----+ def __next__(self):
+ | + ...
| | | raise StopIteration
v | |
iterable | |
+ | |
| | v
| +----> and +-------> iterator
| ^
v |
iter(<iterable>) +----------------------+
|
def generator(): |
+ yield 1 |
| generator_expression +-+
| |
+-> generator() +-> generator_iterator +-+
퀴즈 : 당신은 어떻게 보입니까 ...
- 모든 반복자는 반복 가능합니까?
- 컨테이너 객체의
__iter__()
메소드는 생성기로 구현할 수 있습니까? - iterable과
__next__
method가 반드시 반복자 일 필요는 없습니까?
반복 가능 : 반복 가능한 것은 반복 가능합니다. 리스트, 문자열 등과 같은 시퀀스와 유사합니다. 또한 __getitem__
메소드 또는 __iter__
메소드가 있습니다. 이제 iter()
해당 객체에서 함수를 사용 하면 반복자를 얻습니다.
Iterator :- iter()
함수 에서 iterator 객체를 가져올 때 ; 우리 는 요소를 하나씩 얻기 위해 ( __next__()
python3에서) 또는 단순히 next()
(python2에서 ) 메소드 를 호출 합니다. 이 클래스 또는이 클래스의 인스턴스를 반복 자라고합니다.
문서에서 :-
반복자를 사용하면 파이썬이 널리 퍼지고 통합됩니다. 배후에서 for 문 iter()
은 컨테이너 객체를 호출 합니다. 이 함수는 __next__()
컨테이너의 요소에 한 번에 하나씩 액세스 하는 메서드 를 정의하는 반복자 객체를 반환합니다 . 더 이상 요소가 없으면 __next__()
for 루프를 종료하도록 알리는 StopIteration 예외를 발생시킵니다. 내장 함수를 __next__()
사용 하여 메소드를 호출 할 수 있습니다 next()
. 이 예제는 모든 작동 방식을 보여줍니다.
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
수업의 예 :-
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
... print(char)
...
m
a
p
s
나는 당신이 documentation 보다 훨씬 간단하게 얻을 수 있다고 생각하지 않지만 시도 할 것이다.
- 반복 은 반복 될 수있는 것입니다 . 실제로는 일반적으로 시작과 끝이 있는 시퀀스 와 그 안에있는 모든 항목을 통과하는 방법을 의미합니다.
Iterator 를 iterable 의 다음 (또는 첫 번째) 항목을 제공 (또는 보유)하는 도우미 의사 메소드 (또는 의사 속성)로 생각할 수 있습니다 . (실제로는 메소드를 정의하는 객체 일뿐입니다
next()
)반복 은 아마도 Merriam-Webster 정의에 의해 가장 잘 설명 될 것입니다 .
b : 지정된 횟수만큼 또는 조건이 충족 될 때까지 일련의 컴퓨터 명령 반복-재귀 비교
iterable = [1, 2]
iterator = iter(iterable)
print(iterator.__next__())
print(iterator.__next__())
그래서,
iterable
반복 될 수 있는 객체 입니다 . 예를 들어 list, string, tuple 등객체 에서
iter
함수를 사용하면 반복자 객체iterable
가 반환됩니다 .이제이 반복자 객체 에는
__next__
(It 's Python 3 또는next
Python 2) 라는 이름의 메소드가 있습니다.이 메소드 를 통해 반복 가능한 각 요소에 액세스 할 수 있습니다.
따라서 위의 코드 출력은 다음과 같습니다.
1
2
이터 러블과 이터레이터를 다루기 전에 이터 러블과 이터레이터를 결정하는 주요 요인은 시퀀스입니다.
시퀀스 : 시퀀스는 데이터 수집입니다
Iterable : Iterable은 Iter 메소드를 지원하는 시퀀스 유형 객체입니다.
Iter 메소드 : Iter 메소드는 입력으로 시퀀스를 가져오고 iterator로 알려진 오브젝트를 작성합니다.
반복자 : 반복자는 다음 메소드를 호출하고 시퀀스를 가로 지르는 객체입니다. 다음 메소드를 호출하면 현재 횡단 한 객체를 반환합니다.
예:
x=[1,2,3,4]
x는 데이터 수집으로 구성된 시퀀스입니다
y=iter(x)
iter (x)를 호출하면 x 객체에 iter 메서드가있는 경우에만 iterator를 반환합니다. 그렇지 않으면 예외가 발생합니다 .Iterator (x)를 호출하면 y가 다음과 같이 할당됩니다.
y=[1,2,3,4]
y는 반복자이므로 next () 메소드를 지원합니다
다음 메소드를 호출하면 목록의 개별 요소를 하나씩 리턴합니다.
시퀀스의 마지막 요소를 반환 한 후 다음 메소드를 다시 호출하면 StopIteration 오류가 발생합니다.
예:
>>> y.next()
1
>>> y.next()
2
>>> y.next()
3
>>> y.next()
4
>>> y.next()
StopIteration
이터 러블 에는
__iter__
매번 새로운 반복자를 인스턴스화 하는 방법이 있습니다.반복자
__next__
는 개별 항목을 반환 하는 메서드 와을 반환 하는 메서드를 구현__iter__
합니다self
.따라서 반복자는 반복 가능하지만 반복자는 반복자가 아닙니다.
유창한 파이썬 인 Luciano Ramalho.
파이썬에서는 모든 것이 객체입니다. 객체가 반복 가능하다고 말하면 객체를 컬렉션으로 단계별 (즉, 반복) 할 수 있음을 의미합니다.
예를 들어 배열은 반복 가능합니다. for 루프를 사용하여 단계별로 탐색하고 인덱스 0에서 인덱스 n으로 이동할 수 있습니다. n은 배열 객체의 길이에서 1을 뺀 길이입니다.
사전 (키 / 값 쌍, 연관 배열이라고도 함)도 반복 가능합니다. 당신은 그들의 열쇠를 통해 단계 수 있습니다.
컬렉션이 아닌 객체는 반복 할 수 없습니다. 예를 들어 bool 객체에는 True 또는 False 값만 있습니다. 반복 할 수 없습니다 (반복 가능한 객체라는 것은 말이되지 않습니다).
더 읽어보세요. http://www.lepus.org.uk/ref/companion/Iterator.xml
참고 URL : https://stackoverflow.com/questions/9884132/what-exactly-are-iterator-iterable-and-iteration
'Programing' 카테고리의 다른 글
파이썬 소스에서 UTF-8 인코딩으로 작업하기 (0) | 2020.02.22 |
---|---|
선택적 매개 변수? (0) | 2020.02.22 |
JavaScript에서 [1,2] + [3,4] = "1,23,4"인 이유는 무엇입니까? (0) | 2020.02.22 |
RadioButton을 열거 형에 바인딩하는 방법은 무엇입니까? (0) | 2020.02.22 |
저자와 날짜를 포함하는 git log에서 가능한 가장 짧은 출력 (0) | 2020.02.22 |