Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬 반복자:가이드

Python Iterator를 만드는 방법:가이드

반복자는 Python의 모든 곳에 있습니다. "iterator"나 "iterable"이라는 단어를 듣지 않고는 기초조차 배우기 어렵습니다.

반복자는 반복할 수 있는 개체입니다. 반복할 수 있는 몇 가지 기본 제공 개체가 있지만 고유한 개체를 정의할 수도 있습니다.

이 가이드에서는 Python 반복자, 작동 방식 및 코드에서 사용하는 방법에 대해 설명합니다. 핵심 기능에 대해 배울 수 있도록 자체 반복자를 생성할 것입니다. 이 가이드의 코드는 Python 3.x 설치와 호환됩니다.

시작하겠습니다!

반복자란 무엇입니까?

반복자는 반복할 수 있는 개체입니다. 반복자는 해당 개체에서 한 번에 한 항목씩 데이터를 반환합니다.

for 루프를 통해 개체를 실행하여 개체가 반복 가능한지 여부를 확인할 수 있습니다. 객체를 반복할 수 있다면 반복 가능하다는 의미입니다. 문자열, 목록, 튜플 및 사전은 반복 가능한 객체인 내장 데이터 유형의 예입니다.

Python의 iterator 객체에는 두 가지 메서드가 있어야 합니다.

  • __iter__() :이를 통해 반복자를 검색할 수 있습니다.
  • __next__() :이를 통해 반복자에서 다음 값을 얻을 수 있습니다.

__ 밑줄은 특수 기능을 나타내기 때문에 반복자에서 사용됩니다. 반복자를 정의하려면 이 두 가지 특수 함수를 사용해야 합니다. 함께 반복자 프로토콜이라고 합니다. 이러한 방법은 일반적으로 "iter 및 다음 방법"으로 발음됩니다.

참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.

부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.

무한 반복자를 만드는 방법

우리는 기초부터 시작할 것입니다:무한 반복기 만들기. 이것은 가장 단순한 유형의 반복자입니다. 너무 간단해서 영원히 계속됩니다. 이 문제는 튜토리얼의 뒷부분에서 수정하겠습니다.

Iterator 클래스가 될 Cakes라는 클래스를 정의하는 것으로 시작하겠습니다.

class Cakes:
	def __init__(self, value):
		self.value = value

__init__을(를) 선언했습니다. 클래스의 객체가 인스턴스화되자마자 실행될 메소드. __init__ 메소드를 생성자라고 합니다. 이 예에서 __init__ 메소드는 하나의 값을 가질 수 있습니다:value.

다음으로 반복자 프로토콜을 만들 것입니다.

def __iter__(self):
	return self

def __next__(self):
	return self.value

__iter__ 메소드는 iterator 객체를 검색하는 데 사용됩니다. __next__ 메소드를 사용하면 우리가 지정한 반복 가능한 객체에서 다음 값을 검색할 수 있습니다.

지금까지 코드가 작동하는지 확인합시다. 우리는 다음과 같이 우리 클래스의 객체를 정의함으로써 그렇게 할 것입니다:

cake = Cakes(["Vanilla Sponge"])

여태까지는 그런대로 잘됐다! 왜 이 코드는 아무 것도 하지 않는 걸까? 우리 클래스는 반복자 함수만 반환하기 때문입니다.

작동하는지 확인하기 위해 반복자를 반복해야 합니다. for-in 루프를 사용하여 그렇게 할 수 있습니다.

for c in cake:
	print(c)

코드 반환:

Vanilla Sponge
Vanilla Sponge
…

바닐라 스펀지의 저주! 콘솔에 계속 출력됩니다. 무슨 일이야? 우리는 방금 첫 번째 반복자를 만들었습니다. 매우 간단하지만 작동합니다.

Python에서 for-in 루프를 사용하여 반복자 테스트

반복자를 유용하게 만들기 전에 for-in 루프의 개념을 수정하는 시간을 갖도록 하겠습니다. 마지막 예에서 우리는 코드를 테스트하기 위해 for-in 루프를 작성했습니다.

for c in cake:
	print(c)

