Python Language
반복문 및 반복자
수색…
반복자 대 반복자 대 생성기
iterable 은 반복자를 반환 할 수있는 객체입니다. __iter__
메소드가 있고 반복자를 리턴하는 상태의 오브젝트는 반복 가능합니다. 또한 __getitem__
메소드를 구현하는 상태가 없는 객체 일 수도 있습니다. -이 메소드는 인덱스가 0이 아닌 인덱스를 취할 수 있고 인덱스가 더 이상 유효하지 않으면 IndexError
발생시킵니다.
파이썬의 str
클래스는 반복 가능한 __getitem__
의 예제이다.
반복자 (Iterator) 는 어떤 객체에서 next(*object*)
를 호출 할 때 시퀀스의 다음 값을 생성하는 객체입니다. 게다가, __next__
메쏘드를 가진 객체는 반복자입니다. 이터레이터는 이터레이터를 소진 한 후 StopIteration
을 발생 StopIteration
시점에서 다시 사용할 수 없습니다 .
반복 가능한 클래스 :
반복 가능한 클래스는 __iter__
및 __next__
메서드를 정의합니다. 반복 가능한 클래스의 예 :
class MyIterable:
def __iter__(self):
return self
def __next__(self):
#code
#Classic iterable object in older versions of python, __getitem__ is still supported...
class MySequence:
def __getitem__(self, index):
if (condition):
raise IndexError
return (item)
#Can produce a plain `iterator` instance by using iter(MySequence())
collections
모듈에서 추상 클래스를 인스턴스화하여이를 더 잘 보려고합니다.
예:
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__
다음을 수행하여 Python 2의 반복 가능한 클래스에 대한 Python 3 호환성을 처리합니다.
class MyIterable(object): #or collections.Iterator, which I'd recommend....
....
def __iter__(self):
return self
def next(self): #code
__next__ = next
이제이 두 가지 모두 반복자이므로 다음을 통해 반복 할 수 있습니다.
ex1 = MyIterableClass()
ex2 = MySequence()
for (item) in (ex1): #code
for (item) in (ex2): #code
생성자 는 반복자를 만드는 간단한 방법입니다. 생성자 는 반복자이고 반복자는 반복자입니다.
반복 가능할 수있는 것
Iterable 은 항목이 하나씩 전달되는 항목 일 수 있습니다. 내장 된 Python 콜렉션은 반복 가능합니다.
[1, 2, 3] # list, iterate over items
(1, 2, 3) # tuple
{1, 2, 3} # set
{1: 2, 3: 4} # dict, iterate over keys
생성자는 iterables를 반환합니다.
def foo(): # foo isn't iterable yet...
yield 1
res = foo() # ...but res already is
전체 반복 가능 반복
s = {1, 2, 3}
# get every element in s
for a in s:
print a # prints 1, then 2, then 3
# copy into list
l1 = list(s) # l1 = [1, 2, 3]
# use list comprehension
l2 = [a * 2 for a in s if a > 2] # l2 = [6]
iterable의 한 요소 만 확인하십시오.
압축 해제를 사용하여 첫 번째 요소를 추출하고 유일한 요소인지 확인하십시오.
a, = iterable
def foo():
yield 1
a, = foo() # a = 1
nums = [1, 2, 3]
a, = nums # ValueError: too many values to unpack
값을 하나씩 추출
iterable에 대한 iterator 를 얻기 위해 iter()
built-in으로 시작하고 next()
사용하여 StopIteration
이 끝날 때까지 하나씩 요소를 얻는다.
s = {1, 2} # or list or generator or even iterator
i = iter(s) # get iterator
a = next(i) # a = 1
b = next(i) # b = 2
c = next(i) # raises StopIteration
반복자는 재진입 성이 아닙니다!
def gen():
yield 1
iterable = gen()
for a in iterable:
print a
# What was the first item of iterable? No way to get it now.
# Only to get a new iterator
gen()