반응형

반복자 (Iterators)

 

Python의 반복자는 next() 함수를 사용하여 하나씩 반복할 수 있는 항목 모음입니다. 컬렉션을 반복자로 변환하려면 컬렉션을 iter() 함수에 전달해야 합니다. 다음으로, 반복자 객체를 next() 함수에 전달하여 반복자의 모든 항목을 반복할 수 있습니다. 다음 스크립트는 4개 항목이 있는 색상 목록에 대한 반복기를 만들고 4개 항목 모두를 반복합니다.

 

colors = ["Red", "Green", "Blue", "Orange"]

 

my_iterator = iter(colors)

 

print(next(my_iterator))  # 번째 item = “Red”

print(next(my_iterator))  # 번째 item = “Green”

print(next(my_iterator))  # 번째 item = “Blue”

print(next(my_iterator))  # 번째 item = “Orange”

 

Output:

Red

Green

Blue

Orange

 

생성기 (Generator)

 

생성기는 반복자의 일종으로 아이템을 하나씩 반환합니다. 생성기를 사용하면 함수 호출마다 업데이트 된 값을 갖는 함수 내부에 변수를 생성할 수 있습니다.  여러 개의 데이터를 미리 만들어 놓지 않고 필요할 때마다 즉석해서 하나씩 만들어 내는 객체를 의미합니다.

 

생성기는 항목별로 대용량 파일을 읽는 데 주로 사용됩니다. 예를 들어, 메모리에 맞지 않는 거대한 CSV 파일이 있는 경우 생성기를 사용하여 파일을 한 줄씩 읽고 가져온 레코드에 일부 프로세스를 적용한 다음 다음 줄을 읽을 수 있습니다.

 

생성기는 일반 함수 정의처럼 def 키워드를 사용합니다. 그러나 생성기 내부에서 함수 호출과 함께 업데이트 된 값을 저장할 변수를 저장하려면 yield 키워드를 사용해야 합니다. yield 변수의 값은 next()함수를 호출하여 반환할 수 있습니다.

 

다음 스크립트는 일반 함수로 method()를 정의하고 리스트 변수에 값을 담고 반환하였습니다.

 

def method():

  result = ['P', 'Q', 'R']

  return result

 

method()

 

Output:

['P', 'Q', 'R']

 

다음 스크립트는 method() 생성기를 정의하고 함수 내에서 3번의 yield 키워드를 사용하여 변수를 생성하였습니다.

 

def method():

  yield 'P'

  yield 'Q'

  yield 'R'

 

method()

 

Output:

<generator object method at 0x7fabec7b6f50>

 

다음 스크립트는 생성기에서 생성한 값을 하나씩 출력하는 예제입니다. next()함수를 한번 호출할 때마다 하나의 값이 출력됩니다.

def method():

  yield 'P'

  yield 'Q'

  yield 'R'

 

result = method()

print(next(result))

print(next(result))

print(next(result))

 

다음 스크립트는 하나의 매개변수를 허용하는 get_evens() 생성기를 생성합니다. 메서드 내에서 변수 x의 값은 0으로 초기화됩니다. x num 매개변수보다 작으면 x 값이 생성된 다음 업데이트됩니다.

 

def get_num(num):

  x = 0

  while x < num:

    yield x

    x = x + 2

 

nums = get_num(10)

print(next(nums))

print(next(nums))

print(next(nums))

print(next(nums))

print(next(nums))

 

Output:

0

2

4

6

8

 

다음 스크립트는 엄청난 크기의 리스트를 생성하는 구문입니다. 이 구문을 실행하면 메모리 오류가 발생할 것입니다.

 

a = [i*i for i in range(100000000000000000)]

print(a[0])

 

다음 스크립트는 엄청난 범위의 값을 생성기로 출력한 예제입니다. 생성기는 엄청난 범위를 갖더라도 하나씩 생성하므로 메모리 오류가 발생하지 않습니다.

 

a = (i*i for i in range(100000000000000000))

print(next(a))

반응형

+ Recent posts