python 교체 기 일반적인 용법 사례 분석

8472 단어 python교체 기
이 글 의 사례 는 python 교체 기 에서 흔히 볼 수 있 는 용법 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
교체 기
교 체 는 집합 요 소 를 방문 하 는 방식 이다.교체 기 는 옮 겨 다 니 는 위 치 를 기억 할 수 있 는 대상 이다.교체 기 대상 은 모든 요소 가 접근 이 끝 날 때 까지 집합 하 는 첫 번 째 요소 부터 접근 합 니 다.교체 기 는 앞으로 만 후퇴 하지 않 을 수 있다.
1.교체 가능 대상
우 리 는 list,tuple,str 등 유형의 데 이 터 를 for...in..의 순환 문법 으로 그 중에서 차례대로 데 이 터 를 얻어 사용 할 수 있다 는 것 을 알 고 있 습 니 다.우 리 는 이러한 과정 을 옮 겨 다 니 는 것 이 라 고도 부 르 고 교체 라 고도 부 릅 니 다.
그러나 모든 데이터 형식 을 for...in...의 문구 에 넣 고 for...in......................................................................

>>> for i in 100:
...   print(i)
...
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>>
# int    iterable, int         
#          MyList      ,    add         
>>> class MyList(object):
...   def __init__(self):
...       self.container = []
...   def add(self, item):
...       self.container.append(item)
...
>>> mylist = MyList()
>>> mylist.add(1)
>>> mylist.add(2)
>>> mylist.add(3)
>>> for num in mylist:
...   print(num)
...
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'MyList' object is not iterable
>>>
# MyList            

저 희 는 용기 형식 인 MyList 를 사용자 정의 하 였 습 니 다.여러 데 이 터 를 저장 한 MyList 대상 을 for..........................................................
우 리 는 for...in.........................................................................
2.한 대상 이 교체 할 수 있 는 지 여 부 를 어떻게 판단 합 니까?
isinstance()를 사용 하여 대상 이 Iterable 대상 인지 아 닌 지 를 판단 할 수 있 습 니 다.

In [50]: from collections import Iterable
In [51]: isinstance([], Iterable)
Out[51]: True
In [52]: isinstance({}, Iterable)
Out[52]: True
In [53]: isinstance('abc', Iterable)
Out[53]: True
In [54]: isinstance(mylist, Iterable)
Out[54]: False
In [55]: isinstance(100, Iterable)
Out[55]: False

3.교체 대상 의 본질
우 리 는 교체 가능 한 대상 을 교체 하여 사용 하 는 과정 을 분석 한 결과 매번 교체(즉,for...에서 매번 순환)할 때마다 대상 중의 다음 데 이 터 를 되 돌려 주 고 모든 데 이 터 를 교체 한 후에 끝 날 때 까지 데 이 터 를 뒤로 읽 는 것 을 발견 했다.그러면 이 과정 에서 매번 몇 번 째 데 이 터 를 방문 할 때마다 다음 데 이 터 를 되 돌 릴 수 있 도록'사람'이 기록 해 야 한다.우 리 는 데이터 교 체 를 도 울 수 있 는 이'사람'을 교체 기(Iterator)라 고 부른다.
교체 가능 한 대상 의 본질은 바로 우리 에 게 이러한 중간'사람'즉 교체 기 를 제공 하여 우리 가 이 를 반복 해서 사용 하도록 도와 주 는 것 이다.
교체 가능 대상 통과iter__방법 은 우리 에 게 교체 기 를 제공 합 니 다.우 리 는 교체 가능 한 대상 을 교체 할 때 실제 적 으로 이 대상 이 제공 하 는 교체 기 를 먼저 얻 은 다음 에 이 교체 기 를 통 해 대상 중의 모든 데 이 터 를 순서대로 얻 습 니 다.
그럼 하 나 는iter__방법의 대상 은 바로 교체 가능 한 대상 이다.

>>> class MyList(object):
...   def __init__(self):
...       self.container = []
...   def add(self, item):
...       self.container.append(item)
...   def __iter__(self):
...       """       """
...       #                  
...       pass
...
>>> mylist = MyList()
>>> from collections import Iterable
>>> isinstance(mylist, Iterable)
True
>>>
#          __iter__   mylist             

4.iter()함수 와 next()함수
list,tuple 등 은 모두 교체 가능 한 대상 입 니 다.우 리 는 iter()함 수 를 통 해 교체 가능 한 대상 의 교체 기 를 얻 을 수 있 습 니 다.그 다음 에 우 리 는 얻 은 교체 기 에 대해 next()함 수 를 계속 사용 하여 다음 데 이 터 를 얻 을 수 있 습 니 다.iter()함 수 는 사실상 교체 가능 한 대상 을 호출 한iter__방법

>>> li = [11, 22, 33, 44, 55]
>>> li_iter = iter(li)
>>> next(li_iter)
11
>>> next(li_iter)
22
>>> next(li_iter)
33
>>> next(li_iter)
44
>>> next(li_iter)
55
>>> next(li_iter)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration
>>>

마지막 데 이 터 를 교체 한 후에 next()함 수 를 다시 호출 하면 StopIteration 의 이상 을 던 져 서 모든 데이터 가 교체 되 었 음 을 알려 줍 니 다.next()함 수 를 실행 하지 않 아 도 됩 니 다.
5.대상 이 교체 기 인지 아 닌 지 를 어떻게 판단 합 니까?
isinstance()를 사용 하여 대상 이 Iterator 대상 인지 아 닌 지 를 판단 할 수 있 습 니 다.

