파이썬에서 "iterable", "iterator"및 "iteration"의 가장 기본적인 정의는 무엇입니까?
여러 정의를 읽었지만 여전히 침몰하지 않는 정확한 의미를 식별 할 수 없습니다.
평신도 용어로 세 가지 정의를 도와 줄 수 있습니까?
파이썬에서 "iterable", "iterator"및 "iteration"의 가장 기본적인 정의는 무엇입니까?
여러 정의를 읽었지만 여전히 침몰하지 않는 정확한 의미를 식별 할 수 없습니다.
평신도 용어로 세 가지 정의를 도와 줄 수 있습니까?
답변:
반복 이란 무엇인가의 각 항목을 차례로 가져 오는 일반적인 용어입니다. 명시 적이든 암시적인 루프를 사용하여 항목 그룹을 반복 할 때마다 반복입니다.
파이썬에서 iterable 과 iterator 는 특정한 의미를 가지고 있습니다.
반복자는 가진 개체입니다 __iter__
반환 방법 반복자를 , 또는 정의하는 __getitem__
0부터 시작하여 순차적으로 인덱스를 취할 수있는 방법을 (그리고를 제기하지 IndexError
인덱스가 더 이상 유효 할 때를). SO를 반복 가능한은 당신이 얻을 수있는 객체입니다 반복자 에서가.
반복자 A의 목적 next
(파이썬 2) 또는 __next__
(3 파이썬) 방법.
파이썬에서 for
루프 또는 map
목록 이해 등 을 사용할 때마다 next
메소드가 자동으로 호출되어 반복자 에서 각 항목을 가져 오므 로 반복 프로세스가 진행됩니다 .
학습을 시작하기에 좋은 곳 은 튜토리얼 의 반복자 섹션과 표준 유형 페이지 의 반복자 유형 섹션입니다 . 기본 사항을 이해 한 후 Functional Programming HOWTO 의 반복자 섹션을 시도하십시오 .
__len__
반복과 관련이 있을까요? 무언가의 길이를 아는 것은 그것을 반복하는 데 어떻게 도움이됩니까?
__getitem__
.
{'a': 'hi', 'b': 'bye'}
2의 길이를 가지고 있지만, 0, 1 또는 2로 인덱싱 할 수 없습니다
__iter__
방법이 있습니다. jlh는 " __getitem__
0부터 시작하는 순차 색인을 취할 수 있는 방법 "이라고 정의하기 때문에 반복 가능한 객체를 참조한다고 생각 합니다.
파이썬 클래스를 가르치는 데 사용하는 설명은 다음과 같습니다.
ITERABLE은 다음과 같습니다
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
for
루프에 관한 것이고 첫 번째 글 머리 기호는 "루핑 오버"에 관한 것이므로 첫 번째 글 머리 기호는 두 번째 글 머리 기호와 겹치는 것 같습니다 . 이 문제를 해결할 수 있습니까?
iter()
"으로 " 당신이 전화 할 수있는 것"을 다시 표현하는 것을 고려 합니다 iter()
.
위의 답변은 훌륭하지만 내가 본 대부분의 사람들처럼 나와 같은 사람들에게 차별화를 강조하지 않습니다 .
또한 사람들은 "X는 __foo__()
메서드 가있는 객체입니다"와 같은 정의를 넣어서 "너무 Pythonic"하는 경향이 있습니다. 이러한 정의는 정확합니다. 오리-타이핑 철학을 기반으로하지만 개념을 단순하게 이해하려고 할 때 방법에 중점을 두는 경향이 있습니다.
그래서 내 버전을 추가합니다.
자연어로
파이썬에서
iterable 은 간단하게 반복 가능한 객체로, 반복과 같이 반복에 사용될 수 있음을 의미합니다 (예 : for
루프). 어떻게? 반복자 를 사용하여 . 아래에 설명하겠습니다.
... 반복자 는 실제로 반복을 수행 하는 방법 , 특히 다음 요소 가 무엇인지 정의 하는 객체입니다 . 그것이 next()
방법 이 있어야하는 이유
입니다.
반복자는 자체 __iter__()
호출이 반복 self
되는지 여부에 관계없이 해당 메소드가 동일한 오브젝트 ( )를 리턴 한다는 점을 구별하여 반복 가능 합니다 next()
.
그렇다면 파이썬 인터프리터는 for x in obj:
문장 을 볼 때 어떻게 생각 합니까?
봐봐,
for
루프 이터레이터를위한 직업인 것 같습니다. ...이obj
사람 이 있으니 물어 보자."씨
obj
, 반복자가 있습니까?" (... 호출iter(obj)
, 호출obj.__iter__()
, 반짝이는 새 반복자를 행복하게 전달 함_i
)좋아, 쉬웠다 ... 반복을 시작하자. (
x = _i.next()
...x = _i.next()
...)
Mr. obj
이 테스트에서 성공한 이후 (유효한 반복자를 반환하는 특정 방법을 가짐) 우리는 형용사에게 보상합니다 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는 다음 항목을 가져옵니다.
면책 조항 : 저는 파이썬 인터프리터의 개발자가 아니므로 인터프리터가 무엇을 생각하는지 실제로 알지 못합니다. 위의 생각은 파이썬 초보자의 다른 설명, 실험 및 실제 경험에서 주제를 이해하는 방법을 보여줍니다.
for
루프가 반복자를 필요로하고 있다고 생각했다고 생각했다 . 그러나 마지막 노트에서 "반복자에서 for
루프를 소스로 사용할 수 없습니다 "...?
pass
그러한 next
정의를 위한 코드를 작성해야 합니까? 다음은 무언가를 반환해야하기 때문에 누군가 다음을 얻는 방법을 구현해야한다고 가정합니다.
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
Iterable
입니다. 독립적이지 않고 유효한 것으로 만들 수 있습니다 .
Iterator
항상 Iterable
자체이다 Iterator
의 두 통화 iter()
반드시 두 개의 독립적 인 제공하지 않습니다 Iterator
들.
내 치트 시트는 다음과 같습니다.
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__()
메소드는 생성기로 구현할 수 있습니까?__next__
메소드가 있는 iterable이 반드시 iterator 일 필요는 없습니까?대답:
__iter__
메소드 가 있어야합니다 . 갖는 __iter__
것은 반복 가능하기에 충분합니다. 따라서 모든 반복자는 반복 가능합니다.__iter__
호출 되면 반복자를 반환해야합니다 ( return <iterator>
위 다이어그램에서). 생성기를 호출하면 반복기 유형 인 생성기 반복기가 리턴됩니다.
class Iterable1:
def __iter__(self):
# a method (which is a function defined inside a class body)
# calling iter() converts iterable (tuple) to iterator
return iter((1,2,3))
class Iterable2:
def __iter__(self):
# a generator
for i in (1, 2, 3):
yield i
class Iterable3:
def __iter__(self):
# with PEP 380 syntax
yield from (1, 2, 3)
# passes
assert list(Iterable1()) == list(Iterable2()) == list(Iterable3()) == [1, 2, 3]
예를 들면 다음과 같습니다.
class MyIterable:
def __init__(self):
self.n = 0
def __getitem__(self, index: int):
return (1, 2, 3)[index]
def __next__(self):
n = self.n = self.n + 1
if n > 3:
raise StopIteration
return n
# if you can iter it without raising a TypeError, then it's an iterable.
iter(MyIterable())
# but obviously `MyIterable()` is not an iterator since it does not have
# an `__iter__` method.
from collections.abc import Iterator
assert isinstance(MyIterable(), Iterator) # AssertionError
__iter__
메소드 가 있으므로 iterable이됩니다 . 이 답변을 편집하여 2 위 및 3 위에 대해 자세히
__iter__()
반복자를 반환합니다. 생성기는 반복자이므로이 용도로 사용할 수 있습니다. re 3 : 여기에서만 추측 할 수 있지만 __iter__()
누락되거나 반환되지 않으면 self
반복자가 아니라고 생각합니다. 반복자 __iter__()
가 반환해야 하기 때문 self
입니다.
그것이 누구에게 도움이되는지 모르겠지만 항상 개념을 더 잘 이해하기 위해 머리 속에 개념을 시각화하는 것을 좋아합니다. 작은 아들이 있으므로 벽돌과 백서를 사용하여 반복 가능 / 반복자 개념을 시각화합니다.
우리가 어두운 방에 있고 바닥에 아들을위한 벽돌이 있다고 가정 해 봅시다. 다른 크기, 색의 벽돌은 이제 중요하지 않습니다. 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
>>>
그것이 도움이되는지 모르겠지만 도움이되었습니다. 누군가가 개념의 시각화를 확인 / 수정할 수 있다면 감사하겠습니다. 더 배우는 데 도움이 될 것입니다.
반복 가능 : 반복 가능한 것은 반복 가능합니다. 리스트, 문자열 등과 같은 시퀀스와 유사합니다. 또한 __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
이터 러블과 이터레이터를 다루기 전에 이터 러블과 이터레이터를 결정하는 주요 요인은 시퀀스입니다.
시퀀스 : 시퀀스는 데이터 수집입니다
반복 가능 : 반복 가능은 __iter__
메소드 를 지원하는 시퀀스 유형 오브젝트입니다 .
Iter 메소드 : Iter 메소드는 입력으로 시퀀스를 가져오고 iterator로 알려진 오브젝트를 작성합니다.
반복자 : 반복자는 다음 메소드를 호출하고 시퀀스를 가로 지르는 객체입니다. 다음 메소드를 호출하면 현재 순회 한 오브젝트를 리턴합니다.
예:
x=[1,2,3,4]
x는 데이터 수집으로 구성된 시퀀스입니다
y=iter(x)
호출 iter(x)
하면 x 객체에 iter 메소드가있는 경우에만 반복자를 리턴합니다. 그렇지 않으면 예외가 발생합니다. 반환자를 리턴하면 y는 다음과 같이 지정됩니다.
y=[1,2,3,4]
y는 반복자이므로 next()
메소드를 지원 합니다.
다음 메소드를 호출하면 목록의 개별 요소를 하나씩 리턴합니다.
시퀀스의 마지막 요소를 반환 한 후 다음 메소드를 다시 호출하면 StopIteration 오류가 발생합니다.
예:
>>> y.next()
1
>>> y.next()
2
>>> y.next()
3
>>> y.next()
4
>>> y.next()
StopIteration
파이썬에서는 모든 것이 객체입니다. 객체가 반복 가능하다고 말하면 객체를 컬렉션으로 단계별 (즉, 반복) 할 수 있음을 의미합니다.
예를 들어 배열은 반복 가능합니다. for 루프를 사용하여 단계별로 탐색하고 인덱스 0에서 인덱스 n으로 이동할 수 있습니다. n은 배열 객체의 길이에서 1을 뺀 길이입니다.
사전 (키 / 값 쌍, 연관 배열이라고도 함)도 반복 가능합니다. 당신은 그들의 열쇠를 통해 단계 수 있습니다.
컬렉션이 아닌 객체는 반복 할 수 없습니다. 예를 들어 bool 객체에는 True 또는 False 값만 있습니다. 반복 할 수 없습니다 (반복 가능한 객체라는 것은 말이되지 않습니다).
iter()
표준 콜렉션 유형 을 호출 하여 작성된 반복자 오브젝트 는 반복 가능하지만 자체는 콜렉션이 아닙니다.
collections.abc.AsyncIterator
테스트__aiter__
및__anext__
방법에 유의하십시오 . 이것은 3.6의 새로운 추가 기능입니다.