반복자는 Python에서 중요한 역할을 합니다. 이를 통해 반복할 수 있는 개체를 만들 수 있습니다. for in 루프를 통해 액세스할 수 있는 데이터를 저장하는 좋은 방법입니다.
반복자의 문제는 하나를 만드는 데 많은 작업이 필요하다는 것입니다. 그것들은 유용하지만 하나의 작업을 수행하려면 많은 코드를 작성해야 합니다. 생성기는 이 문제를 해결하는 데 도움이 됩니다.
이 가이드에서는 Python 생성기가 무엇이고 왜 사용해야 하는지에 대해 이야기할 것입니다. 또한 작동 방식을 이해하는 데 도움이 되도록 Python으로 생성기를 구현합니다.
더 이상 고민하지 말고 시작하겠습니다!
제너레이터란 무엇입니까?
제너레이터는 파이썬에서 반복자를 만드는 간단한 방법입니다. 반복할 수 있는 객체를 반환하는 함수입니다.
생성기는 종종 구문 설탕이라고 합니다. 파이썬에 새로운 기능을 반드시 추가할 필요는 없기 때문입니다. 코드를 보다 효율적으로 만드는 데 도움이 됩니다.
반복자와 마찬가지로 생성자를 한 번만 반복할 수 있습니다. 이는 생성기가 반복된 횟수를 추적하고 재설정할 수 없기 때문입니다.
Python iterator를 살펴보겠습니다.
참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.
부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.
class Cookies: def __init__(self, value): self.value = value def __iter__(self): return self def __next__(self): return self.value
이 코드는 쿠키라는 반복자를 만듭니다. 이 반복자를 통해 데이터를 전달하면 반복 가능한 객체로 바뀝니다. 이것은 for in 루프를 사용하여 데이터를 반복할 수 있음을 의미합니다. 이 코드를 보고 정말 길다고 생각한다면, 그 때문입니다.
Generator는 이 코드를 줄이는 데 도움이 될 수 있습니다. 위의 반복자를 위한 생성기를 작성해 보겠습니다.
def cookies(value): while True: yield value
코드의 크기가 크게 줄었습니다. 이것이 어떻게 작동하는지 논의합시다.
제너레이터는 return 문 대신 yield 키워드가 있는 함수입니다. yield 문은 함수에서 값을 반환합니다.
yield 문과 return 문의 차이점은 return 문은 함수 실행을 중지하는 반면 yield 문은 함수를 일시 중지하고 반복을 계속한다는 것입니다.
간단한 생성기 함수를 반복해 보겠습니다.
for cookie in cookies("Raspberry"): print(cookie)
코드는 다음을 반환합니다.
라즈베리
라즈베리
…
이 코드는 프로그램을 중지할 때까지 계속 반복됩니다. while
를 사용했기 때문입니다. 영원히 실행되는 루프. 이것은 대부분의 경우에 별로 유용하지 않습니다. 작업이 수행되면 중지되는 생성기를 작성해 보겠습니다.
Python 생성기 작성 방법
콘솔에 인쇄할 쿠키 목록이 있습니다. 이 목록은 다음과 같습니다.
[“Raspberry”, “Choc-Chip”, “Cinnamon”, “Oat”]
콘솔에 출력하기 위해 간단한 생성기를 만들 수 있습니다. 새 Python 파일을 열고 다음 코드를 붙여넣습니다.
def print_cookies(cookies): length = len(cookies) for cookie in range(0, length): yield cookies[cookie]
생성기는 우리가 지정한 목록의 모든 쿠키를 살펴보고 각 쿠키를 개별적으로 반환합니다. 이 생성기는 아직 작동하지 않습니다. 반복하려면 for 루프를 사용해야 합니다.
cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"] for c in print_cookies(cookie_list): print(c)
cookie_list
라는 배열을 정의했습니다. 4개의 쿠키 목록을 저장합니다. 그런 다음 생성기를 사용하여 cookie_list
의 값을 반복하는 for 루프를 설정했습니다. .
for 루프의 각 반복에 대해 생성된 객체가 콘솔에 인쇄됩니다.
라즈베리
초코칩
계피
귀리
우리는 해냈다! 이 생성기는 cookie_list
변수의 각 값이 나올 때까지 값을 반환합니다. 반복되었습니다.
생성기에는 다양한 사용 사례가 있습니다. 합산하려는 주문 가격 목록이 있다고 가정해 보겠습니다. 다음 코드를 사용하여 이 작업을 수행할 수 있습니다.
def total_orders(orders): length = len(orders) total = 0 for o in range(0, length): total += orders[o] yield total
이 생성기는 목록에 있는 모든 주문 값의 누계를 유지합니다. 각 항목이 반복된 후 생성기는 주문의 현재 총 가치를 산출합니다. 생성기를 사용하는 for 루프를 작성해 보겠습니다.
order_list = [2.30, 2.50, 1.95, 6.00, 7.50, 2.15] for order in total_orders(order_list): print(order)
코드는 다음을 반환합니다.
2.3
4.8
6.75
12.75
20.25
22.4
생성기는 order_list 변수에 있는 모든 주문의 누적 값을 계산했습니다. 목록을 반복할 때마다 새 누적 값이 반환됩니다.
제너레이터 표현식 작성 방법
제너레이터는 이미 반복자보다 작성하기 쉽습니다. 생성기 표현식 덕분에 더 깨끗한 코드를 작성하려는 우리의 탐구는 멈출 필요가 없습니다.
생성기 표현식은 목록 이해와 유사합니다. 생성기 표현식은 생성기처럼 한 번에 하나의 항목을 생성합니다. 이것은 한 번에 전체 목록을 생성하는 목록 이해와 다릅니다.
쿠키 예제에 대한 생성기를 작성해 보겠습니다.
cookie_list = ["Raspberry", "Choc-Chip", "Cinnamon", "Oat"] cookie_generator = (cookie for cookie in cookie_list)
cookie_list
변수에 쿠키 목록을 정의했습니다. . 그런 다음 생성기 표현식을 만듭니다. 이 표현식은 목록 이해에 대한 구문을 사용하지만 한 가지 큰 차이점이 있습니다. 목록 이해는 대괄호 안에 정의되지만 생성기는 둥근 괄호 안에 정의됩니다.
표현식을 반복하는 for 루프를 만들어 보겠습니다.
for cookie in cookie_generator: print(cookie)
코드는 다음을 반환합니다.
라즈베리
초코칩
계피
귀리
이 생성기의 응답은 첫 번째 예의 응답과 동일합니다. 구문이 훨씬 더 명확해졌습니다.
제너레이터 표현식을 사용하여 선언된 제너레이터를 반복할 때 함수로 호출하지 않는다는 점에 유의하는 것이 중요합니다. cookie_generator
생성기는 입력 값을 허용하지 않습니다. cookie_list
를 반복하는 데 필요한 코드가 이미 포함되어 있습니다. 목록.
간단한 기능을 수행하는 생성기를 작성해야 하는 경우에만 생성기 표현식 구문을 사용해야 합니다. 값 목록을 인쇄하는 것이 좋은 예입니다. 목록의 값에 특정 숫자를 곱하는 것도 좋은 예입니다.
이는 생성기 표현식 구문이 명확하지만 주로 한 줄 표현식용으로 설계되었기 때문입니다. 생성기가 한 줄 이상의 코드를 사용하는 경우 이 기사의 앞부분에서 논의한 구문을 사용하여 생성기 함수로 작성하십시오.
제너레이터를 사용하는 이유는 무엇입니까?
생성기가 사용되는 주된 이유는 반복자보다 더 간결하기 때문입니다.
제너레이터는 함수와 같으며 작동하기 위해 __init__, __iter__ 또는 __next__ 문이 필요하지 않습니다. 이것은 세 가지 명령문이 모두 필요한 반복자와 다릅니다. 이 동작은 반복자를 작성하는 경우보다 훨씬 적은 코드 줄로 생성기를 구현할 수 있음을 의미합니다.
게다가 제너레이터는 메모리를 효율적으로 사용합니다. 생성기는 한 번에 하나의 항목만 생산합니다. 결과를 반환하기 전에 메모리에 전체 시퀀스를 생성하지 않습니다. 따라서 많은 데이터 목록을 반복해야 하는 경우 생성기가 매우 실용적입니다.
이것이 작동하는 방식은 반복자가 지연 평가 방법을 사용한다는 것입니다. 항목이 요청될 때 반복 가능한 개체의 다음 요소만 생성합니다.
결론(및 과제)
Generator를 사용하면 더 Pythonic한 반복자를 만들 수 있습니다.
제너레이터를 사용하면 __init__, __iter__ 또는 __next__ 문을 작성할 필요 없이 반복자 프로토콜을 사용하여 객체를 쉽게 작성할 수 있습니다. 생성기는 함수로 정의됩니다. 그들은 yield 문을 사용하여 생성기를 중지하고 일반 작업으로 돌아가기 전에 기본 프로그램에 값을 다시 전달합니다.
도전을 찾고 있다면 다음과 같은 몇 가지 아이디어가 있습니다.
- 문자열을 뒤집는 생성기를 작성합니다.
- 값 목록에서 특정 단어를 포함하는 값만 반환하는 생성기를 작성합니다.
- 목록의 모든 숫자에 2를 곱하는 생성기를 작성하세요.
자세한 내용은 Python 반복자를 작성하고 사용하는 방법에 대한 자습서를 확인하세요. 이제 전문가처럼 Python에서 생성기로 작업할 준비가 되었습니다!