for-in 루프가 작동하는 방식은 먼저 __iter__()를 사용하여 객체의 반복자를 생성하는 것입니다. 방법. 그런 다음 for-in 루프는 __next__()를 호출합니다. 값이 반환되지 않을 때까지.

for-in을 생각할 수 있습니다. 간단한 while로 루프 고리. 반복자가 반환할 수 있는 값이 있는 동안 for-in 루프는 해당 값을 반환합니다.

유용한 반복자 만들기

마지막 iterator는 별로 유용하지 않습니다. 같은 값을 계속해서 출력할 뿐입니다. 즉, 여전히 iterator입니다. iterable의 모든 객체를 읽을 수 있습니다.

파이썬 배열을 반복하는 반복자를 만들 것입니다. 이 배열에는 케이크 목록이 포함되어 있습니다.

반복자가 무한 반복되는 것을 막기 위해 우리는 반복자 내부에 얼마나 많은 값이 있는지, 반복자가 실행한 횟수를 추적할 것입니다. 이렇게 하면 iterable의 모든 항목을 통해 iterator가 반복되면 iterator가 실행되는 것을 중지할 수 있습니다.

새 Python 파일을 열고 다음 코드를 붙여넣습니다.

class Cakes:
	def __init__(self, value):
		self.value = value
		self.max = len(value)
		self.count = 0

	def __iter__(self):
		return self

	def __next__(self):
		if self.count < self.max:
			to_return = self.value[self.count]
			self.count += 1
			return to_return
		else:
			raise StopIteration

이 반복자는 마지막 반복자보다 조금 더 복잡합니다. 이것이 우리가 먼저 무한 반복자를 만든 이유입니다. 이 반복자에서 세 가지 값을 초기화했습니다.

  • 값:반복하려는 항목입니다.
  • max:iterable의 항목 수입니다.
  • count:반복자가 실행한 횟수입니다.

__next__()에서 메서드에 "if" 문을 추가했습니다. 이 문은 iterator가 실행된 횟수(count)가 iterable이 반복해야 하는 항목 수(max)보다 작은지 확인합니다.

"count"가 "max"보다 작으면 iterator는 iterable 객체에서 다음 값을 찾습니다. 그런 다음 "count" 변수에 1을 추가하여 반복할 객체가 얼마나 남았는지 추적할 수 있습니다. 그런 다음 계산한 값을 반환합니다.

"count" 변수를 증가시키기 전에 "to_return" 변수에 값을 할당한다는 점에 유의하는 것이 중요합니다. 이렇게 하면 반복자의 현재 반복 값에 액세스할 수 있습니다.

목록의 모든 항목을 반복하면 StopIteration이라는 예외가 발생합니다. 목록의 모든 항목을 반복하면 프로그램이 중지됩니다.

iterator가 작동하는지 봅시다. 메인 프로그램에 다음 코드를 추가하고 실행하십시오:

cake = Cakes(["Vanilla Sponge"])
for c in cake:
	print(c)

코드는 다음을 반환합니다.

Vanilla Sponge

목록에 몇 가지 항목을 더 추가하고 어떤 일이 일어나는지 살펴보겠습니다.

cake = Cakes(["Vanilla Sponge", "Carrot", "Coffee"])
for c in cake:
	print(c)

코드 반환:

Vanilla Sponge
Carrot
Coffee

우리가 해냈어! 케이크 목록을 순환하는 반복자를 성공적으로 만들었습니다. 당신은 여기까지 온 것에 대해 케이크 또는 심지어 컵케이크를 받을 자격이 있습니다.

결론

반복자를 사용하면 반복할 수 있는 개체를 만들 수 있습니다. 반복자는 목록, 문자열 또는 다른 반복 가능한 개체를 반복하고 특정 작업을 수행할 수 있습니다.

도전할 준비가 되었나요? 숫자 목록을 반복하고 각 숫자에 2를 곱한 값을 반환하는 반복자를 만듭니다.

이 반복자의 코드는 위의 예제와 유사합니다. 여전히 반복자 프로토콜을 사용합니다. 그러나 주 프로그램으로 반환되기 전에 목록의 각 숫자에 2를 곱해야 합니다.

이제 전문가처럼 Python으로 자신만의 반복자를 작성할 준비가 되었습니다!