Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Каковы реальные применения yield в реальной жизни?
Я знаю, что делает yield , и я видел несколько примеров, но я не могу думать о реальных приложениях, вы использовали его для решения какой-то конкретной проблемы?
(В идеале какая-то проблема, которая не может быть решена каким-то другим способом)
Я понимаю, что это старый вопрос (пре Джон Скит?) но я сам только недавно задумался над этим вопросом. К сожалению, текущие ответы здесь (на мой взгляд)не упоминают о самом очевидном преимуществе утверждения yield.
Самое большое преимущество оператора yield состоит в том, что он позволяет вам перебирать очень большие списки с гораздо более эффективным использованием памяти, чем при использовании, скажем, стандартного списка.
Например, предположим, что у вас есть запрос базы данных, который возвращает 1 миллион строк. Вы можете извлечь все строки с помощью DataReader и сохранить их в списке, поэтому требуется list_size * row_size байт памяти.
Или вы можете использовать оператор yield для создания итератора и хранить в памяти только одну строку за один раз. По сути, это дает вам возможность предоставить возможность "streaming" для больших наборов данных.
Кроме того, в коде, использующем итератор, вы используете простой цикл foreach и можете решить вырваться из цикла по мере необходимости. Если вы делаете перерыв рано, вы не принудительно извлекаете весь набор данных, когда вам нужны только первые 5 строк (например).
Относительно:
Ideally some problem that cannot be solved some other way
Оператор yield не дает вам ничего, что вы не могли бы сделать с помощью своей собственной реализации пользовательского итератора, но он избавляет вас от необходимости писать часто сложный код, необходимый. Существует очень мало проблем (если таковые имеются), которые не могут быть решены более чем одним способом.
Вот несколько более свежих вопросов и ответов, которые дают более подробную информацию:
Добавленная стоимость ключевого слова Yield?
Полезен ли выход за пределы LINQ?
на самом деле я использую его нетрадиционным способом на моем сайте IdeaPipe
public override IEnumerator<T> GetEnumerator()
{
// goes through the collection and only returns the ones that are visible for the current user
// this is done at this level instead of the display level so that ideas do not bleed through
// on services
foreach (T idea in InternalCollection)
if (idea.IsViewingAuthorized)
yield return idea;
}
поэтому в основном он проверяет, разрешен ли просмотр идеи в данный момент, и если да, то возвращает идею. Если это не так, то его просто пропускают. Это позволяет мне кэшировать идеи, но по-прежнему отображать идеи для пользователей, которые авторизованы. Иначе мне пришлось бы каждый раз вытаскивать их на основе разрешений, когда они только переоцениваются каждые 1 час.
Одно из интересных применений-это механизм асинхронного программирования esp для задач, которые выполняют несколько шагов и требуют одного и того же набора данных на каждом шаге. Двумя примерами этого могут быть Джеффри Рихтерс AysncEnumerator Часть 1 и Часть 2 . Среда выполнения параллелизма и координации (CCR) также использует итераторы CCR этого метода .
Операторы LINQ в Перечисляемом классе реализуются как итераторы, которые создаются с помощью оператора yield. Это позволяет вам связывать операции, такие как Select() и Where(), без фактического перечисления чего-либо, пока вы фактически не используете перечислитель в цикле, как правило, используя оператор foreach. Кроме того, поскольку при вызове функции IEnumerator.MoveNext() вычисляется только одно значение, если вы решите остановить промежуточную сборку, вы сохраните хит производительности вычисления всех результатов.
Итераторы также можно использовать для реализации других видов ленивого вычисления, где выражения вычисляются только тогда, когда это необходимо. Вы также можете использовать yield для более необычные вещи, как сопрограммы.
Можно также использовать yield return для обработки ряда результатов функции в виде списка. Например, рассмотрим компанию, которая платит своим сотрудникам каждые две недели. С помощью этого кода можно получить подмножество дат зарплаты в виде списка:
void Main()
{
var StartDate = DateTime.Parse("01/01/2013");
var EndDate = DateTime.Parse("06/30/2013");
foreach (var d in GetPayrollDates(StartDate, EndDate)) {
Console.WriteLine(d);
}
}
// Calculate payroll dates in the given range.
// Assumes the first date given is a payroll date.
IEnumerable<DateTime> GetPayrollDates(DateTime startDate, DateTime endDate, int daysInPeriod = 14) {
var thisDate = startDate;
while (thisDate < endDate) {
yield return thisDate;
thisDate = thisDate.AddDays(daysInPeriod);
}
}