Каково различие между Итератором и Генератором?

Если вы хотите использовать для UITableView заголовок, вместо этого вы можете создать другую ячейку прототипа в Интерфейсном Разработчике, создать собственный класс на основе UITableViewCell и назначить его ячейке прототипа в конструкторе интерфейсов в Инспекторе классов.

Тогда в вашем контроллере вы будете использовать

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?

В этой функции вы на самом деле собираетесь создать повторно используемую ячейку из своего табличного представления, но приведете к пользовательской ячейке, которую вы сделали. для заголовка. У вас будет доступ ко всем его свойствам, например к обычному UITableViewCell, а затем вы просто вернете представление ячейки

return cell.contentView

Еще один метод, который вы собираетесь использовать, -

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 61.0
}

Этот человек говорит сам за себя.

Swift 3.0.1

public override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 61.0
}
31
задан mudge 20 June 2009 в 21:13
поделиться

8 ответов

Генераторы являются итераторами, но не все итераторы являются генераторами.

Итератор обычно имеет метод next для получения следующего элемента из потока. Генератор - это итератор, привязанный к функции.

Например, генератор на python:

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
34
ответ дан 27 November 2019 в 21:36
поделиться

Итератор просматривает коллекцию по одному.

38
ответ дан 27 November 2019 в 21:36
поделиться

Здесь слишком много Python, и слишком много людей говорят, что генераторы - это единственный способ реализовать бесконечный итератор. Вот пример, который я упомянул (квадраты всех натуральных чисел), реализованный на 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);
        }
    }
}
7
ответ дан 27 November 2019 в 21:36
поделиться

Генератор - это реализация итератора. Обычно это подпрограмма, которая выдает несколько значений вызывающей стороне, а не только одно.

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

См. Запись в Википедии

5
ответ дан 27 November 2019 в 21:36
поделиться

Итератор используется для перебора объектов в коллекции, будь то массив, связанный список, дерево, хеш-карта и т. Д. У вас есть набор объектов, и вы хотите что-то сделать с каждым из них.

Генератор не просто возвращает элементы из некоторой конечной коллекции объектов. Вместо этого он генерирует их на лету. Вы можете представить его как итератор над коллекцией, которая создается во время итерации по ней и может не иметь конечного размера.

Например, у вас может быть генератор, который выдает простые числа из 2 до бесконечности. Невозможно получить набор «всех простых чисел» и перебирать его с помощью итератора. Вам нужен генератор.

Или у вас может быть генератор, который принимает целое число и выдает множители этого числа по одному. Здесь вам пригодится генератор, так как вы сможете исследовать факторы один за другим, не выделяя заранее память для всех факторов. Это также позволит вам использовать их по мере их создания, вместо того, чтобы создавать весь список заранее, что может быть медленнее, чем вам хотелось бы. Вот пример такого генератора в Python:

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

for n in factors(1234567890):
    print n

Если вы запустите его, вы можете увидеть коэффициенты, напечатанные по мере их вычисления. На самом деле нам не нужно хранить в памяти полный список всех факторов.

Это также позволит вам использовать их по мере их создания, вместо того, чтобы создавать весь список заранее, что может быть медленнее, чем вам хотелось бы. Вот пример такого генератора в Python:

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

for n in factors(1234567890):
    print n

Если вы запустите его, вы можете увидеть коэффициенты, напечатанные по мере их вычисления. На самом деле нам не нужно хранить в памяти полный список всех факторов.

Это также позволит вам использовать их по мере их создания, вместо того, чтобы создавать весь список заранее, что может быть медленнее, чем вам хотелось бы. Вот пример такого генератора в Python:

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

for n in factors(1234567890):
    print n

Если вы запустите его, вы можете увидеть коэффициенты, напечатанные по мере их вычисления. На самом деле нам не нужно хранить в памяти полный список всех факторов.

1
ответ дан 27 November 2019 в 21:36
поделиться

Генератор - это специальная функция, которая может действовать как итератор, возвращая значение при каждом вызове. Поскольку это функция, она может вычислять каждое значение по запросу. И поскольку он особенный, он может запомнить свое состояние с момента последнего вызова, поэтому результирующий код выглядит довольно простым.

Например, этот генератор на Python будет генерировать последовательность целых чисел

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

Важная вещь в этот пример - инструкция yield n . Функция вернет значение, и при следующем вызове она продолжится с этой точки.

Эта ссылка содержит более подробное объяснение генераторов в python: текст ссылки

4
ответ дан 27 November 2019 в 21:36
поделиться

Итератор обычно используется для перемещения по коллекции элементов. Часто используются методы MoveNext () и Current (). MoveNext () переместит указатель на следующий элемент коллекции (если возможно) и вернет истину / ложь в зависимости от успеха. Current () предоставит фактическое значение.

Генератор является реализацией итератора, но вместо того, чтобы указывать на уже существующую коллекцию, он создает новые элементы при каждом вызове MoveNext ().

0
ответ дан 27 November 2019 в 21:36
поделиться

Обычно итераторы проходят по существующей последовательности (такой как массив или список), а генераторы вычисляют новое значение при каждом запросе.

0
ответ дан 27 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: