반응형

목차

  1. Iterable
  2. Iterator
  3. Generator
  4. Generator 표현식

Iterable

Iterable은 for 루프를 사용하여 반복할 수 있는 객체입니다. Python에서 리스트, 튜플, 문자열, 딕셔너리 및 세트는 반복 가능 항목의 예입니다. for 루프에서 iterable을 사용하여 요소를 하나씩 반복할 수 있습니다.

다음은 Python에서 iterable을 사용하는 방법에 대한 몇 가지 예입니다.

1. 리스트를 통해 반복

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

 


2. 튜플을 통해 반복

colors = ("red", "green", "blue")
for color in colors:
    print(color)

 


3. 문자열을 통해 루핑(문자별로)

text = "Hello, World!"
for character in text:
    print(character)

 


4. 딕셔너리를 통한 반복(키 사용)

person = {"name": "John", "age": 30, "city": "New York"}
for key in person:
    print(key, person[key])

 


5. 딕셔너리를 통한 반복(키-값 쌍을 얻기 위해 items 메서드 사용)

person = {"name": "John", "age": 30, "city": "New York"}
for key, value in person.items():
    print(key, value)

 


6. 세트를 통한 루핑

unique_numbers = {1, 2, 3, 4, 5}
for number in unique_numbers:
    print(number)

 


이러한 각 예제에서 우리는 iterable의 요소(리스트, 튜플, 문자열, 딕셔너리 또는 집합)를 반복하고 각 요소에서 작업(이 경우 요소 인쇄)을 수행하기 위해 for 루프를 사용합니다.


Iterator

Iterator는 Python에서 iterator 프로토콜을 구현하는 객체이며 __iter__() 및 __next__() 메서드로 구성됩니다. iterator는 항목 모음을 하나씩 반복하는 데 사용되어 각 항목에 대한 작업을 수행할 수 있습니다.

Python에서 iterator를 사용하는 방법은 다음과 같습니다.

1. 리스트, 튜플 또는 문자열과 같은 반복 가능한 객체를 만듭니다.

fruits = ["apple", "banana", "cherry"]


2. iter() 함수를 사용하여 iterable에서 iterator 객체를 만듭니다.

fruit_iterator = iter(fruits)


3. iterator에서 다음 항목을 가져오려면 next() 함수를 사용하십시오.

print(next(fruit_iterator))  # Output: apple
print(next(fruit_iterator))  # Output: banana
print(next(fruit_iterator))  # Output: cherry


4. iterator에 더 이상 항목이 없을 때 next()를 다시 호출하려고 하면 StopIteration 예외가 발생합니다.

print(next(fruit_iterator))  # Raises StopIteration exception

 

 

  • 'for' 루프를 사용하여 iterator의 요소를 반복할 수도 있습니다.
fruits = ["apple", "banana", "cherry"]
fruit_iterator = iter(fruits)

for fruit in fruit_iterator:
    print(fruit)

 


for 루프는 StopIteration 예외를 자동으로 처리하므로 for 루프를 사용할 때 이에 대해 걱정할 필요가 없습니다.

다음은 사용자 정의 iterator 클래스를 사용하는 또 다른 예입니다.

class CountUpTo:
    def __init__(self, limit):
        self.limit = limit

    def __iter__(self):
        self.value = 0
        return self

    def __next__(self):
        if self.value > self.limit:
            raise StopIteration
        self.value += 1
        return self.value

counter = CountUpTo(5)
counter_iterator = iter(counter)

for number in counter_iterator:
    print(number)

 


이 예제에서는 1부터 주어진 한계까지 세는 사용자 정의 iterator 클래스 CountUpTo를 정의합니다. 이 클래스는 iterator 프로토콜을 준수하기 위해 __iter__() 및 __next__() 메서드를 구현합니다. 그런 다음 클래스의 인스턴스를 만들고 iterator를 만들고 for 루프를 사용하여 숫자를 반복합니다.


Generator

Python의 Generator는 클래스가 아닌 함수를 사용하는 특별한 유형의 iterator입니다. Generator를 사용하면 보다 간결하고 메모리 효율적인 방식으로 iterator를 만들 수 있습니다. Generator 함수에는 Generator를 반복할 때 생성할 값을 지정하는 하나 이상의 yield 문이 포함되어 있습니다.

Python에서 Generator를 사용하는 방법은 다음과 같습니다.

1. yield 문을 사용하여 Generator 함수를 정의합니다.

def count_up_to(limit):
    value = 1
    while value <= limit:
        yield value
        value += 1


이 예에서는 1에서 주어진 한계까지 세는 Generator 함수 count_up_to를 정의합니다. 이 함수는 while 루프와 yield 문을 사용하여 숫자를 생성합니다.

2. Generator 함수를 호출하여 Generator 객체를 생성합니다.

counter_generator = count_up_to(5)


3. for 루프를 사용하여 Generator 개체를 반복합니다.

for number in counter_generator:
    print(number)

 


Generator 개체를 반복할 때 Python은 자동으로 Generator 함수를 호출하고 yield 문을 처리하므로 iterator 프로토콜을 수동으로 구현하지 않고도 값을 하나씩 생성할 수 있습니다.


Generator는 대용량 데이터 세트로 작업하거나 계산 비용이 많이 드는 일련의 값을 생성할 때 특히 유용합니다. Generator는 즉시 값을 생성하기 때문에 모든 값을 한 번에 저장하기 위해 리스트나 기타 데이터 구조를 만드는 것과 비교하여 메모리를 절약하고 성능을 향상시킬 수 있습니다.

다음은 Generator를 사용하여 피보나치 수열을 생성하는 또 다른 예입니다.

def fibonacci(limit):
    a, b = 0, 1
    while a <= limit:
        yield a
        a, b = b, a + b

fibonacci_generator = fibonacci(10)

for number in fibonacci_generator:
    print(number)

 


이 예제에서는 주어진 한계까지 피보나치 수열을 생성하는 Generator 함수 'fibonacci'를 정의합니다. 이 함수는 'while' 루프와 'yield' 문을 사용하여 시퀀스의 숫자를 생성합니다. 그런 다음 함수에서 Generator 개체를 만들고 for 루프를 사용하여 반복합니다.


Generator 표현식

Generator 표현식과 Generator 함수는 Python에서 제너레이터를 만드는 두 가지 방법으로, 보다 메모리 효율적인 방식으로 iterator를 만드는 데 사용됩니다. 둘 다 반복하면서 즉시 값을 한 번에 하나씩 생성할 수 있습니다.


1. Generator 함수:

Generator 함수는 하나 이상의 yield 문을 포함하는 일반 Python 함수입니다. 함수가 호출되면 for 루프 또는 next() 함수를 사용하여 반복할 수 있는 제너레이터 객체를 반환합니다.

Generator 함수의 예시는 다음과 같습니다.

def count_up_to(limit):
    value = 1
    while value <= limit:
        yield value
        value += 1

counter_generator = count_up_to(5)

for number in counter_generator:
    print(number)

 


2. Generator 표현식

제너레이터 표현식은 한 줄의 코드를 사용하여 제너레이터를 만드는 보다 간결한 방법입니다. 컴프리헨션을 나열하는 구문과 비슷하지만 대괄호 대신 괄호를 사용합니다.

Generator 표현식의 예시는 다음과 같습니다.

squared_numbers = (x * x for x in range(1, 6))

for number in squared_numbers:
    print(number)


이 예에서는 1에서 5까지 각 숫자의 제곱을 계산하는 Generator 표현식을 만듭니다. 그런 다음 'for' 루프를 사용하여 Generator 표현식을 반복할 수 있습니다.

3. 차이점
제너레이터 함수는 여러 줄의 코드를 포함하고 여러 값을 'yield'하고 루프 및 조건문과 같은 제어 구조를 사용할 수 있으므로 제너레이터 표현식보다 더 유연합니다.
제너레이터 표현식은 간단한 사용 사례에 대해 더 간결하고 읽기 쉽지만 제너레이터 함수에 비해 기능이 제한적입니다.

Generator 함수와 Generator 표현식은 모두 대규모 데이터 세트로 작업하거나 계산 비용이 많이 드는 일련의 값을 생성할 때 유용합니다. 모든 값을 한 번에 저장하기 위해 리스트 또는 기타 데이터 구조를 만드는 것과 비교하여 메모리를 절약하고 성능을 향상시킬 수 있습니다.

반응형

'Python > Python 기본' 카테고리의 다른 글

[Python] 스택(stack)과 힙(heap)  (0) 2023.04.30
[Python] key 매개 변수, 콜백 함수  (0) 2023.04.30
[Python] 텍스트 파일 처리  (0) 2023.04.30
[Python] 람다(Lambda)란?  (0) 2023.04.30
[Python] 파이썬 튜플(tuple)이란?  (2) 2023.04.30