파이썬 커스텀 반복자
이 기사에서는 반복자가 무엇인지, __iter__
및 __next__
라는 클래스 메서드를 사용하여 사용자 정의 반복자를 만드는 방법을 배웁니다. 또한 Python에서 생성기의 도움을 받아 사용자 지정 반복자를 만드는 방법도 배웁니다.
Python의 클래스 메서드 __iter__
및 __next__
를 사용하여 사용자 정의 반복자 만들기
이제 반복자라고 하면 이름에서 알 수 있듯이 반복에 사용됩니다.
C, C++ 및 Java와 같은 언어를 사용하는 경우 ++
라는 공통 개념이 있습니다. 반복에 대해 이야기할 때 또 하나의 개념이 알려져 있습니다. 바로 for
루프입니다.
5개의 요소 목록이 있다고 가정해 보겠습니다. 루프를 사용하여 첫 번째 요소에서 마지막 요소까지 반복할 수 있습니다.
이렇게 하면 일부 값이 있는 목록이 있고 인덱스 번호를 사용하여 하나씩 인쇄하려는 경우입니다.
인덱스 0을 전달하면 첫 번째 요소인 2가 제공됩니다. 인덱스 값 1을 사용하면 두 번째 요소인 5가 제공됩니다.
Numbers = [2, 5, 10, 3, 1]
print(Numbers[0])
print(Numbers[1])
출력:
2
5
값을 인쇄하는 다른 방법은 루프를 사용하는 것입니다. 목록을 반복하고 모든 값을 인쇄할 수 있습니다.
Numbers = [2, 5, 10, 3, 1]
for i in Numbers:
print(i)
출력:
2
5
10
3
1
이제 한 가지 방법이 더 있습니다. 반복자를 사용하는 것입니다. 일반적으로 반복자는 for
루프 뒤에서 작동합니다.
반복자를 이해하기 위해 iter()
함수를 사용하여 목록을 반복자로 변환합니다. 이 반복자는 모든 값을 제공하지 않습니다. 한 번에 하나의 값만 제공합니다.
Numbers = [2, 5, 10, 3, 1]
ITR = iter(Numbers)
print(ITR)
iterator의 객체를 출력하는 것을 볼 수 있습니다.
<list_iterator object at 0x000001FEDCFF7310>
그러나 값을 원하면 내장 메소드인 ITR.__next__()
를 설정할 수 있습니다. 특정 객체에서 __next__()
메서드를 처음 호출하는 동안 첫 번째 값을 제공합니다. 인덱스 값을 사용한 것과 같은 방식이지만 인덱스 값을 사용하지 않아도 된다는 장점이 있습니다.
umbers = [2, 5, 10, 3, 1]
ITR = iter(Numbers)
print(ITR.__next__())
출력:
2
다음 실행 라인에서 ITR.__next__()
를 실행할 때 다음 값을 제공합니다. 이 장면 뒤에서 반복자는 여러 값을 가지므로 __next__()
메서드를 호출하면 하나의 값을 선택합니다.
그리고 다시 __next__()
를 호출하면 i
의 마지막 값을 알고 있으므로 마지막 값의 상태를 보존합니다. 이것이 반복자의 아름다움입니다. 함수를 다시 호출하면 이전 값이 유지됩니다.
클래스를 사용하여 반복자를 만들 수 있습니다. 클래스를 사용하여 상위 10개 값을 개별적으로 인쇄할 수 있습니다.
이를 달성하기 위해 TopValues
라는 클래스를 만들고 이 클래스에서 카운터를 지정합니다.
이를 위해 __init__
함수를 사용하여 카운터 변수 self.N=1
을 정의합니다. 분명히 카운터는 1부터 초기화될 것입니다. 사용자 정의 반복자를 생성하려면 두 가지 중요한 방법이 필요합니다.
첫 번째는 반복자의 객체를 제공하는 iter()
메서드이고 next()
메서드는 다음 값 또는 객체를 제공합니다. __next__
메서드에서 self.N
을 반환하는 대신 VALUE
라는 변수를 사용하여 self.N
을 할당하고 다음 줄에서 self.N
을 1로 증가시킵니다. .
따라서 다음 각 반복에서 증가하고 self.N
이 다음 반복에 대해 증가하기 때문에 self.N
이 아닌 VALUE
를 반환합니다.
class TopValues:
def __init__(self):
self.N = 1
def __iter__(self):
return self
def __next__(self):
VALUE = self.N
self.N += 1
return VALUE
반복자는 이제 TopValues
클래스의 개체를 만들 수 있도록 준비되었습니다. 일반적으로 반복자가 있으면 루프를 사용할 수 있으므로 루프를 사용합시다.
T_Val = TopValues()
for i in T_Val:
print(i)
이제 이 코드를 실행하면 수천 개의 값을 얻습니다.
1
2
3
4
5
....
1000
무슨 일이 일어나고 있는지 이해하려고 노력합시다. 반복자가 작동하는지 확인하려면 __next__()
를 사용합니다.
print(T_Val.__next__())
이 줄은 첫 번째 반복 값인 1
을 인쇄하지만 루프에 어떤 문제가 있습니까? 문제는 루프가 처음부터 끝까지 진행된다는 것입니다. 끝이 10이라고 가정했지만 어디에서 멈춰야 하는지 언급하지 않았습니다.
루프를 사용하면 작동 방식인 next()
함수를 호출합니다. for
루프는 내부적으로 next()
함수를 사용합니다. 따라서 이 next()
함수를 반복해서 호출합니다.
__next__
메소드 내부에 조건을 적용해야 합니다.
또한 else
블록을 설정해야 합니다. 이 블록 내에서 예외를 발생시킵니다. 그렇지 않으면 10개의 값을 인쇄한 후 루프가 None
값을 인쇄합니다.
class TopValues:
def __init__(self):
self.N = 1
def __iter__(self):
return self
def __next__(self):
if self.N <= 10:
VALUE = self.N
self.N += 1
return VALUE
else:
raise StopIteration
T_Val = TopValues()
for i in T_Val:
print(i)
출력:
1
2
3
4
5
6
7
8
9
10
Python에서 생성기의 도움으로 사용자 정의 반복자 만들기
이제 같은 일을 하는 제너레이터 함수를 만들어 봅시다. 생성기는 __iter__()
및 __next__()
메서드를 처리하므로 훨씬 간단합니다.
Our_Gen()
이라는 생성기 함수를 작성하려고 하면 이 함수 내부에 매개변수를 전달합니다.
우리는 목록을 반복하고 있기 때문에 한 번에 하나의 항목을 생성합니다. 그리고 반복할 항목이 더 이상 없으면 자동으로 이를 처리하고 반복 중지에 대한 예외를 발생시킵니다.
이제 우리는 Our_Gen()
함수를 반복하고 있으므로 한 번에 하나의 항목을 출력해야 합니다. 실행하면 한 번에 하나씩 얻는 것을 볼 수 있습니다.
def Our_Gen(n_list):
for i in n_list:
yield i
Func = Our_Gen([2, 5, 10, 3, 1])
for i in Func:
print(i)
출력:
2
5
10
3
1
next()
함수가 여전히 작동하는지 확인하기 위해. 실행 후 5개의 요소를 얻습니다. 반복 중지 예외가 발생합니다.
def Our_Gen(n_list):
for i in n_list:
yield i
Func = Our_Gen([2, 5, 10, 3, 1])
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
print(Func.__next__())
출력:
2
5
10
3
1
Traceback (most recent call last):
File "c:\Users\Dell\Desktop\demo\demo.py", line 56, in <module>
print(Func.__next__())
StopIteration
생성기는 클래스보다 작성하기 쉽습니다. 그러나 사용 사례에 따라 클래스에서 __iter__()
메서드 및 __next__()
메서드를 수행하는 방법을 알아야 할 수도 있습니다.
여기에서 사용자 지정 반복자를 만드는 방법에 대해 자세히 알아볼 수 있습니다.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn