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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.