Самым важным отличием является то, что Python yield дает вам итератор, как только он полностью повторяется, все кончено.
Но возврат C # дает вам итератор " factory" , который вы можете передать и использовать в нескольких местах кода, не заботясь о том, был ли он "зациклен" один раз. *
Возьмите этот пример в python:
In [235]: def func1():
.....: for i in xrange(3):
.....: yield i
.....:
In [236]: x1 = func1()
In [237]: for k in x1:
.....: print k
.....:
0
1
2
In [238]: for k in x1:
.....: print k
.....:
In [239]:
А в C #:
class Program
{
static IEnumerable<int> Func1()
{
for (int i = 0; i < 3; i++)
yield return i;
}
static void Main(string[] args)
{
var x1 = Func1();
foreach (int k in x1)
Console.WriteLine(k);
foreach (int k in x1)
Console.WriteLine(k);
}
}
Это дает вам:
0
1
2
0
1
2