سؤال

ما هو الفرق بين مكرر ومولد؟

هل كانت مفيدة؟

المحلول

والمولدات هي التكرارات، ولكن ليس كل المكررات والمولدات الكهربائية.

ومكرر عادة ما يحتوي على المقبل طريقة للحصول على العنصر التالي من تيار. مولد هو مكرر التي ترتبط إلى وظيفة.

وعلى سبيل المثال مولد في بيثون:

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

نصائح أخرى

مكرر يخترق مجموعة واحدة في وقت واحد.

مولد يولد سلسلة، عنصر واحد في وقت واحد.

هل يمكن على سبيل المثال، أعاد على نتيجة مولد ...

وهناك الكثير من بيثون هنا، والكثير من الناس يقولون المولدات هي السبيل <م> فقط لتنفيذ مكرر لانهائي. وإليك المثال ذكرت (مربعات كافة الأعداد الطبيعية) نفذت في C #. ExplicitSquares تنفذ بشكل واضح مكرر (وتسمى IEnumerator في C #). يستخدم 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);
        }
    }
}

ومولد هو تنفيذ مكرر. ومن عادة روتينية يمكن أن ينتج قيم متعددة إلى المتصل به بدلا من واحدة فقط.

في ج #

// 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);
    }
}
}

انظر يكيبيديا دخول

وهناك مولد هي وظيفة الخاصة التي يمكن أن تتصرف باعتبارها مكرر، إرجاع قيمة في كل مرة يتم استدعاؤه. لأنها هي وظيفة، فإنه يمكن حساب كل قيمة عند الطلب. ولأنه هو خاص، ويمكن ان تذكر حالته من آخر مرة كان يطلق عليه، لذلك يبدو الرمز الناتج بسيط جدا.

وعلى سبيل المثال، هذه المولدات في بيثون سوف تنتج سلسلة من الأعداد الصحيحة

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

والشيء المهم في هذا المثال هو البيان yield n. سوف الدالة بإرجاع قيمة، وفي المرة القادمة ويسمى ذلك، فإنه سيستمر من تلك النقطة.

وهذا المحور شرح أطول من المولدات في بيثون: ربط النص

و(من useland جافا سكريبت، ولكن نفس كل الآخرين)

وهناك interator هو الكائن أن لديه وظيفة .next ()

ومولد هي وظيفة <م> ، يحتج مرة واحدة، وإنتاج مكرر، انها مصنع للمكرر.

في جافا سكريبت، وظيفة مولد تتطلب وظيفة بناء جملة خاص * () {} واستخدام لكلمة رئيسية العائد

وانظر MDN على هذا: الشبكي: //developer.mozilla كافيه / EN-US / مستندات / الانترنت / جافا سكريبت / دليل / Iterators_and_Generators

ويتم استخدام مكرر إلى تكرار عبر الكائنات في مجموعة، يكون ذلك صفيف، خريطة التجزئة قائمة مرتبطة، شجرة،، أيا كان. كنت قد حصلت على مجموعة من الأشياء وأنت تريد أن تفعل شيئا مع كل واحد منهم.

ومولد لا مجرد إرجاع العناصر من بعض مجموعة محدودة من الكائنات. بدلا من ذلك، فإنه يولد لهم على الطاير. هل يمكن تصور على أنها مكرر أكثر من المجموعة التي تم إنشاؤها <م> بينما كنت بالتكرار أكثر من ذلك و قد لا يكون حجم محدود.

وعلى سبيل المثال، يمكن أن يكون لديك مولد أن يبصق الأعداد الأولية من 2 إلى ما لا نهاية. ليس هناك طريقة يمكن أن يكون لديك مجموعة من "كل الأعداد الأولية" وتكرار أكثر من ذلك مع مكرر. كنت في حاجة الى المولدات.

وأو هل يمكن أن يكون مولد أن يأخذ عددا صحيحا وينتج عوامل هذا العدد في وقت واحد. ومن شأن مولد ينفعك هنا كما يمكن دراسة العوامل واحدا تلو الآخر دون تخصيص الذاكرة لجميع العوامل مقدما. كما يسمح لك لاستخدامها كما أنها ولدت بدلا من الاضطرار إلى إنشاء قائمة بأكملها في خط الهجوم، والتي قد تكون أبطأ من تريد. وإليك مثال على هذه المولدات في بيثون:

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

for n in factors(1234567890):
    print n

إذا قمت بتشغيل هذا ترون العوامل المطبوعة كما يتم حسابها. نحن لسنا بحاجة للحفاظ على الواقع قائمة كاملة لجميع العوامل في الذاكرة.

ويتم استخدام مكرر عادة لنقل من خلال مجموعة من العناصر. في كثير من الأحيان وجود MOVENEXT () وطرق الحالي (). MOVENEXT () سيتحول المؤشر إلى البند جمع التالي (إن أمكن) والعودة صح / خطأ بناء على النجاح. تيار () من شأنها أن توفر قيمة حقيقية.

ومولد هو تنفيذ مكرر، ولكن بدلا من الإشارة إلى مجموعة موجودة من قبل، فإنه يخلق عناصر جديدة على كل مكالمة MOVENEXT ().

والمكررات عادة المشي على تسلسل القائمة (مثل مجموعة أو قائمة) والمولدات حساب قيمة جديدة على كل طلب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top