In [56]: from collections import Iterator
In [57]: isinstance([], Iterator)
Out[57]: False
In [58]: isinstance(iter([]), Iterator)
Out[58]: True
In [59]: isinstance(iter("abc"), Iterator)
Out[59]: True

6.교체 기 Iterator
위의 분석 을 통 해 우 리 는 교체 기 는 매번 교체 가 방문 하 는 위 치 를 기록 하 는 데 도움 을 주 는 것 임 을 알 고 있 습 니 다.교체 기 에 next()함 수 를 사용 할 때 교체 기 는 우리 에 게 기 록 된 위치의 다음 위치 데 이 터 를 되 돌려 줍 니 다.실제로 next()함 수 를 사용 할 때 호출 된 것 은 교체 기 대상 의 이다.next__방법(Python 3 중 대상 의next__방법,Python 2 는 대상 의 next()방법 입 니 다.그래서 우 리 는 교체 기 를 만 들 려 면 그것 의 를 실현 해 야 한다.next__방법그러나 이것 은 아직 부족 합 니 다.python 은 교체 기 자체 도 교체 할 수 있 기 때문에 우 리 는 교체 기 를 위해 을 실현 해 야 합 니 다.iter__방법,그리고iter__방법 은 교체 기 를 되 돌려 야 합 니 다.교체 기 자체 가 바로 교체 기 이기 때문에 교체 기의iter__방법 은 자신 에 게 돌아 가면 된다.
하나 가 이 루어 졌 다iter__방법 과next__방법의 대상 은 바로 교체 기 이다.

class MyList(object):
  """           """
  def __init__(self):
    self.items = []
  def add(self, val):
    self.items.append(val)
  def __iter__(self):
    myiterator = MyIterator(self)
    return myiterator
class MyIterator(object):
  """                    """
  def __init__(self, mylist):
    self.mylist = mylist
    # current            
    self.current = 0
  def __next__(self):
    if self.current < len(self.mylist.items):
      item = self.mylist.items[self.current]
      self.current += 1
      return item
    else:
      raise StopIteration
  def __iter__(self):
    return self
if __name__ == '__main__':
  mylist = MyList()
  mylist.add(1)
  mylist.add(2)
  mylist.add(3)
  mylist.add(4)
  mylist.add(5)
  for num in mylist:
    print(num)

7.for...in...순환 의 본질
for item in Iterable 순환 의 본질은 iter()함 수 를 통 해 교체 가능 한 대상 Iterable 의 교체 기 를 가 져 온 다음 에 가 져 온 교체 기 에 대해 next()방법 을 계속 호출 하여 다음 값 을 가 져 오고 아 이 템 에 할당 하 는 것 입 니 다.StopIteration 의 이상 이 발생 하면 순환 이 끝 납 니 다.
8.교체 기의 응용 장면
교체 기의 가장 핵심 적 인 기능 은 next()함수 호출 을 통 해 다음 데이터 값 을 되 돌려 주 는 것 임 을 발 견 했 습 니 다.만약 에 매번 돌아 오 는 데이터 값 이 기 존의 데이터 집합 에서 읽 는 것 이 아니 라 프로그램 을 통 해 일정한 규칙 에 따라 계산 하여 생 성 된다 면 기 존의 데이터 집합 에 의존 하지 않 아 도 된다 는 것 을 의미한다.즉,교체 할 모든 수 거 를 한꺼번에 캐 시 하여 후속 적 으로 읽 을 수 있 도록 하지 않 아 도 된다 는 것 이다.이렇게 하면 대량의 저장 공간 을 절약 할 수 있다.
예 를 들 어 수학 에서 유명한 피 폴 라 치 수열(Fibonacci)이 있 는데 수열 에서 첫 번 째 수 는 0 이 고 두 번 째 수 는 1 이 며 그 후의 모든 수 는 앞의 두 숫자 에서 더 할 수 있다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
지금 우 리 는 for...in...순환 을 통 해 피 보 나치 수열 의 앞 n 개 수 를 반복 하고 싶 습 니 다.그러면 이 피 보 나치 수열 은 우리 가 교체 기로 실현 할 수 있 고 매번 교체 할 때마다 수학 계산 을 통 해 다음 수 를 생 성 할 수 있다.

class FibIterator(object):
  """         """
  def __init__(self, n):
    """
    :param n: int,         n  
    """
    self.n = n
    # current                  
    self.current = 0
    # num1         ,            0
    self.num1 = 0
    # num2        ,            1
    self.num2 = 1
  def __next__(self):
    """ next()           """
    if self.current < self.n:
      num = self.num1
      self.num1, self.num2 = self.num2, self.num1+self.num2
      self.current += 1
      return num
    else:
      raise StopIteration
  def __iter__(self):
    """    __iter__      """
    return self
if __name__ == '__main__':
  fib = FibIterator(10)
  for num in fib:
    print(num, end=" ")

9.for 순환 만 교체 대상 을 받 을 수 있 는 것 은 아니다.
for 순환 을 제외 하고 교체 가능 한 대상 을 받 을 수 있 고 list,tuple 등 도 받 을 수 있 습 니 다.

li = list(FibIterator(15))
print(li)
tp = tuple(FibIterator(6))
print(tp)

더 많은 파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기