문제

의 차이점은 무엇입 반복기 및 발전기?

도움이 되었습니까?

해결책

발전기는 반복자이지만 모든 반복자가 발전기가 아닙니다.

반복자는 일반적으로 a 다음 방법 스트림에서 다음 요소를 얻는 방법. 생성기는 함수에 묶인 반복자입니다.

예를 들어 파이썬의 발전기 :

def genCountingNumbers():
  n = 0
  while True:
    yield n
    n = n + 1

이것은 무한 숫자를 메모리에 저장할 필요가 없다는 이점이 있습니다.

당신은 당신이 반복자로 사용할 것입니다 :

for i in genCountingNumbers():
  print i
  if i > 20: break  # Avoid infinite loop

배열을 반복 할 수도 있습니다.

for i in ['a', 'b', 'c']:
  print i

다른 팁

an 반복자 한 번에 하나씩 컬렉션을 통과합니다.

발전기 한 번에 하나의 항목 인 시퀀스를 생성합니다.

예를 들어 발전기의 결과를 반복 할 수 있습니다 ...

여기에는 너무 많은 파이썬이 있고, 발전기가 무한 반복기를 구현하는 방법. 다음은 C#에 구현 된 내가 언급 한 예 (모든 자연 수의 사각형)입니다. explicitsquares는 반복기 (c#의 ienumerator라고 함)를 명시 적으로 구현합니다. implicitsquares는 생성기를 사용하여 같은 일을합니다. 둘 다 무한 반복자이며 백업 컬렉션이 없습니다. 유일한 차이점은 상태 기계의 철자가 있는지 또는 대안 적으로 발전기가 사용되는지 여부입니다.

using System.Collections;
using System.Collections.Generic;
using System;

class ExplicitSquares : IEnumerable<int>
{
    private class ExplicitSquaresEnumerator : IEnumerator<int>
    {
        private int counter = 0;

        public void Reset()
        {
            counter = 0;
        }

        public int Current { get { return counter * counter; }}

        public bool MoveNext()
        {
            counter++;
            return true;
        }

        object IEnumerator.Current { get { return Current; } }

        public void Dispose(){}
    }

    public IEnumerator<int> GetEnumerator()
    {
        return new ExplicitSquaresEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

class ImplicitSquares : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        int counter = 1;
        while(true)
        {
            int square = counter * counter;
            yield return square;
            counter++;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class AllSquares
{
    private static readonly int MAX = 10;

    public static void Main()
    {
        int i = 0;
        foreach(int square in new ExplicitSquares())
        {
            i++;
            if(i >= MAX)
                break;
            Console.WriteLine(square);
        }

        Console.WriteLine();

        int j = 0;
        foreach(int square in new ImplicitSquares())
        {
            j++;
            if(j >= MAX)
                break;
            Console.WriteLine(square);
        }
    }
}

발전기는 반복자의 구현입니다. 일반적으로 하나가 아닌 발신자에게 여러 값을 생성하는 것은 일상입니다.

C#에서

// yield-example.cs
using System;
using System.Collections;
public class List
{
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
       {
            result = result * number;
            yield return result;
    }
}

static void Main()
{
    // Display powers of 2 up to the exponent 8:
    foreach (int i in Power(2, 8))
    {
        Console.Write("{0} ", i);
    }
}
}

Wikipedia의 항목을 참조하십시오

생성기는 반복자로 작동 할 수있는 특수 함수이며, 값이 호출 될 때마다 값을 반환합니다. 함수이므로 주문시 각 값을 계산할 수 있습니다. 그리고 그것은 특별하기 때문에 마지막으로 호출 된 상태에서 그 상태를 기억할 수 있으므로 결과 코드는 매우 간단 해 보입니다.

예를 들어, 파이썬 의이 생성기는 일련의 정수를 생성합니다.

def integers():
    int n = 0
    while True:
        yield n
        n += 1

이 예에서 중요한 것은 다음과 같습니다 yield n 성명. 함수는 값을 반환하고 다음에 호출되면 해당 시점에서 계속됩니다.

이 링크는 Python의 발전기에 대한 더 긴 설명이 있습니다.링크 텍스트

(JavaScript Useland에서, 그러나 다른 모든 것과 동일)

interator는 an입니다 물체 .next () 함수가 있습니다

발전기는 a입니다 기능, 일단 호출되면 반복자를 생산하면 반복자를위한 공장입니다.

JavaScript에서 Generator 함수는 특수 구문 함수 *() {}와 수율 키워드 사용이 필요합니다.

이것에 대한 MDN을 참조하십시오. https://developer.mozilla.org/en-us/docs/web/javaScript/guide/iterators_and_generators

반복자는 컬렉션의 객체를 반복하는 데 사용됩니다. 배열, 링크 된 목록, 트리, 해시 맵 등. 당신은 많은 물건을 가지고 있으며 각각과 함께 무언가를하고 싶습니다.

발전기는 유한 한 객체 모음에서 항목을 반환하지 않습니다. 대신, 그것은 그들을 즉시 생성합니다. 생성 된 컬렉션을 통해 반복자로 개념화 할 수 있습니다. 당신이 반복하는 동안 유한 한 크기가 없을 수도 있습니다.

예를 들어, 2에서 무한대까지 소수를 뱉어내는 생성기가있을 수 있습니다. "모든 소수"모음을 가질 수있는 방법은 없습니다. 발전기가 필요합니다.

또는 정수를 취하고 한 번에 1 번의 요인을 생성하는 발전기가있을 수 있습니다. 발전기는 모든 요인에 대한 메모리를 사전에 할당하지 않고 요인을 하나씩 검사 할 수 있으므로 여기에 도움이됩니다. 또한 전체 목록을 전면에 생성하지 않고 생성 될 때 사용할 수 있습니다. 이는 원하는 것보다 느릴 수 있습니다. 파이썬의 이러한 발전기의 예는 다음과 같습니다.

def factors(n):
    for i in xrange(1, n+1):
        if n % i == 0:
            yield i

for n in factors(1234567890):
    print n

이것을 실행하면 계산 된대로 인쇄 된 요소를 볼 수 있습니다. 우리는 실제로 메모리의 모든 요소의 전체 목록을 실제로 유지할 필요가 없습니다.

반복자는 일반적으로 항목 모음을 이동하는 데 사용됩니다. 종종 movenext () 및 current () 메소드가 있습니다. Movenext ()는 포인터를 다음 컬렉션 항목 (가능한 경우)으로 전환하고 성공에 따라 True/False를 반환합니다. 현재 ()는 실제 값을 제공합니다.

발전기는 반복자의 구현이지만 기존 컬렉션을 가리키는 대신 각 Movenext () 호출에 새 항목을 만듭니다.

일반적으로 반복기를 걸어 기존 시퀀스(이러한 배열로 또는 목록)및 발전기 계산하는 새로운 값에 따라 모든 요청을 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top